簡體   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