SQLite数据库锁定异常

我仅在某些查询中 从SQLite收到Database is Locked异常。

下面是我在给某客户做软件定制中的代码: 当我执行任何 select 语句时,它工作正常。
当我在Jobs表上执行任何写入语句时,它也可以正常工作。

这工作正常:

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-scss"><span style="color:var(--highlight-literal)">ExecuteNonQuery</span>("DELETE FROM Jobs WHERE id=<span style="color:var(--highlight-namespace)">1</span>");
</code></span></span>
但同样,如果我对表执行查询,它会抛出数据库已锁定的Employees异常。 这会引发异常:

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-scss"><span style="color:var(--highlight-literal)">ExecuteNonQuery</span>("DELETE FROM Employees WHERE id=<span style="color:var(--highlight-namespace)">1</span>");
</code></span></span>
以下是我的功能:

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-kotlin"><span style="color:var(--highlight-keyword)">public</span> bool OpenConnection()
{
<span style="color:var(--highlight-keyword)">if</span> (Con == <span style="color:var(--highlight-literal)">null</span>)
{
Con = new SQLiteConnection(ConnectionString);
}
<span style="color:var(--highlight-keyword)">if</span> (Con.State == ConnectionState.Closed)
{
Con.Open();
<span style="color:var(--highlight-comment)">//Cmd = new SQLiteCommand("PRAGMA FOREIGN_KEYS=ON", Con);</span>
<span style="color:var(--highlight-comment)">//Cmd.ExecuteNonQuery();</span>
<span style="color:var(--highlight-comment)">//Cmd.Dispose();</span>
<span style="color:var(--highlight-comment)">//Cmd=null;</span>
<span style="color:var(--highlight-keyword)">return</span> <span style="color:var(--highlight-literal)">true</span>;
}
<span style="color:var(--highlight-keyword)">if</span> (IsConnectionBusy())
{
Msg.Log(new Exception(<span style="color:var(--highlight-variable)">"Connection busy"</span>));
}
<span style="color:var(--highlight-keyword)">return</span> <span style="color:var(--highlight-literal)">false</span>;
}

<span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-literal)">Boolean</span> CloseConnection()
{
<span style="color:var(--highlight-keyword)">if</span> (Con != <span style="color:var(--highlight-literal)">null</span> && Con.State == ConnectionState.Open)
{
<span style="color:var(--highlight-keyword)">if</span> (Cmd != <span style="color:var(--highlight-literal)">null</span>) Cmd.Dispose();
Cmd = <span style="color:var(--highlight-literal)">null</span>;
Con.Close();
<span style="color:var(--highlight-keyword)">return</span> <span style="color:var(--highlight-literal)">true</span>;
}

<span style="color:var(--highlight-keyword)">return</span> <span style="color:var(--highlight-literal)">false</span>;
}

<span style="color:var(--highlight-keyword)">public</span> <span style="color:var(--highlight-literal)">Boolean</span> ExecuteNonQuery(string sql)
{
<span style="color:var(--highlight-keyword)">if</span> (sql == <span style="color:var(--highlight-literal)">null</span>) <span style="color:var(--highlight-keyword)">return</span> <span style="color:var(--highlight-literal)">false</span>;
<span style="color:var(--highlight-keyword)">try</span>
{
<span style="color:var(--highlight-keyword)">if</span> (!OpenConnection())
<span style="color:var(--highlight-keyword)">return</span> <span style="color:var(--highlight-literal)">false</span>;
<span style="color:var(--highlight-keyword)">else</span>
{
<span style="color:var(--highlight-comment)">//Tx = Con.BeginTransaction(IsolationLevel.ReadCommitted);</span>
Cmd = new SQLiteCommand(sql, Con);
Cmd.ExecuteNonQuery();
<span style="color:var(--highlight-comment)">//Tx.Commit();</span>
<span style="color:var(--highlight-keyword)">return</span> <span style="color:var(--highlight-literal)">true</span>;
}
}
<span style="color:var(--highlight-keyword)">catch</span> (Exception exception)
{
<span style="color:var(--highlight-comment)">//Tx.Rollback();</span>
Msg.Log(exception);
<span style="color:var(--highlight-keyword)">return</span> <span style="color:var(--highlight-literal)">false</span>;
}
<span style="color:var(--highlight-keyword)">finally</span>
{
CloseConnection();
}
}
</code></span></span>

这是例外情况:在第 103 行:Cmd.ExecuteNonQuery();

发现异常:类型:System.Data.SQLite.SQLiteException 消息:数据库已锁定数据库已锁定源:System.Data.SQLite

堆栈跟踪:在 System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt) 在 System.Data.SQLite.SQLiteDataReader.NextResult() 在 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 行

在此过程中的某个地方,连接一直处于打开状态。去掉OpenConnectionandCloseConnection并更改ExecuteNonQuery为:

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-csharp"><span style="color:var(--highlight-keyword)">using</span> (SQLiteConnection c = <span style="color:var(--highlight-keyword)">new</span> SQLiteConnection(ConnectionString))
{
c.Open();
<span style="color:var(--highlight-keyword)">using</span> (SQLiteCommand cmd = <span style="color:var(--highlight-keyword)">new</span> SQLiteCommand(sql, c))
{
cmd.ExecuteNonQuery();
}
}
</code></span></span>
此外,将读取数据的方式更改为:

<span style="background-color:var(--highlight-bg)"><span style="color:var(--highlight-color)"><code class="language-csharp"><span style="color:var(--highlight-keyword)">using</span> (SQLiteConnection c = <span style="color:var(--highlight-keyword)">new</span> SQLiteConnection(ConnectionString))
{
c.Open();
<span style="color:var(--highlight-keyword)">using</span> (SQLiteCommand cmd = <span style="color:var(--highlight-keyword)">new</span> SQLiteCommand(sql, c))
{
<span style="color:var(--highlight-keyword)">using</span> (SQLiteDataReader rdr = cmd.ExecuteReader())
{
...
}
}
}
</code></span></span>
不要像现在这样尝试自己管理连接池。首先,它比您编写的代码复杂得多,但其次,它已经在对象内部进行了处理SQLiteConnection。最后,如果您没有利用using,您就没有正确处理这些对象,最终会遇到像现在这样的问题。


————————————————
版权声明:本文为CSDN博主「夜刺」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/heiyefengdi/article/details/131798927

posted @   夜刺  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示