C# SQLite数据库变为只读
我有一个c#插件,可以将数据写入网络目录上的SQLite数据库。我们在办公室实现了一个Panzura服务器(我不太了解) 连续两周,大约在下午12:30,这个Sqlite数据库变成只读。第一次,在周末公布了“只读”状态。不幸的是,这周末没有发生 当我单步执行代码时,我得到一个C# SQLite数据库变为只读,c#,sqlite,C#,Sqlite,我有一个c#插件,可以将数据写入网络目录上的SQLite数据库。我们在办公室实现了一个Panzura服务器(我不太了解) 连续两周,大约在下午12:30,这个Sqlite数据库变成只读。第一次,在周末公布了“只读”状态。不幸的是,这周末没有发生 当我单步执行代码时,我得到一个SQLiteException“尝试写入只读数据库”。错误 如果我在db文件上使用FileInfo,则'readonly'属性为false 大多数sql语句如下所示 conn.Open
SQLiteException“尝试写入只读数据库”。
错误
如果我在db文件上使用FileInfo
,则'readonly'
属性为false
大多数sql语句如下所示
conn.Open();
using (SQLiteCommand cmd = new SQLiteCommand(conn))
{
cmd.CommandText = "INSERT INTO " +
"`User`(`UserName`, `UserLevel`) " +
"VALUES('" + System.Environment.UserName + "', '0')";
cmd.ExecuteNonQuery();
}
conn.Close();
我的第一个观察是,打开和关闭连接可能与using语句是多余的
我还注意到这个sql语句
conn.Open();
string sel = "SELECT * FROM User WHERE `userName`='"+System.Environment.UserName+"' LIMIT 1";
using (SQLiteCommand cmd = new SQLiteCommand(sel, conn))
{
using (SQLiteDataReader rdr = cmd.ExecuteReader())
{
while (rdr.Read())
{
NumOfResults++;
if (rdr.GetString(2) == "1")
{
count = 1;
} else { count = 0; }
}
}
}
在这种情况下,连接被打开,使用using语句,但连接没有关闭。我想知道(即使这个路由每周运行多次),这是否会使数据库处于只读状态?尽管如此,我认为保持连接打开会返回SQLITE BUSY
异常
此时,我不知道这个只读问题是由我的代码还是服务器引起的。我已经运行这个插件好几个月了,没有出现任何问题——尽管访问它的用户数量正在增加
我不确定如何解决这个问题,因为一旦SQLIte数据库处于只读状态,它就不能真正使用。如何强制它脱离只读状态
我甚至不确定只读状态现在意味着什么——文件是只读的吗?或者数据库是否打开了需要关闭的连接
另一个细节;连接字符串上的compress属性是否有问题
@"Data Source=I:\Practice Standards\BCMS\families.db; Version = 3; New = True; Compress = True; ";
首先,连接
conn.Open()
和conn.Close()
语句不是多余的,因为using语句用于SQLiteCommand cmd
对象。但是您应该将使用的整个连接包装在一个try…catch…finally
块中,并将conn.Close()
放在finally块中。是的,您肯定应该在第二个代码段的末尾关闭连接,但是,它应该再次包装在一个try..finally
块中,以避免由于错误而导致连接松动。我对此表示感谢,并将在try-catch中包装这些内容。注意没有连接关闭();这会导致数据库“只读”吗?这对我来说很奇怪,因为这个select语句一天至少调用50次。至于Panzura服务器,如果你怀疑这可能是问题,你需要去它和/或Panzura寻求解决方案,特别是如果你对它一无所知,那么就去适当的来源。创可贴就是按照我已经建议的去做。调查网络服务器的功能,它是否具有允许您查看和管理文件锁的管理功能。在您发现问题时,是否有任何类型的备份或同步过程发生?接下来,更改代码以实现更好的数据库连接模式,如我所说,使用try…finally
块确保调用conn.close()。记录所有连接活动和/或捕获异常,而不是忽略它们。如果您有许多客户端,请确保没有应用程序崩溃,从而使连接保持打开状态,等等。首先,连接conn.open()
和conn.Close()
语句不是多余的,因为using语句用于SQLiteCommand cmd
对象。但是您应该将使用的整个连接包装在一个try…catch…finally
块中,并将conn.Close()
放在finally块中。是的,您肯定应该在第二个代码段的末尾关闭连接,但是,它应该再次包装在一个try..finally
块中,以避免由于错误而导致连接松动。我对此表示感谢,并将在try-catch中包装这些内容。注意没有连接关闭();这会导致数据库“只读”吗?这对我来说很奇怪,因为这个select语句一天至少调用50次。至于Panzura服务器,如果你怀疑这可能是问题,你需要去它和/或Panzura寻求解决方案,特别是如果你对它一无所知,那么就去适当的来源。创可贴就是按照我已经建议的去做。调查网络服务器的功能,它是否具有允许您查看和管理文件锁的管理功能。在您发现问题时,是否有任何类型的备份或同步过程发生?接下来,更改代码以实现更好的数据库连接模式,如我所说,使用try…finally
块确保调用conn.close()。记录所有连接活动和/或捕获异常,而不是忽略它们。如果你有很多客户端,确保你的应用程序没有崩溃,从而保持连接打开,等等。