2012-04-10 25 views
1

我的Windows應用程序(用C語言編寫)使用SQLite(使用嵌入式聯軍源),用於存儲離線數據,並曾與它沒有任何問題,在一個多字節字符設置構建。我現在將代碼庫轉換爲Unicode。 SQLite非常高興地使用Unicode編譯運行,以UTF-16LE編碼創建SQLite數據庫。SQLite數據庫不會關閉在Unicode時和附註journal_mode設置

我遇到一個很奇怪的事情,雖然。如果我運行查詢PRAGMA journal_mode = DELETE(實際上,將其設置爲任何允許的值,包括OFF,做同樣的事情),一切都正常運行,直到代碼關閉數據庫,此時調用sqlite3_close()回報SQLITE_BUSY,與錯誤"unable to close due to unfinalised statements"

發生這種情況,即使我在數據庫上運行的唯一的查詢是單一的編譯命令!我可以運行其他編譯好的代碼(例如"PRAGMA synchronous = NORMAL")和我所有的SQL查詢,並且數據庫將相當愉快地關閉;只是這個journal_mode編譯指示導致了這種奇怪的行爲,並且僅在代碼的Unicode編譯中 - 多字節編譯不顯示此問題。無論數據庫是否已經[在UTF-16LE模式]中存在,或者是否在首次打開時創建它,都會發生這種情況。

任何想法可能是錯的?我正在使用SQLite build v3.7.11。

+0

一個注意:從技術上講,編譯調用不是我跑的唯一查詢:我也跑了呼叫'PRAGMA quick_check(1)'當我第一次打開/創建數據庫。 – 2012-04-10 10:07:41

+0

稍有混淆,'journal_mode'似乎沒有'NORMAL'作爲其允許值之一 – Hasturkun 2012-04-10 10:44:51

+0

哎呀,我的意思是「刪除」 - 即默認值。我將編輯該問題。 – 2012-04-10 12:40:43

回答

1

我在最後發現了問題。是在我自己的包裝代碼。由於sqlite的有沒有Unicode相當於呼籲sqlite3_exec(),我已經讓過我的代碼的Unicode版本降,它準備/步/完成(當呼叫者從SQL查詢想要的數據回),但由於某種原因設置journal_mode編譯導致SqLite返回一些數據,這不適用於我設置的其他編譯指示 - 因此,對於這個編譯指示有一個未定義的語句。

爲了將來的參考,如果在關閉時得到SQLITE_BUSY,可以調用sqlite3_next_stmt()來獲取下一個未定義的語句,然後使用sqlite3_sql()來讓它告訴您與之關聯的準備好的SQL語句。很有用!其他

+1

您至少節省了一小時的調試時間,謝謝。 – user38329 2012-08-19 16:13:34

相關問題