gpt4 book ai didi

c# - 使用 SQLiteDataReader 的异常

转载 作者:太空宇宙 更新时间:2023-11-03 20:41:26 28 4
gpt4 key购买 nike

我正在制作自定义 SQLite 包装器。这是为了允许与数据库的持久连接。但是,我在两次调用此函数时收到异常。

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

最佳答案

您可以使用自定义包装器来管理连接,但此包装器不应管理命令: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;
}

关于c# - 使用 SQLiteDataReader 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2482275/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com