sqlite3(语言C):没有这样的列
我想将USB中的数据保存到数据库sqlite3中。sqlite3(语言C):没有这样的列
下面是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”。 我不知道为什么。 谢谢。
您应该使用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);
看到这个SQLite introduction到C API。您的代码不起作用,因为您提交的以下字符串,查询引擎
INSERT INTO table (T0);
而INSERT语句looks like
INSERT INTO <table> VALUES (<expression>[, <expression>[, ...]])
的语法当数据库引擎评估查询,它不能知道TO
恰好是代码中某个变量的名称,因此会出现该错误。SQL是它自己的语言,它不与C语言共享任何内容。
最后要注意,正确的拼写似乎温度,没有温度图(你错过了PR后E)
就是这样。非常感谢。 – haoX
您不在SQL查询字符串中包含C变量的名称。
您要么包含逐字值(例如,通过以编程方式从较小的部分组成字符串,例如使用sprintf
),要么使用占位符作为参数。后者对SQL注入攻击更为强大,并且通常是首选。在C作为主机语言的情况下,它还可以节省为粘贴的查询分配足够内存的麻烦。
您可以使用placeholderscreating a prepared statement和binding parameters。当您使用execute该语句时,绑定参数将在占位符指示的地方使用。
您的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);
欢迎堆栈溢出。请注意如何将材料复制到您的问题中;您CREATE TABLE语句试图创建类型整数的列(在名称中流浪R),这是不行的(或者是不太可能的工作)。在表名中有一个轻微的拼写错误;正常的拼写是温度(但是,因为你是一致的,这不是一个关键问题)。 –