繁体   English   中英

sqlite3(语言C):没有这样的列

[英]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查询字符串中包含C变量的名称

您可以包含逐字值(例如,通过编程从较小的部分组成字符串,例如使用sprintf ),或者使用占位符作为参数。 后者对SQL注入攻击更具鲁棒性,通常更受欢迎。 在C作为宿主语言的情况下,它还可以省去为粘贴的查询分配足够内存的麻烦。

您可以通过为其创建预 准备语句绑定参数来使用占位符 执行该语句时,绑定参数将用于占位符指示的位置。

您应该使用预准备语句 将值绑定到查询。 常规 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM