У меня есть приложение 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));
}
put 'var x = (from o in db.usp_GetUserByName (имя_пользователя) выбрать o) .FirstOrDefault()' что такое x? – Tuco
Привет JAT, который дает ту же ошибку недопустимого литья в строке var x (мне пришлось добавить «return x;» в следующую строку) – gorlaz
Да, поставьте там точку останова и положите в конце отрицательный результат. – Tuco