我想把数据从USB保存到数据库sqlite3中。
这是来自USB的数据
char T0[8], T1[8], T2[8], T3[8], T4[8];
我用以下命令创建了一个表
const char* Temprature_table = "Create table Temprature_1 (ID INTERGER PRIMARY KEY,Thermo_0 decimal(5,1),Thermo_1 decimal(5,1),Thermo_2 decimal(5,1),Thermo_3 decimal(5,1),Thermo_4 decimal(5,1),time DATETIME)";然后我将数据插入到表中
result = sqlite3_exec (DB,"Insert into Temprature VALUES(NULL, T0, T1, T2, T3, T4, time)",0,0,&errmsg);或
char array[256];
sprintf(array, "Insert into Temprature_1 VALUES(NULL, T0, T1, T2, T3, T4, time)");
result = sqlite3_exec (DB,array,0,0,&errmsg);但是有一个问题:“无法插入数据:没有这样的列: T0”。我不知道为什么。谢谢。
发布于 2012-09-14 17:19:34
您应该使用prepared statements来对您的查询执行bind values。常规SQL的形式为
INSERT INTO Temperature_1 (Thermo_0, Thermo_1) VALUES (23.2, 42.3)prepared statement看起来像这样
INSERT INTO Temperature_1 (Thermo_0, Thermo_1) VALUES (?, ?)这允许安全性和性能增强。因此,您的最终代码将如下所示
sqlite3_stmt *stmt;
sqlite3_prepare_v2(
db,
"INSERT INTO Temperature (Thermo_0, Thermo_1) VALUES (?, ?)",
-1,
&stmt,
NULL
);
sqlite3_bind_text(stmt, 1, T0, -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, T1, -1, SQLITE_TRANSIENT);
sqlite3_step(stmt);参见这个指向C应用编程接口的SQLite introduction。您的代码无法工作,因为您向查询引擎提交了以下字符串
INSERT INTO table (T0);而INSERT语句的语法looks like
INSERT INTO <table> VALUES (<expression>[, <expression>[, ...]])当数据库引擎评估您的查询时,它不能知道TO恰好是您代码中某个变量的名称,因此会发出该错误。SQL是一种自己的语言,它不与C上下文共享任何东西。
最后要注意的是,正确的拼写应该是TEMPERATURE,而不是TEMPRATURE (你在PR后面漏掉了E)
发布于 2012-09-14 17:08:47
您的C代码和SQL代码在不同的域中运行,不共享变量。因此,您不能直接从SQL代码访问C变量。从文档来看,这似乎是正确的解决方案:
sqlite3_stmt *ppStmt;
sqlite3_prepare_v2(DB, "Insert into Temprature_1 VALUES(NULL, ?, ?, ?, ?, ?, time)", 58, &ppStmt, NULL);
sqlite3_bind_text(ppStmt, 1, T0, 8, SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt, 2, T1, 8, SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt, 3, T2, 8, SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt, 4, T3, 8, SQLITE_TRANSIENT);
sqlite3_bind_text(ppStmt, 5, T4, 8, SQLITE_TRANSIENT);
sqlite3_step(ppStmt);
sqlite3_finalize(ppStmt);发布于 2012-09-14 17:08:01
SQL查询字符串中不包括C变量的名称。
您可以包括逐字值(例如,通过编程方式从较小的片段组成字符串,例如使用sprintf),也可以使用占位符作为参数。后者对SQL注入攻击更健壮,而且通常是首选的。在使用C作为宿主语言的情况下,它还可以省去为粘贴的查询分配足够内存的麻烦。
你可以通过creating a prepared statement和binding parameters来使用它。当您execute该语句时,绑定的参数将在占位符指示的位置使用。
https://stackoverflow.com/questions/12421089
复制相似问题