У меня есть плагин ac #, который записывает данные в базу данных SQLite в нашем сетевом каталоге. Мы внедряем сервер Panzura в нашем офисе (о котором я мало что знаю). https://panzura.com/solutions-now/aec-solution/
Две недели подряд, около 12:30 - эта база данных Sqlite стала доступна только для чтения. В первый раз статус «только для чтения» был опубликован на выходных. К сожалению, этого не произошло в эти выходные.
, когда я перехожу по коду, я получаю ошибку SQLiteException 'attempt to write to a readonly database'.
.
Если я использую FileInfo
в файле базы данных, 'readonly'
атрибут ложный.
Большинство 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 доступна только для чтениясостояние, это не совсем годно к употреблению. Как вывести его из состояния только для чтения?
Я даже не совсем уверен, что сейчас означает состояние только для чтения - файл доступен только для чтения? или в базе данных открыты соединения, которые нужно закрыть?
другая деталь;может ли быть проблема с атрибутом сжатия в строке подключения?
@"Data Source=I:\Practice Standards\BCMS\families.db; Version = 3; New = True; Compress = True; ";