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行
一路上的某个地方连接正在打开。 摆脱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()) { ... } } }
不要试图自己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后。