2010-03-20 89 views
1

我正在做一個自定義SQLite的包裝。這意味着允許預先連接到數據庫。但是,我在調用此函數兩次時收到一個異常。異常使用SQLiteDataReader

public Boolean DatabaseConnected(string databasePath) 
{ 
    bool exists = false; 
    if (ConnectionOpen()) 
    { 
     this.Command.CommandText = string.Format(DATABASE_QUERY); 
     using (reader = this.Command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       if (string.Compare(reader[FILE_NAME_COL_HEADER].ToString(), databasePath, true) == 0) 
       { 
        exists = true; 
        break; 
       } 
      } 
      reader.Close(); 
     } 
    } 
    return exists; 
} 

我使用上述函數檢查數據庫當前是否在執行命令或試圖打開數據庫之前打開。我第一次執行該函數時,它執行沒有問題。在此之後,reader = this.Command.ExecuteReader()拋出一個異常

Object reference not set to an instance of an object. 
StackTrace: 
    at System.Data.SQLite.SQLiteStatement.Dispose() 
    at System.Data.SQLite.SQLite3.Reset(SQLiteStatement stmt) 
    at System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt) 
    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.ExecuteReader() 
    at EveTraderApi.Database.SQLDatabase.DatabaseConnected(String databasePath) in C:\Documents and Settings\galford13x\My Documents\Visual Studio 2008\Projects\EveTrader\EveTraderApi\Database\Database.cs:line 579 
    at EveTraderApi.Database.SQLDatabase.OpenSQLiteDB(String filename) in C:\Documents and Settings\galford13x\My Documents\Visual Studio 2008\Projects\EveTrader\EveTraderApi\Database\Database.cs:line 119 
    at EveTraderApiExample.Form1.CreateTableDataTypes() in C:\Documents and Settings\galford13x\My Documents\Visual Studio 2008\Projects\EveTrader\EveTraderApiExample\Form1.cs:line 89 
    at EveTraderApiExample.Form1.Button1_ExecuteCommand(Object sender, EventArgs e) in C:\Documents and Settings\galford13x\My Documents\Visual Studio 2008\Projects\EveTrader\EveTraderApiExample\Form1.cs:line 35 
    at System.Windows.Forms.Control.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnClick(EventArgs e) 
    at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) 
    at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) 
    at System.Windows.Forms.Control.WndProc(Message& m) 
    at System.Windows.Forms.ButtonBase.WndProc(Message& m) 
    at System.Windows.Forms.Button.WndProc(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) 
    at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
    at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 
    at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg) 
    at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) 
    at System.Windows.Forms.Application.Run(Form mainForm) 
    at EveTraderApiExample.Program.Main() in C:\Documents and Settings\galford13x\My Documents\Visual Studio 2008\Projects\EveTrader\EveTraderApiExample\Program.cs:line 18 
    at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
    at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ThreadHelper.ThreadStart_Context(Object state) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 

回答

5

你可以有一個定製的包裝來管理連接,但這種包裝不應管理命令:this.Command。由於命令對象存儲在你的包裝器中,它將被重用。問題是,你第一次叫ExeuteReader此命令配置和調用它的第二次你得到的例外。嘗試爲每個查詢創建命令:

public bool DatabaseConnected(string databasePath) 
{ 
    if (ConnectionOpen()) 
    { 
     using (var command = YourSQLiteConnection.CreateCommand()) 
     { 
      command.CommandText = string.Format(DATABASE_QUERY); 
      using (reader = command.ExecuteReader()) 
      { 
       while (reader.Read()) 
       { 
        if (string.Compare(reader[FILE_NAME_COL_HEADER].ToString(), databasePath, true) == 0) 
        { 
         return true; 
        } 
       } 
      } 
     } 
    } 
    return false; 
} 
+0

這工作的感謝! – galford13x 2010-03-20 16:49:33