2015-12-17 53 views
1

首先是一些基本信息後:可能腐敗SQLite表怪「沒有這樣的表」錯誤

  • 我在「程序文件」的SQLite數據庫在我的根文件夾C:驅動器在Win10 64 。
  • 我從3個程序同時訪問數據庫。

問題

我使用DB Browser for SQLite創建一個新的表table2。然後,我嘗試在VS2013中使用調試模式下的簡單應用插入一行。該代碼非常簡單:

using (SQLiteConnection database = new SQLiteConnection("Data Source=C:/Program Files/myapp/testdb.db;Version=3;")) 
{ 
    database.Open(); 

    using (SQLiteCommand cmd = database.CreateCommand()) 
    { 
     cmd.CommandText = "INSERT INTO trades VALUES (@id, @pass);"; 
     cmd.Prepare(); 

     cmd.Parameters.AddWithValue("@id", 36365); 
     cmd.Parameters.AddWithValue("@pass", "verysecurepassword123"); 

     cmd.ExecuteNonQuery(); 
    } 
} 

上運行,它給了我一個SQL logic error or missing database錯誤與消息no such table。我嘗試了多次,但得到了相同的結果。所有這些時間,DB Browser都告訴我表格存在,即使在我嘗試重新啓動它之後;這意味着表格確實存在。 [值得注意的一點可能是VS是在非管理員模式,這將是一個問題,因爲它需要管理員權限寫入到數據庫運行的運行。]

然後我試圖改變的CommandText到SELECT COUNT(*) FROM sqlite_master;和執行標量。結果是1,這意味着它無法看到新表格。

編輯:我幾乎可以完全肯定,這是某種形式的緩存問題,因爲我想在數據庫(不同路徑)的副本再次列出表格,並正確讀出2個表。

然後我嘗試重新啓動VS,之後錯誤及時更改爲cannot write to readonly table。我試着重新啓動,這次用管理員權限,它識別表並插入很好。

我的問題

  1. 是什麼原因造成的第一個例外給一個錯誤的原因是什麼?
  2. 它是如何神奇地修復重新啓動VS?
  3. 運行在相同數據庫上的第三個應用程序位於VS的單獨管理實例上,但調試器已分離。這個應用程序是一個小規模的服務器,我總是從VS運行它,所以我可以很容易地進行調試。它使用第一個表格(不是新的表格)。是否有可能導致上面的(緩存?)問題也可能導致這個應用程序中使用的第一個表上的數據損壞?
+0

任何與SQL服務器上的默認目錄有關的事情?也許你應該爲你的表加個前綴? – Alex

回答

0

Program Files目錄爲非管理員寫保護。有時,Windows會嘗試將寫入重定向到其他目錄以實現向後兼容,但正如您所見,這並不總是可靠。

將需要更改的文件放入您有寫入權限的目錄(即您的application data directory)。

+0

我假設你正在回答我的第一個問題。如果是這種情況,你如何解釋第二個? – Hele