[英]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具有該表單
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.