一尘不染

SQLite数据库锁定异常

c#

我正在从 SQLite* 获得 数据库被锁定的 异常,仅适用于某些查询。 *

下面是我的代码:执行任何select语句时,它都可以正常工作。
当我在JobsTable 上执行任何write语句时,它也可以正常工作。

这很好用:

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

但是以同样的方式,如果我对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();

发现异常:类型: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行


阅读 815

收藏
2020-05-19

共1个答案

一尘不染

连接一直保持打开状态。摆脱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())
        {
            ...
        }
    }
}

不要尝试
像在这里一样自行管理连接池。首先,它比您编写的代码复杂得多,但是其次,它已经在SQLiteConnection对象内部进行了处理。最后,如果您没有利用using,您将
无法 正确 处理 这些对象,最终会遇到诸如现在所看到的问题。

2020-05-19