2009-12-11 46 views
0

我有一個奇怪的或可能不是很奇怪的問題,我的sqlite數據庫。我有一個「文本」類型的領域,它的工作就像魅力與任何英文文本的年齡。SQLITE更新失敗,錯誤代碼爲1(SQLITE_ERROR)

該字段中的文本用於來自MFC CEdit。現在我切換到CRichEditCtrl來支持格式化和UNICODE文本。 CRichEditCtrl以十六進制格式轉儲格式化文本,如下所示:{\ rtf1 \ ansi \ ansicpg1252 \ deff0 \ deflang1033 {\ fonttbl {\ f0 \ fn \ s \ fcharset0 MS Shell Dlg 2;}}等。

一旦sqlite保存它大部分時間就好了。但有一段時間,它不會給出錯誤代碼SQLITE_ERROR/* SQL錯誤或缺少數據庫* /。該消息不是太有用。數據庫的存在和保存大部分時間?去搞清楚。 這裏是代碼:

error = sqlite3_exec(db,cmd,0,0,0); 
if (error != SQLITE_OK){ 
    errMsg.Format("Unable to save notes to: %s\nSQLite Error: %d",filename,error); 
    AfxMessageBox(_T(errMsg)); 
    sqlite3_close(db); 
    return false; 
    } 

沒什麼不尋常的我想。

如果您有任何想法,請讓我知道。它可能是由於RTF格式的多種反斜槓,它以某種方式混淆sqlite?哦,這與保存的文字大小無關。 非常感謝。 Val

回答

1

如果一個反斜槓起作用,那麼應該有幾個。但是,如果文本中包含撇號或雙引號,這可能會導致您不能正確地轉義文本,這會破壞查詢。

如果你沒有逃脫引號,那麼這可能是問題。說你做第一個轉義引號,像

{blabla\'somethingelse} 

,然後該字符串再次逃脫保留反斜槓(否則他們將失去在通信與數據庫),這將產生

{blabla\\'somethingelse} 

然後瞧,你有鬆散的撇號...

解決的辦法是逃避反斜槓第一,然後撇號和報價。

+0

嘿Tor,我也懷疑反斜槓。所以,你確定如果我的文本包含一些'somthing的sqlite可能會試圖解釋它,而不是把它作爲一個TEXT在我的更新字段'值...'? – val 2009-12-11 21:43:24

+0

您可能希望將cmd var打印到某些日誌,以便您可以在發送時準確查看它的外觀。 – 2009-12-11 22:18:21

2

這個問題肯定是由於在代碼中沒有轉義特殊字符。我建議你使用sqlite API來準備語句,以避免大量的字符串處理麻煩。他們會爲您的查詢插入值並自動處理轉義。

取而代之的是:

error = sqlite3_exec(db,cmd,0,0,0); 

你需要這樣做:

sqlite3_stmt *stmt; 
error = sqlite3_prepare_v2(database, "INSERT INTO table (field) VALUES (?)", -1, &stmt, NULL); 
if (error != SQLITE_OK) { ... 
error = sqlite3_bind_text(stmt, 1, rtfString, -1, SQLITE_STATIC); 
if (error != SQLITE_OK) { ... 
error = sqlite3_step(stmt); 
if (error != SQLITE_DONE) { ... 
sqlite3_finalize(stmt); 

sqlite的自動取rtfString值,引號,正確,然後將其插入查詢代替問號。

這種方式的另一個優點是您可以重複使用stmt對象。每次使用後請致電sqlite3_reset(),並記得打完電話後致電sqlite3_finalize()

+0

感謝benzado,所以我根本不需要sqlite3_exec,對吧? 取而代之的是一系列sqlite_prepare_v2,sqlite3_bind_text,sqlite3_step和finalize。哇,我會在星期一嘗試第一件事。 乾杯, – val 2009-12-11 23:04:40

+0

它不是那麼多,你不需要它; 'sqlite3_exec'本身調用'prepare','step'和'finalize'。通過自己調用這些函數,您可以更好地控制情況,並可以使用'bind',它可以解決報價問題。 – benzado 2009-12-12 00:45:58

+0

我不能等到星期一。剛剛嘗試過,它像一個魅力。謝謝你。週末愉快。 Val – val 2009-12-12 00:53:59

相關問題