SQLite и `Ссылка на объект не установлена`

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();
10.11.2009 20:25:12
Не могли бы вы добавить строку, где вы определяете command?
Traveling Tech Guy 10.11.2009 20:36:50
Есть ли в SqlLiteCommand.Parameters метод AddWithValue? Есть ли проблема с приведением int к байту?
cjk 11.11.2009 08:48:29
Traveling Tech Guy: Оказывается, я случайно поделился командой между потоками, хотя при отладке данные выглядят корректно.
user34537 11.11.2009 20:48:16
Вместо того, чтобы добавить ссылку на ответ, который разрешает ваш вопрос, примите его. Несмотря на то, что это старый вопрос, Адам это оценит, так же как и другие, ищущие решения.
outis 9.06.2011 03:29:43
2 ОТВЕТА
РЕШЕНИЕ

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

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

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

2
11.11.2009 08:42:15
Я знаю, что это не та линия. Та линия работает, которая доказывает, что соединение все еще хорошо. Выполнение без запроса завершается ошибкой, но те же данные работают, когда я не ломаюсь, что просто странно! У меня есть другие темы для чтения и записи в базу данных. Почему это важно и как это влияет на это?
user34537 10.11.2009 20:41:00

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

0
11.11.2009 20:45:34