SQLite命令序列不起作用

时间:2015-07-06 10:38:19

标签: c# sqlite

我创建了一个用于管理我的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;

0 个答案:

没有答案