3

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

4

3 回答 3

2

您的 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);
于 2012-09-14T09:08:46.593 回答
1

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

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

您可以通过创建准备好的语句并将参数绑定到它来使用占位符。当您执行该语句时,将在占位符指示的位置使用绑定参数。

于 2012-09-14T09:08:01.277 回答
1

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

于 2012-09-14T09:19:33.873 回答