【问题标题】:Attempt to write a readonly database After of 20 minutes of repeated queries在 20 分钟的重复查询之后尝试写入只读数据库
【发布时间】:2014-06-10 01:47:17
【问题描述】:

我的应用程序每 3 秒查询一次 SQLite 数据库,但大约 20 分钟后,在执行命令时,它会抛出异常 "Attempt to write a readonly database"。我只需要读取数据库。

进口:

using System.Data.Sqlite;

这是我的连接字符串:

sqlite_conn = new SQLiteConnection("Data Source=Patch_here;Version=3;Compress=True;Read Only=True"

这是抛出异常的方法。该方法每 3 秒执行一次:

Double fecha = 0;
try
{
    sqlite_cmd = new SQLiteCommand(sqlite_conn);
    sqlite_cmd.CommandText = "SELECT MAX(timestamp) FROM Messages";

    //HERE throws the exception, when executes the command.
    fecha = Double.Parse(sqlite_cmd.ExecuteScalar().ToString()); 

    sqlite_cmd.Dispose();
}
catch (Exception ex)
{
     informarError(ex.Message);
}
return timestamp_To_Datetime(fecha);

此外, - 我的用户拥有此数据库的所有权限。 - 我的 SQLiteConnection 只为所有查询打开一次。

我能做什么?谢谢。

【问题讨论】:

  • 为什么你显式调用Dispose而不使用using声明?如果发生错误并且您转到 catch(Exception ex) 块,您将永远不会处置该对象。此外,您没有显示如何处理 SQLiteConnection 您应该与命令建立连接并处理它,而不是在全局范围内重新使用它。 ADO.NET 是为短期连接而不是长期共享连接而设计的。根据您的 SQLite 库,它可能会实现连接池,因此无论如何都会重新使用连接。
  • 我也尝试过使用“使用”语句,但不是解决方案。我的 SQLiteConnection 只为所有查询打开一次。

标签: c# sqlite readonly system.data.sqlite


【解决方案1】:

(我知道,这有点老了。也许这是对另一个人的帮助..)

我遇到了类似的问题: 数据库处于(写入)负载(充满 C/C++ 程序)。同时,C# 程序会定期发送一个选择计数 (*)。有时(非常罕见)除了提到的错误之外。

我通过从连接字符串中删除“Read Only=True”“解决了”这个问题。

【讨论】:

    猜你喜欢
    • 2021-05-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2015-10-27
    相关资源
    最近更新 更多