SQLite数据库locking的exception

我得到的数据库locking SQLite的exception只有一些查询。

下面是我的代码:当我执行任何select语句,它工作正常。
当我在Jobs Table上执行任何写入语句时,它也能正常工作。

这工作正常:

 ExecuteNonQuery("DELETE FROM Jobs WHERE id=1"); 

但是,同样的方式,如果我正在执行查询Employees表,它是抛出一个exception, 数据库被locking
这抛出exception:

 ExecuteNonQuery("DELETE FROM Employees WHERE id=1"); 

以下是我的function:

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

发现exception:types:System.Data.SQLite.SQLiteException消息:数据库已locking数据库已locking源:System.Data.SQLite

Stacktrace:在System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)在System.Data.SQLite.SQLiteDataReader.NextResult(SQLiteStatement stmt)System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd,CommandBehavior行为)System.Data在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行

一路上的某个地方连接正在打开。 摆脱OpenConnectionCloseConnection并将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()) { ... } } } 

不要试图自己pipe理连接池,就像你在这里一样。 首先,它比你编写的代码复杂得多,但是第二,它已经在SQLiteConnection对象中处理了。 最后,如果你没有充分using ,你没有妥善处理这些对象,最终会出现像你现在看到的问题。

你可以使用下面的“使用”语句,即使在exception情况下,也可以确保连接和命令正确处理

 private static void ExecuteNonQuery(string queryString) { using (var connection = new SQLiteConnection( ConnectionString)) { using (var command = new SQLiteCommand(queryString, connection)) { command.Connection.Open(); command.ExecuteNonQuery(); } } } 
 I was also getting the same error here if (new basics.HindiMessageBox(HMsg, HTitle).ShowDialog()==true) { SQLiteConnection m_dbConnection = new SQLiteConnection(MainWindow.con); m_dbConnection.Open(); sql = "DELETE FROM `users` WHERE `id`=" + SelectedUser.Id; command = new SQLiteCommand(sql, m_dbConnection); command.ExecuteNonQuery(); m_dbConnection.Close(); LoadUserDG(); } 

但是当我只是改变了SQLiteConnection的declearation的地方

  public partial class User : Window { SQLiteCommand command; string sql; AddUser AddUserObj; List<basics.users> usersList; basics.users SelectedUser; SQLiteConnection m_dbConnection; ..... ..... ..... ..... private void DeleteBtn_Click(object sender, RoutedEventArgs e) { .... .... .... if (new basics.HindiMessageBox(HMsg, HTitle).ShowDialog()==true) { m_dbConnection = new SQLiteConnection(MainWindow.con); m_dbConnection.Open(); sql = "DELETE FROM `users` WHERE `id`=" + SelectedUser.Id; command = new SQLiteCommand(sql, m_dbConnection); command.ExecuteNonQuery(); m_dbConnection.Close(); LoadUserDG(); } } 

现在一切都很好。 希望它也可以为你工作。 如果有人可以说这是怎么发生的,请告诉我想知道提高我的知识。

在尝试将任何数据写入数据库之前,应closuresDataReader。 使用:

 dr.Close(); 

完成使用DataReader后。