[英]sqlite3 (language C): no such column
我想将数据从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”。 我不知道为什么。 谢谢。
您的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);
您应该使用预准备语句 将值绑定到查询。 常规 SQL具有该表单
INSERT INTO Temperature_1 (Thermo_0, Thermo_1) VALUES (23.2, 42.3)
准备好的陈述看起来像
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);
请参阅SQLite对C API的介绍 。 您的代码不起作用,因为您将以下字符串提交给查询引擎
INSERT INTO table (T0);
而INSERT语句的语法看起来像
INSERT INTO <table> VALUES (<expression>[, <expression>[, ...]])
当数据库引擎评估您的查询时,它无法知道TO
恰好是代码中某处的变量名称,从而发出该错误。 SQL是它自己的语言,它不与C上下文共享任何东西。
作为最后一点,正确的拼写似乎是TEMPERATURE ,而不是TEMPRATURE(PR之后错过了E)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.