解决 我如何预防或解决'database is locked' error in sqlite?

假面

会员
已加入
2020年11月30日
留言内容
16
编程经验
1-3
大家好。
我在c#SQLite数据更新和创建中遇到一些问题。
我在C#Windows窗体应用程序中将SQLite用作数据库。
顺便说一句,有时候我有一个"database is locked"当我尝试插入或更新数据时,SQLite中出现错误。
在google上搜索方式时,我知道它将能够发生,因为多线程正在工作或数据库正在处理中。
但是我找不到哪个线程或进程损害了此数据库的正确更新。
我想防止错误并最终尽快解决此问题。
谢谢你的时间。

C#:
static SQLiteConnection CreateConnection(string dbName)
{

    SQLiteConnection sqlite_conn;
    // Create a new database connection:
    sqlite_conn = new SQLiteConnection("Data Source=" + dbName + ".db; PRAGMA journal_mode = WAL; Version = 3; New = True; Compress = True; Connection Timeout=0 ");
    // Open the connection:
    try
    {
        sqlite_conn.Open();
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex);
    }
    return sqlite_conn;
}


sqlite_conn = CreateConnection(constants.dbName);
InsertLog(sqlite_conn, 2, "xxx", "yyyyy");


public void InsertLog(SQLiteConnection conn, int logType, string logTitle, string logContent, string logContent_2 = "")
{
    if (conn.State == ConnectionState.Closed)
    {
        conn.Open();
    }
    try
    {
        DateTime logDate = DateTime.Now;
        SQLiteCommand sqlite_cmd;
        string Createsql = "INSERT INTO " + constants.tbNames[14] + " (logType, logTitle, logContent, logContent_2, logDate) VALUES (@logType, @logTitle, @logContent, @logContent_2, @logDate)";
        sqlite_cmd = conn.CreateCommand();
        //sqlite_cmd.CommandTimeout = 0;
        sqlite_cmd.CommandText = Createsql;
        sqlite_cmd.Parameters.AddWithValue("@logType", logType);
        sqlite_cmd.Parameters.AddWithValue("@logTitle", logTitle);
        sqlite_cmd.Parameters.AddWithValue("@logContent", logContent);
        sqlite_cmd.Parameters.AddWithValue("@logContent_2", logContent_2);
        sqlite_cmd.Parameters.AddWithValue("@logDate", logDate);

        sqlite_cmd.ExecuteNonQuery();

    }
    catch (Exception e)
    {
        conn.Close();
        //Console.WriteLine("db_error==" + e);
        return;
    }
    conn.Close();
    return;
}
 
由主持人最后编辑:

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,468
位置
弗吉尼亚州切萨皮克
编程经验
10+
The brute force way to find out is to set a breakpoint on your CreateConnection() and see who is creating connections to the database and make sure that they close the connection before someone else calls CreateConnection().
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,908
位置
英国
编程经验
10+
您将在第10行上打开连接。该代码是毫无用处的,并且像这样切入连接字符串也不明智。您可以使用连接字符串构建器正确建立连接字符串。

不要传递连接字符串,连接,命令等,这是完全不相关的。这样做没有任何面向对象的目的。
在使用它们的地方创建连接和命令,并在完成使用它们后将其丢弃。通常,人们为此使用使用块。

您的命令应与您的连接一起构造为新命令。将查询和连接添加到命令中。您可能会发现Jan Bodnar教程更有用: C#SQLite教程-用C#编程SQLite数据库
 

假面

会员
已加入
2020年11月30日
留言内容
16
编程经验
1-3
您将在第10行上打开连接。该代码是毫无用处的,并且像这样切入连接字符串也不明智。您可以使用连接字符串构建器正确建立连接字符串。

不要传递连接字符串,连接,命令等,这是完全不相关的。这样做没有任何面向对象的目的。
在使用它们的地方创建连接和命令,并在完成使用它们后将其丢弃。通常,人们为此使用使用块。

您的命令应与您的连接一起构造为新命令。将查询和连接添加到命令中。您可能会发现Jan Bodnar教程更有用: C#SQLite教程-用C#编程SQLite数据库
你好。感谢您的时间和答复。
我会记下您的建议,并认为它将不断为我提供帮助。
顺便说一句,我现在有一些问题。
在调试项目并在线搜索时,我发现数据库实际上试图同时执行2个操作。
但是一个地方发生了错误,我找不到另一个处理位置。

抛出异常:System.Data.SQLite.dll中的'System.Data.SQLite.SQLiteException'
code = Busy (5), message = System.Data.SQLite.SQLiteException (0x800007AF): 数据库已锁定
数据库已锁定
在System.Data.SQLite.SQLite3.Step(SQLiteStatement stmt)
在System.Data.SQLite.SQLiteDataReader.NextResult()
在System.Data.SQLite.SQLiteDataReader..ctor(SQLiteCommand cmd,CommandBehavior表现)
在System.Data.SQLite.SQLiteCommand.ExecuteReader(CommandBehavior行为)
在System.Data.SQLite.SQLiteCommand.ExecuteNonQuery(CommandBehavior行为)

在C:\ Users \ OOBAN01 \ Documents \ obhan_test \ STV01(2020-12-02)\ STV01 \ DBClass.cs:第299行的STV01.DBClass.ClosingProcessRun()

这是我的调试输出。

在带有下划线的2行中,您可以看到ExecuteReader和ExecuteNonQuery,但那时我仅使用ExecuteNonQuery。
我认为这会使数据库锁定错误。你怎么看?
让我知道你的意见。
尽快寻找您的好答案。
问候。
 
由主持人最后编辑:

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,908
位置
英国
编程经验
10+
我已向您提供了更改代码所需的信息。更改您的代码,然后返回并向我们显示您新的更新代码以及我建议的更改。您还应该访问我最近发送给您的链接,因为其中包含一些示例。
 

假面

会员
已加入
2020年11月30日
留言内容
16
编程经验
1-3
谢谢你的时间。
我试图按照您所说的去做,所以它比以前更好,但尚未完全解决。我想也许我错过了一些与sqlite db连接有关的部分。但是我会自己修复的。
顺便说一下,现在我在C#中还有另一个问题。
我将在启动时以管理员身份运行c#应用程序。因此,我为此添加了一些代码,可以在启动列表中看到应用程序名称,但实际上在启动OS时它不起作用。如果我在app.manifest中将c#应用程序的excutionLevel设置为asInvoker,则它运行良好,但不适用于requireAdministrator。
还有其他好主意吗?
我希望你能尽快帮助我。
最好的祝福。
 

跳伞

工作人员
已加入
2019年4月6日
留言内容
2,468
位置
弗吉尼亚州切萨皮克
编程经验
10+
请打开有关您以admin / as invoker运行的新问题的新线程。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,908
位置
英国
编程经验
10+
关于您当前的数据库问题:
database is locked
您应该使用using语句。链接我的签名!

因为您只能有一个打开的连接,但是可以通过该连接共享多个命令。似乎您需要显示有关如何创建连接以及在执行命令时如何使用它的代码。

至于管理员问题,请注意,每个新问题都需要解决一个新主题。因此,让我们保留有关您的SQL连接问题的主题。
 

羊皮

退休程序员
工作人员
已加入
2018年9月5日
留言内容
1,908
位置
英国
编程经验
10+
显示您的更新代码有关SQL问题?
 
最佳 底部