首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sqlite3 (C语言):没有这样的列

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

Stack Overflow用户
提问于 2012-09-14 16:53:20
回答 3查看 924关注 0票数 3

我想把数据从USB保存到数据库sqlite3中。

这是来自USB的数据

char T0[8], T1[8], T2[8], T3[8], T4[8];

我用以下命令创建了一个表

代码语言:javascript
复制
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)";

然后我将数据插入到表中

代码语言:javascript
复制
result = sqlite3_exec (DB,"Insert  into Temprature VALUES(NULL, T0, T1, T2, T3, T4, time)",0,0,&errmsg);

代码语言:javascript
复制
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”。我不知道为什么。谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-14 17:19:34

您应该使用prepared statements来对您的查询执行bind values。常规SQL的形式为

代码语言:javascript
复制
INSERT INTO Temperature_1 (Thermo_0, Thermo_1) VALUES (23.2, 42.3)

prepared statement看起来像这样

代码语言:javascript
复制
INSERT INTO Temperature_1 (Thermo_0, Thermo_1) VALUES (?, ?)

这允许安全性和性能增强。因此,您的最终代码将如下所示

代码语言:javascript
复制
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。您的代码无法工作,因为您向查询引擎提交了以下字符串

代码语言:javascript
复制
INSERT INTO table (T0);

而INSERT语句的语法looks like

代码语言:javascript
复制
INSERT INTO <table> VALUES (<expression>[, <expression>[, ...]])

当数据库引擎评估您的查询时,它不能知道TO恰好是您代码中某个变量的名称,因此会发出该错误。SQL是一种自己的语言,它不与C上下文共享任何东西。

最后要注意的是,正确的拼写应该是TEMPERATURE,而不是TEMPRATURE (你在PR后面漏掉了E)

票数 1
EN

Stack Overflow用户

发布于 2012-09-14 17:08:47

您的C代码和SQL代码在不同的域中运行,不共享变量。因此,您不能直接从SQL代码访问C变量。从文档来看,这似乎是正确的解决方案:

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2012-09-14 17:08:01

SQL查询字符串中不包括C变量的名称。

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

你可以通过creating a prepared statementbinding parameters来使用它。当您execute该语句时,绑定的参数将在占位符指示的位置使用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12421089

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档