System.Data.SQLite锁定/共享冲突

时间:2013-06-12 22:43:54

标签: c# sqlite

我目前正在使用这个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错误(10):锁定/共享冲突SQLite延迟了1375ms

     

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

     

winOpen(c:\ db.sqlite-journal) - 系统找不到文件

     

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

的第34917行打开文件      

[118a3b3569] SQLite错误(14):语句在7处中止:[INSERT INTO   渠道(名称)VALUES(@name)]

1 个答案:

答案 0 :(得分:0)

特定错误代码表示以下内容:

  

错误代码14:无法打开SQL Lite数据库文件。

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

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

正如我上面提到的,根C:需要高级用户或高于以便在根目录上写入数据。当您的数据库尝试追加时,它被视为 Write ,它可能无法执行。

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

    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
    }
    

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

    希望这可以指出你正确的方向。