C&;Sqlite3-变量数据库&;表命名-SQL语法错误
我试图编写一些代码,用预处理器命令设置的数据库和表的名称初始化sql数据库和表,如果未设置,则默认为下面给出的值 我正在使用宏对给定的任何名称进行字符串化。sqlite3_open使用给定名称或默认名称正确打开/创建数据库C&;Sqlite3-变量数据库&;表命名-SQL语法错误,c,sqlite,c-preprocessor,C,Sqlite,C Preprocessor,我试图编写一些代码,用预处理器命令设置的数据库和表的名称初始化sql数据库和表,如果未设置,则默认为下面给出的值 我正在使用宏对给定的任何名称进行字符串化。sqlite3_open使用给定名称或默认名称正确打开/创建数据库 sqlite3_open(TO_STRING(DB_NAME), &db); 对于表的创建,我依赖于sprintf sprintf(str,"CREATE TABLE %s;", TO_STRING(TABLE_NAME)); sql = str; 在调试中检查代
sqlite3_open(TO_STRING(DB_NAME), &db);
对于表的创建,我依赖于sprintf
sprintf(str,"CREATE TABLE %s;", TO_STRING(TABLE_NAME));
sql = str;
在调试中检查代码时,指针sql似乎具有正确的值“createtablesensordata;”。然而,当我试图执行代码时,我得到了错误“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;
}
#包括
#包括
#包括
#包括
#定义实数到字符串
#定义到\u字符串实\u到\u字符串
#ifndef数据库名称
#定义DB_NAME Sensor.DB
#恩迪夫
#ifndef表格名称
#定义表\u名称传感器数据
#恩迪夫
#定义DBCONN sqlite3
int main()
{
char*err_msg=0;
DBCONN*db;
int ok=sqlite3\u open(TO\u字符串(DB\u名称),&DB);
如果(ok!=SQLITE_ok)
{
fprintf(stderr,“无法打开数据库:%s\n”,sqlite3_errmsg(db));
sqlite3_关闭(db);
返回0;
}
char*sql;
char-str[100];
//清晰阵列
memset(str[0],0100);
sprintf(str,“创建表%s;”,TO_字符串(表名称));
sql=str;
ok=sqlite3_exec(db、sql、0、0和err_msg);
如果(ok!=SQLITE_ok){
fprintf(stderr,“SQL错误:%s\n”,err\u msg);
无sqlite3(错误消息);
sqlite3_关闭(db);
返回0;
}
sqlite3_关闭(db);
返回0;
}
将@Simone Cifani的评论转化为有效答案。问题是我的CREATETABLE查询无效,因为我没有向表中添加任何字段。下面的解决方案解决了这个问题
#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;
}
请注意,我还将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;
}
定义GNU源
#包括
#包括
#包括
#包括
#定义实数到字符串
#定义到\u字符串实\u到\u字符串
#ifndef数据库名称
#定义DB_NAME Sensor.DB
#恩迪夫
#ifndef表格名称
#定义表\u名称传感器数据
#恩迪夫
#定义DBCONN sqlite3
int main()
{
char*err_msg=0;
DBCONN*db;
int rc=sqlite3_open(TO_字符串(DB_名称),&DB);
如果(rc!=SQLITE_OK)
{
fprintf(stderr,“无法打开数据库:%s\n”,sqlite3_errmsg(db));
sqlite3_关闭(db);
返回0;
}
char*sql;
int size=0;
size=asprintf(&sql,“创建表%s(id INT,value REAL,ts INT);”,TO_STRING(表名称));
如果(大小==-1)
printf(“主\n中的asprintf失败”);
rc=sqlite3_exec(db、sql、0、0和err_msg);
如果(rc!=SQLITE_OK){
fprintf(stderr,“SQL错误:%s\n”,err\u msg);
无sqlite3(错误消息);
sqlite3_关闭(db);
免费(sql);
返回0;
}
免费(sql);
sqlite3_关闭(db);
返回0;
}
您的创建表查询无效。尝试以下操作:创建表'mytable'('id'INTEGER);表中至少需要一个字段啊,是的,我添加了几个字段,现在表和数据库都已经创建好了。这就解决了问题,谢谢!