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”。 我不知道为什么。 谢谢。

+0

欢迎堆栈溢出。请注意如何将材料复制到您的问题中;您CREATE TABLE语句试图创建类型整数的列(在名称中流浪R),这是不行的(或者是不太可能的工作)。在表名中有一个轻微的拼写错误;正常的拼写是温度(但是,因为你是一致的,这不是一个关键问题)。 –

您应该使用prepared statementsbind 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)

+0

就是这样。非常感谢。 – haoX

您不在SQL查询字符串中包含C变量的名称

您要么包含逐字值(例如,通过以编程方式从较小的部分组成字符串,例如使用sprintf),要么使用占位符作为参数。后者对SQL注入攻击更为强大,并且通常是首选。在C作为主机语言的情况下,它还可以节省为粘贴的查询分配足够内存的麻烦。

您可以使用placeholderscreating a prepared statementbinding 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);