[英]C & Sqlite3 - Variable database & table naming - SQL Syntax error
我正在嘗試編寫一些代碼,以通過預處理程序命令設置的數據庫和表的名稱初始化sql數據庫和表,如果未設置,則默認為以下給出的值。
我正在使用宏來對給出的任何名稱進行字符串化。 sqlite3_open可以正確打開/創建具有給定名稱或默認名稱的數據庫
sqlite3_open(TO_STRING(DB_NAME), &db);
對於表的創建,我依靠sprintf。
sprintf(str,"CREATE TABLE %s;", TO_STRING(TABLE_NAME));
sql = str;
在調試中檢查我的代碼時,指針sql似乎具有正確的值“ CREATE TABLE SensorData;”。 但是,當我嘗試執行代碼時,出現錯誤“ SQL錯誤:在”;附近“:語法錯誤” 。 經過檢查,很明顯該函數返回了錯誤代碼110,但是我似乎找不到關於此代碼的任何信息。
在這種情況下,我似乎無法弄清楚究竟是什么問題,因為導致數組str的字符串似乎與以靜態方式創建表時的字符串完全相同。
這是我所有與問題有關的代碼。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#define REAL_TO_STRING(s) #s
#define TO_STRING(s) REAL_TO_STRING(s)
#ifndef DB_NAME
#define DB_NAME Sensor.db
#endif
#ifndef TABLE_NAME
#define TABLE_NAME SensorData
#endif
#define DBCONN sqlite3
int main()
{
char *err_msg = 0;
DBCONN * db;
int ok = sqlite3_open(TO_STRING(DB_NAME), &db);
if(ok != SQLITE_OK)
{
fprintf(stderr,"Cannot open database: %s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return 0;
}
char * sql;
char str[100];
//clear array
memset(&str[0],0,100);
sprintf(str,"CREATE TABLE %s;", TO_STRING(TABLE_NAME));
sql = str;
ok = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (ok != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 0;
}
sqlite3_close(db);
return 0;
}
將@Simone Cifani的評論轉換為有效答案。 問題是我的CREATE TABLE查詢無效,因為我沒有向表中添加任何字段。 以下解決方案解決了問題。
請注意,我還將sprintf函數替換為asprintf函數,如果您打算執行與此類似的操作,我強烈建議您繼續閱讀。 該線程非常清楚地解釋了asprintf函數的工作以及與sprintf函數的區別。
#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#define REAL_TO_STRING(s) #s
#define TO_STRING(s) REAL_TO_STRING(s)
#ifndef DB_NAME
#define DB_NAME Sensor.db
#endif
#ifndef TABLE_NAME
#define TABLE_NAME SensorData
#endif
#define DBCONN sqlite3
int main()
{
char *err_msg = 0;
DBCONN * db;
int rc = sqlite3_open(TO_STRING(DB_NAME), &db);
if(rc != SQLITE_OK)
{
fprintf(stderr,"Cannot open database: %s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return 0;
}
char * sql;
int size = 0;
size = asprintf(&sql,"CREATE TABLE %s (id INT, value REAL, ts INT);", TO_STRING(TABLE_NAME));
if(size == -1)
printf("asprintf failed in main\n");
rc = sqlite3_exec(db, sql, 0, 0, &err_msg);
if (rc != SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
free(sql);
return 0;
}
free(sql);
sqlite3_close(db);
return 0;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.