2013-06-12 116 views
2

我目前正在爲我的控制檯應用程序使用此SQLite庫:http://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki - 目前爲止,SELECT查詢一直正常,但這樣做INSERT正在導致我遇到問題,而我沒有找到了解決方案。System.Data.SQLite鎖定/共享衝突

我猜測代碼可能會重新工作,但我看不到如何?

代碼

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):延遲1375ms用於鎖定/共享衝突的SQLite

錯誤(14):os_win.c: 34909:(5)winOpen(c:\ db.sqlite-journal) - 訪問 被拒絕。 SQLite的錯誤(14):os_win.c:34909:(2)

winOpen(C:\ db.sqlite雜誌) - 系統找不到指定的文件

。 SQLite的誤差(14):在34917線無法打開文件

[118a3b3569] SQLite的誤差(14):放棄語句在7:[INSERT INTO 通道(名稱)VALUES(@name)]

+0

它試圖寫入驅動器'c:'的根目錄下的文件。你程序運行的是哪個用戶?它是什麼類型的程序? (命令行,asp.net等)並說用戶有權寫入該位置? –

+0

如果您寫入根驅動器,它們必須是「超級用戶」或更高級別的用戶。否則,該用戶的* Folder Permission *必須設置爲「讀取和寫入」權限。 – Greg

+0

但是它爲什麼寫一個新文件?以管理員身份運行Visual Studio。 – Michael

回答

0

特定的錯誤代碼表示如下:

錯誤代碼14:SQL Lite數據庫文件無法打開。

的原因,在運行Visual Studio爲管理員工作是因爲你的高架權限讀取和寫入。這並不是說它實際上是在創建一個新文件,但它可能會將數據讀取或寫入文件。

根據給定角色可能受限制的特定權限,除非權限已被明確定義。

正如我根C:上述要求,以便超級用戶或以上寫上的根數據。這時候你的數據庫試圖追加,被認爲是這也未必能夠做到。

  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 
} 

這是一個通用的方法,但有更好的更簡潔那些將測試操作系統爲用戶訪問控制功能,空值用戶帳戶等處理您可能遇到的其他問題。

希望這會指出你在正確的方向。