我创建了一个用于管理我的DATA类的SQLite命令的类。
课程SQLiteManager
如下所示:
class SQLiteManager : IDisposable
{
protected SQLiteConnection Conn;
protected SQLiteCommand Cmd;
public SQLiteManager(string fullfilename)
{
Conn = new SQLiteConnection(string.Format("Data Source={0}", fullFileName));
Conn.Open();
}
public string Query(string query)
{
//Cmd = new SQLiteCommand(Conn); << obsolete!
Cmd = Conn.CreateCommand();
Cmd.CommandText = query;
return Cmd.ExecuteScalar().ToString();
}
public void Dispose()
{
if (Conn.State == System.Data.ConnectionState.Open)
{
Conn.Close();
Conn.Dispose();
}
GC.SuppressFinalize(this);
}
~SQLiteManager()
{
Conn.Dispose();
}
}
我以这种方式在表单中使用此类:
using (SQLiteManger sqlMgr = new SQLiteManger(fileName))
{
// .... some stuff here
MessageBox.Show(string.format("My first query: {0}", sqlMgr.Query("....query...")); // << this works
MessageBox.Show(string.format("My second query: {0}", sqlMgr.Query("....query...")); // << this doesnt works - NULL REFERENCE EXCEPTION comes out!
}
即使我没有关闭连接而我进入using语句,第二个查询也会给出NullReferenceException
。
调试行为如下:
在第二个查询中,光标进入Query方法,执行方法,但在执行return Cmd.ExecuteScalar().toString();
之前
跳转到Dispose()
方法....所以异常出来了。
我想知道为什么在第二个查询中程序会跳转到Dispose()
,即使我没有要求......
我按照O.R.Mapper的建议删除并更正,ExecuteCommand
问题的答案是:
调试,第二次光标没有到达命令Cmd.ExecuteScalar()
..因为跳转到Dispose()
方法。
解决
问题归因于Cmd.ExecuteScalar().ToString()
方法Query(string query)
。正确的return
声明是:
object value = Cmd.ExecuteScalar();
return value != null ? value.ToString() : null;