我正在从 SQLite* 获得 数据库被锁定的 异常,仅适用于某些查询。 *
下面是我的代码:执行任何select语句时,它都可以正常工作。 当我在JobsTable 上执行任何write语句时,它也可以正常工作。
Jobs
这很好用:
ExecuteNonQuery("DELETE FROM Jobs WHERE id=1");
但是以同样的方式,如果我对Employees表执行查询,则会引发 数据库被锁定 的异常。 这将引发异常:
Employees
ExecuteNonQuery("DELETE FROM Employees WHERE id=1");
以下是我的功能:
public bool OpenConnection() { if (Con == null) { Con = new SQLiteConnection(ConnectionString); } if (Con.State == ConnectionState.Closed) { Con.Open(); //Cmd = new SQLiteCommand("PRAGMA FOREIGN_KEYS=ON", Con); //Cmd.ExecuteNonQuery(); //Cmd.Dispose(); //Cmd=null; return true; } if (IsConnectionBusy()) { Msg.Log(new Exception("Connection busy")); } return false; } public Boolean CloseConnection() { if (Con != null && Con.State == ConnectionState.Open) { if (Cmd != null) Cmd.Dispose(); Cmd = null; Con.Close(); return true; } return false; } public Boolean ExecuteNonQuery(string sql) { if (sql == null) return false; try { if (!OpenConnection()) return false; else { //Tx = Con.BeginTransaction(IsolationLevel.ReadCommitted); Cmd = new SQLiteCommand(sql, Con); Cmd.ExecuteNonQuery(); //Tx.Commit(); return true; } } catch (Exception exception) { //Tx.Rollback(); Msg.Log(exception); return false; } finally { CloseConnection(); } }
这是例外:在第103行: Cmd.ExecuteNonQuery();
Cmd.ExecuteNonQuery();
发现异常:类型:System.Data.SQLite.SQLiteException消息:数据库已锁定数据库已锁定源:System.Data.SQLite Stacktrace:位于System.Data.SQLite.SQLiteDataReader.NextResult()位于System.Data.SQLite.SQLiteDataReader..ctor处System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)(位于System.Data处的SQLiteCommand cmd,CommandBehavior行为)在d:\ Projects \ C#Applications \ Completed Projects \ TimeSheet6 \ TimeSheet6 \ DbOp中的TimeSheet6.DbOp.ExecuteNonQuery(String sql)处的System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()处的.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior行为)。 cs:第103行
发现异常:类型:System.Data.SQLite.SQLiteException消息:数据库已锁定数据库已锁定源:System.Data.SQLite
Stacktrace:位于System.Data.SQLite.SQLiteDataReader.NextResult()位于System.Data.SQLite.SQLiteDataReader..ctor处System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)(位于System.Data处的SQLiteCommand cmd,CommandBehavior行为)在d:\ Projects \ C#Applications \ Completed Projects \ TimeSheet6 \ TimeSheet6 \ DbOp中的TimeSheet6.DbOp.ExecuteNonQuery(String sql)处的System.Data.SQLite.SQLiteCommand.ExecuteNonQuery()处的.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior行为)。 cs:第103行
连接一直保持打开状态。摆脱OpenConnection与CloseConnection和改变ExecuteNonQuery这样的:
OpenConnection
CloseConnection
ExecuteNonQuery
using (SQLiteConnection c = new SQLiteConnection(ConnectionString)) { c.Open(); using (SQLiteCommand cmd = new SQLiteCommand(sql, c)) { cmd.ExecuteNonQuery(); } }
此外,将 读取 数据的方式更改为此:
using (SQLiteConnection c = new SQLiteConnection(ConnectionString)) { c.Open(); using (SQLiteCommand cmd = new SQLiteCommand(sql, c)) { using (SQLiteDataReader rdr = cmd.ExecuteReader()) { ... } } }
不要尝试 像在这里一样自行管理连接池。首先,它比您编写的代码复杂得多,但是其次,它已经在SQLiteConnection对象内部进行了处理。最后,如果您没有利用using,您将 无法 正确 处理 这些对象,最终会遇到诸如现在所看到的问题。
SQLiteConnection
using