edit2:解决方案SQLite and `Object reference not set` exception
我很难理解我的错误。
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();
答案 0 :(得分:2)
查看堆栈跟踪。 SQLite程序集中的第一个调用是对System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()
的调用,因此在var o = command.ExecuteScalar()
行上没有发生异常。您确定没有其他正在运行的线程正在调用SQLiteCommand.ExecuteNonQuery()
吗?
更新(参考评论)
其他一个线程必须导致异常。您需要在调用之前检查对象的确切状态,并且应该明确哪个引用被错误地设置为null。
答案 1 :(得分:0)
如果与其他线程共享多线程和命令,则会出现问题。即使输出显示sql正确,仍然可能有两个线程同时使用相同的SQLiteCommand。