Исключение при использовании SQLiteDataReader - PullRequest
1 голос
/ 20 марта 2010

Я делаю Custom SQLite Wrapper. Это предназначено для обеспечения постоянного подключения к базе данных. Тем не менее, я получаю исключение при вызове этой функции дважды.

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()

1 Ответ

5 голосов
/ 20 марта 2010

У вас может быть пользовательская оболочка для управления соединениями, но эта оболочка не должна управлять командами: 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;
}
...