Следующая строка кода иногда приводит к исключению "Указанное приведение недействительно":
public static object Select(string sql, OleDbTransaction dbt)
{
try
{
OleDbCommand cmd = new OleDbCommand(sql, lib.dbc, dbt);
object obj = cmd.ExecuteScalar(); /* <- this is what fails */
return obj;
}
catch (Exception ex)
{
/* deleted code - error message to the user */
return null;
}
}
Эта функция выполняется в программе несколько раз, прежде чем произойдет сбой. Если происходит сбой только тогда, когда он выполняется в новом потоке выполнения, а затем только иногда. Когда я вызываю часть программы, которая выполняет обработку в потоке, и она вызывает эту функцию, либо она работает все время (=> я нажимаю кнопку, она выполняется, ошибки нет, я нажимаю и выполняю снова и снова.. .), или это никогда не работает (=> я нажимаю кнопку и выполняю, исключение, я нажимаю и снова выполняю, снова исключение...).
lib.dbc -> статическая переменная типа OleDbConnection инициализируется только при запуске программы и очень часто используется в коде, допустима
Я понятия не имею, как его отлаживать дальше, и, прежде всего, какое присваивание переменной типа object может привести к ошибке? ExecuteScalar должен возвращать объект или ноль. Я использую базу данных Jet (MS Access).
В исключении я нахожу эту трассировку стека, может быть, это поможет:
at System.Data.OleDb.OleDbConnection.IOpenRowset()
at System.Data.OleDb.OleDbCommand.ExecuteTableDirect(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
at System.Data.OleDb.OleDbCommand.ExecuteScalar()
at FK.sql.Select(String sql, OleDbTransaction dbt)
ExecuteScalar
возвращает первый столбец первой строки в результирующем наборе или нулевую ссылку, если результирующий набор пуст. - person C.Evenhuis   schedule 15.02.2014