2013-03-19 150 views
2

我得到斷斷續續的SQLiteException s聲稱「沒有這樣的表格:HomepageSection」。它始終是同一個表,但停止應用程序並重新啓動它,問題就消失了。如果數據庫丟失,有時會發生,有時會出現。SQLite:沒有這樣的表

在打開數據庫文件時使用sqlite-net s SQLiteAsyncConnection.CreateTableAsync方法(並且是的,它們在發生此異常之前等待它們)創建表。

我連接到正確的數據庫文件,我已經多次檢查過。我直接在SQLite瀏覽器中打開從連接對象中獲得的路徑,並且HomepageSection表不在那裏。

SQLiteException被扔在了下面的查詢:insert OR REPLACE into "HomepageSection"("Title","Version","Id","Updated") values (?,?,?,?)(SQLite.cs,Prepare2(),行2951)

有沒有異常拋出針對涉嫌創建的錶行:

await _connection.CreateTableAsync<HomepageSection>(); 

想法解決這個問題?

+0

我在普通的舊版Ruby應用程序中看到類似的東西。如果遇到任何問題,我會通知你。感謝您發佈此信息。 – 2013-04-07 02:32:52

+0

你在使用任何雜注嗎?你使用的是什麼版本的sqlite? – 2013-06-25 23:17:03

+0

沒有編譯指示。 Nuget包sqlite-net,版本1.0.5。 – 2013-06-26 06:09:33

回答

0

我遇到了同樣類型的間歇性錯誤。我做了以下更改,到目前爲止還沒有新的客戶錯誤報告。

我關閉連接字符串中的sqlite autocreate數據庫。

connectionString="Data Source=default.db3; Foreign Keys=true; FailIfMissing=True;" 

打開FailIfMissing,我得到的報告不能打開數據庫,而不是沒有這樣的表。看起來sqlite無法打開我的db3文件,所以它創建了一個沒有表的新數據庫。它必須在內存中創建它,因爲我在驅動器上找不到任何新的數據庫文件。

要糾正這種情況,我使用單例模式只生成一個連接,並在應用程序的整個生命週期中保持打開狀態。還有其他的方法可以做到這一點,但我有更多的單身經驗。這不是完整的課程代碼,只是爲了讓你入門。

public static SQLite Instance 
{ 
    get 
    { 
    if (instance == null) 
     { 
     instance = new SQLite(); 
     mySQLiteConn = new SQLiteConnection(ConnectionString); 
     mySQLiteConn.Open(); 
     } 
     return instance; 
    } 
} 

public void Execute(string SQL) 
{ 
    using (SQLiteCommand myCommand = new SQLiteCommand(SQL, mySQLiteConn)) 
    { 
    myCommand.ExecuteNonQuery().ToString(); 
    } 
} 

所以執行INSERT,你會怎麼做:

SQLite.Instance.Execute("Insert .....;"); 
+0

我的SQLite用法已經是單身。問題可能是我自由地使用了'Task',它可能與多線程有關。 – 2013-08-26 13:24:38

+0

如果您使用的是多線程,請不要像我的示例中那樣創建實例,它不是線程安全的,並且您將獲得到數據庫的多個連接。你有FailIfMissing =真集嗎? – 2013-08-27 20:44:15

0

我也有類似的問題。我所做的只是創建表(不查詢,沒有別的),看看錶是否真的直接看數據庫創建。您可以在此查看數據結構是否存在問題。你已經完成的大部分事情,但如果沒有創建表,你應該看看爲什麼。

對我而言,我在intstring(id字段和主鍵)之間存在一些混淆,我也忘記爲一對一連接創建一個id屬性。大多數情況下,例外情況不具有豐富信息,但您應該始終抓住例外情況並找到內在的例外情況。有時他們可以給你一個提示。