2015-02-02 1 views
-2

У меня есть приложение C# ClickOnce, где я получаю «InvalidCastException; Указанное Cast недействительно "при вызове хранимой процедуры в этом коде;DataContext возвращает действительные данные для всех таблиц, кроме одного

 return (from o in db.usp_GetUserByName(userName) 
       select o).FirstOrDefault(); 

в этой секции;

public Database.User GetUserByName(string userName) 
    { 
     Security.InRole(Security.User_View); 

     B.BudgetReporting.Database.BudgetReportingDataContext db = new B.BudgetReporting.Database.BudgetReportingDataContext(Functions.ConnString); 
     return (from o in db.usp_GetUserByName(userName) 
       select o).FirstOrDefault(); 
    } 

Я думаю, что ошибка на самом деле в декларации 'db' в предыдущем разделе; как только приложение находится в режиме отладки, и я нахожусь на «db» и расширяю «плюс», я вижу разные таблицы (поэтому я предполагаю, что он подключается к db в порядке, так что это не вызывает проблемы со ConnString), и я вижу данные во всех таблицах EXCEPT для таблицы «Пользователи».

Когда я разворачиваю раздел «Пользователи» и расширяю «Вид результатов», он говорит: «Расширение представления результатов перечислит IEnumerable» с помощью значка обновления. Я нажимаю значок обновления, и я получаю «base {system.SystemException} | {« Указанный приказ недействителен »}. Поэтому я предполагаю, что это возвращает значение null, которое затем приводит к возврату, чтобы дать ошибку.

Это код, который работал нормально, но теперь нет, и я не уверен, почему и как его отслеживать. Я восстановил db в то же время, что и резервная копия кода, и имеет ту же структуру таблиц пользователей, что и в текущей базе данных.

Любые подсказки, которые очень ценят, поскольку мне нужно получить текущую версию этой версии с новым сертификатом asap.

Стек след:

[External Code] 
B.BudgetReporting.BusinessLogic.dll!B.BudgetReporting.BusinessLogic.Service.GetUserByName(string userName) Line 1663 + 0x7a bytes C# 
M.I.Beta.exe!B.BudgetReporting.Forms.Login.LoginCmd_Click(object sender, System.EventArgs e) Line 78 + 0x33 bytes C# 
[External Code] 
M.I.Beta.exe!B.BudgetReporting.Forms.MainMDI.checkLogin() Line 135 + 0xa bytes C# 
M.I.Beta.exe!B.BudgetReporting.Forms.MainMDI.MainMDI() Line 78 + 0x8 bytes C# 
M.I.Beta.exe!B.BudgetReporting.Program.Main() Line 22 + 0x15 bytes C# 
[External Code] 

(NB: некоторые незначительные редактирования М, I и B для битного запутывания)

EDIT1: GetUserByName является:

[global::System.Data.Linq.Mapping.FunctionAttribute(Name="dbo.usp_GetUserByName")] 
    public ISingleResult<User> usp_GetUserByName([global::System.Data.Linq.Mapping.ParameterAttribute(Name="UserName", DbType="VarChar(255)")] string userName) 
    { 
     IExecuteResult result = this.ExecuteMethodCall(this, ((MethodInfo)(MethodInfo.GetCurrentMethod())), userName); 
     return ((ISingleResult<User>)(result.ReturnValue)); 
    } 
+0

put 'var x = (from o in db.usp_GetUserByName (имя_пользователя) выбрать o) .FirstOrDefault()' что такое x? – Tuco

+0

Привет JAT, который дает ту же ошибку недопустимого литья в строке var x (мне пришлось добавить «return x;» в следующую строку) – gorlaz

+0

Да, поставьте там точку останова и положите в конце отрицательный результат. – Tuco

ответ

0

Выпуска закончился что является проблемой в базе данных, где поле ссылается как int, но на самом деле является строкой, вызывающей проблемы с литой.