SQLite и `Ссылка на объект не установлена` - PullRequest
0 голосов
/ 10 ноября 2009

edit2: решение SQLite и `Ссылка на объект не установлена` исключение

Мне трудно понять мою ошибку.

edit1: я установил свое определение, чтобы сделать мой код однопоточным. Проблема ушла. Так что это похоже на состояние гонки.

Я получаю ошибку ниже. Но не всегда, я замечаю, что, если я не устанавливаю перерыв или я быстро прохожу их, я не получаю исключения. Если установить точку останова на var o = command.ExecuteScalar(); или строку перед ней и подождать 10+ секунд (я использовал системные часы для проверки, не считая), она ВСЕГДА получит исключение (я пробовал это дважды, однако в зависимости от того, что я заметил, исключение происходит) только когда я перерываю больше, чем на несколько секунд).

Я не понимаю, ПОЧЕМУ я получаю ошибку. Я распечатал и заявление sql, и значения параметров, которые я его кормил, и я вижу его правильные значения. В чем дело!?! и меня беспокоит то, что COUNT (*) работает, а вставка - нет.

Вот мой код

        else
        {
            command.CommandText = "SELECT COUNT(*) FROM link_list;";
            var o = command.ExecuteScalar();
            int status = (int)r.status;
            command.CommandText = "UPDATE link_list SET status=@status WHERE id=@id;";
            command.Parameters.Add("@status", System.Data.DbType.Byte).Value = status;
            command.Parameters.Add("@id", System.Data.DbType.Int32).Value = info.linkId;
            Console.WriteLine("CommandText {0} {1} {2}", command.CommandText, status, info.linkId);
            command.ExecuteNonQuery();
            Console.WriteLine("CommandText no exception");
        }

в других местах

        catch(Exception e)
        {
            Console.WriteLine(e.Message);
            Console.WriteLine(e.StackTrace);

Мой вывод

CommandText UPDATE link_list SET status=@status WHERE id=@id; 5 108
The thread '<No Name>' (0xbc8) has exited with code 0 (0x0).
A first chance exception of type 'System.NullReferenceException' occurred in System.Data.SQLite.dll
Object reference not set to an instance of an object.
   at System.Data.SQLite.SQLiteDataReader.NextResult()
   at System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd, CommandBehavior behave)
   at System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
   at WebDLManager.DB.updateStatus(DLInfo info, ReturnVal r) in C:\dev\source\prvTrunk\WebDLManager\WebDLManager\db.cs:line 134
   at WebDLManager.SiteBase.threadStart() in C:\dev\source\prvTrunk\WebDLManager\WebDLManager\SiteType.cs:line 241
The program '[1360] WebDLManager.vshost.exe: Managed' has exited with code 0 (0x0).

По запросу

        //this is called through form_load
        connection = new SQLiteConnection("Data Source=mydb.sqlite3;Version=3");
        command = new SQLiteCommand(connection);
        connection.Open();

Ответы [ 2 ]

2 голосов
/ 10 ноября 2009

Посмотрите на свой след стека. Первый вызов в сборке SQLite - это вызов System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(), поэтому исключение не происходит в строке, которая говорит var o = command.ExecuteScalar(). Вы уверены, что у вас нет другого запущенного потока, который вызывает SQLiteCommand.ExecuteNonQuery()?

ОБНОВЛЕНИЕ (со ссылкой на комментарий)

Одна из ваших других тем должна вызывать исключение. Вам нужно проверить точное состояние ваших объектов перед этим вызовом, и должно стать ясно, какая ссылка ошибочно установлена ​​на нуль.

0 голосов
/ 11 ноября 2009

Если его многопоточность и команда используются совместно с другими потоками, возникнет проблема. Даже если выходные данные показывают, что sql корректен, все же может быть вероятность того, что два потока одновременно используют одну и ту же SQLiteCommand.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...