Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite数据库变为只读_C#_Sqlite - Fatal编程技术网

C# SQLite数据库变为只读

C# SQLite数据库变为只读,c#,sqlite,C#,Sqlite,我有一个c#插件,可以将数据写入网络目录上的SQLite数据库。我们在办公室实现了一个Panzura服务器(我不太了解) 连续两周,大约在下午12:30,这个Sqlite数据库变成只读。第一次,在周末公布了“只读”状态。不幸的是,这周末没有发生 当我单步执行代码时,我得到一个SQLiteException“尝试写入只读数据库”。错误 如果我在db文件上使用FileInfo,则'readonly'属性为false 大多数sql语句如下所示 conn.Open

我有一个c#插件,可以将数据写入网络目录上的SQLite数据库。我们在办公室实现了一个Panzura服务器(我不太了解)

连续两周,大约在下午12:30,这个Sqlite数据库变成只读。第一次,在周末公布了“只读”状态。不幸的是,这周末没有发生

当我单步执行代码时,我得到一个
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()。记录所有连接活动和/或捕获异常,而不是忽略它们。如果你有很多客户端,确保你的应用程序没有崩溃,从而保持连接打开,等等。