Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C&;Sqlite3-变量数据库&;表命名-SQL语法错误_C_Sqlite_C Preprocessor - Fatal编程技术网

C&;Sqlite3-变量数据库&;表命名-SQL语法错误

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; 在调试中检查代

我试图编写一些代码,用预处理器命令设置的数据库和表的名称初始化sql数据库和表,如果未设置,则默认为下面给出的值

我正在使用宏对给定的任何名称进行字符串化。sqlite3_open使用给定名称或默认名称正确打开/创建数据库

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);表中至少需要一个字段啊,是的,我添加了几个字段,现在表和数据库都已经创建好了。这就解决了问题,谢谢!