2009-12-11 375 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

相关问题