System.Data.SQLite锁/共享冲突

本文关键字:共享 冲突 Data SQLite System | 更新日期: 2023-09-27 18:18:02

我目前正在为我的控制台应用程序使用这个SQLite库:http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki -到目前为止,它已经可以使用SELECT查询,但这样做INSERT会导致我的问题,我还没有找到解决方案。

我猜代码可以重新工作,但我看不出如何?

public string NewChannel(string _channel)
{
    SQLiteConnection m_dbConnection = new SQLiteConnection(m_connection);
    using (var cmd = m_dbConnection.CreateCommand())
    {
        m_dbConnection.Open();
        cmd.CommandText = "INSERT INTO channels (name) VALUES (@name)";
        cmd.Parameters.AddWithValue("@name", _channel);
        try
        {
            int result = cmd.ExecuteNonQuery();
            return "New channel added: " + _channel;
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.InnerException);
            return null;
        }
    }
}
误差

SQLite error (10): delayed 1375ms for lock/sharing conflict SQLite

error (14): os_win.c:34909: (5) winOpen(c:'db.sqlite-journal) - Access被拒绝。SQLite错误(14):os_win.c:34909: (2)

winOpen(c:'db.sqlite-journal) -系统找不到

文件

指定。SQLite错误(14):无法打开

行34917处的文件

[118a3b3569] SQLite error (14): statement aborts at 7: [INSERT INTO .channels (name) VALUES (@name)]

System.Data.SQLite锁/共享冲突

特定的错误代码表示如下:

错误码14:SQL Lite Database File Can't open .

作为管理员运行Visual Studio的原因是您提升了读写权限。这并不是说它实际上是在创建一个新文件,但它可能是在读或写数据到文件。

基于可能根据给定角色限制的特定权限,除非权限已明确定义。

如上所述,根C:需要Power User或以上用户才能在根上写入数据。当您的数据库试图追加时,被认为是,它可能无法做到。

  1. 解决方案一:明确定义应用程序/用户的权限以避免问题。
  2. 方案二:在试图访问数据文件之前写一个检查,以确保正确的权限

这种检查的一个例子:

public ValidFolderPermission(string filePath)
{
     if(File.Exist(filePath))
     {
          // Open Stream and Read.
          using (FileStream fs = File.Open(filePath, FileMode.Open))
          {
                byte[] data = new byte[1024];
                UTF8Encoding temp = new UTF8Encoding(true);
                while (fs.Read(b, 0, b.Length) > 0)
                {
                      Console.WriteLine(temp.GetString(b));
                }
           }
     }
}

在这种情况下,如果它实际上打开了该路径下的文件,则您具有适当的访问权限。如果没有,那么你没有权限。

重要:要真正进行测试,您应该使用trycatch,甚至可能使用boolean returns,以确保在写入数据库之前准确处理。

你甚至可以像这样检查用户的权限级别:

WindowsIdentity user = WindowsIdentity.GetCurrent();
WindowsPrincipal role = new WindowsPrincipal(user);
if(role.IsInRole(WindowsBuiltInRole.Administrator)
{
     // Do Something
}
else
{
     // Do Something Else
}

这是一种通用的方法,但是有更好更简洁的方法可以测试操作系统的用户访问控制功能,用户帐户的空值等,以处理您可能遇到的其他问题。