2012-07-02 36 views
4

导出sqlite3的表到文件我在Fedora的14.I我能表导出到使用这样的命令提示符的文件中使用的sqlite3版本3.6.23.1,使用“C”执行API

sqlite3 data.db 

sqlite> .output sample.txt; 

sqlite> select *from sample; 

我希望在应用程序级别处理这种情况。

我正在使用sqlite3开源“C”API在应用程序级别执行此命令。

execute("delete from sample:);// working fine 

execute(".output sample.txt"); //Not working 

其投掷的错误称为"SQL error in sqlite3_exec: near ".": syntax error"

请建议我我如何创建要导入的文件使用此API的数据。

API的函数定义。

int execute(const char* fmt, ...) 
{ 

    char *err_messg; 

    int ret = 0, result = 0; 

    char sql_string[1024] = ""; //this honestly needs to be more elegant; will do for now 

    va_list args; 

    va_start(args, fmt); 

    ret = vsprintf(sql_string, fmt, args); 

    va_end(args); 

    printf("sql_string: %s\n", sql_string); 

    if (!ret) 
     result = 0; 
    else 
     result = 1; 

    if (result != -1) 
    { 

     if (sqlite3_exec(db_conn, sql_string, NULL, 0, &err_messg) == SQLITE_OK) //Actual API which will work with database. 
     { 
      return SUCCESS; 
     } 
     else 
     { 
      printf("\n SQL error in sqlite3_exec: %s\n", err_messg); 
      return DBEXCE_FAIL; 
     } 
    } 
    return SUCCESS; 
} 

回答

3

SQLite的API调用使用的是只接受SQL:
“的sqlite3_exec()接口运行零个或多个UTF-8编码,分号单独传递到它的第二个参数的SQL语句,在上下文数据库连接作为第一个参数传入。“ [from http://www.sqlite.org/c3ref/exec.html]

如果您浏览SQLite的源代码,您可以看到.output命令打开一个文件,然后使用sqlite3_snprintf API编写查询结果的内容给打开的文件句柄。

最新的来源,证明了这种情况是在这里:
http://www.sqlite.org/src/artifact/076e1c90d594644f36027c8ecff9a392cf2d3a06

为.OUTPUT相关部分是这样的:

if(c=='o' && strncmp(azArg[0], "output", n)==0 && nArg==2){ 
    if(p->outfile[0]=='|'){ 
     pclose(p->out); 
    }else{ 
     output_file_close(p->out); 
    } 
    p->outfile[0] = 0; 
    if(azArg[1][0]=='|'){ 
     p->out = popen(&azArg[1][1], "w"); 
     if(p->out==0){ 
     fprintf(stderr,"Error: cannot open pipe \"%s\"\n", &azArg[1][1]); 
     p->out = stdout; 
     rc = 1; 
     }else{ 
     sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]); 
     } 
    }else{ 
     p->out = output_file_open(azArg[1]); 
     if(p->out==0){ 
     if(strcmp(azArg[1],"off")!=0){ 
      fprintf(stderr,"Error: cannot write to \"%s\"\n", azArg[1]); 
     } 
     p->out = stdout; 
     rc = 1; 
     } else { 
     sqlite3_snprintf(sizeof(p->outfile), p->outfile, "%s", azArg[1]); 
     } 
    } 
1

SQLite的外壳的.output命令是一个功能的外壳(以及所有以.开头的其他命令)。如果您正在使用C接口,则应该执行查询来获取所需的行,然后遍历它们,一次一个写入文件。

this tutorial发现示例代码适应...

static int callback(void *handle, int argc, char **argv, char **azColName) { 
    FILE *f = handle; 
    int i; 
    const char *sep = ""; 
    for (i=0;i<argc;i++) { 
     fprintf(f, "%s\"%s\"", sep, argv[i]); 
     sep = ", "; 
    } 
    fprintf(f, "\n"); 
    return 0; 
} 
const char *sql = "SELECT * FROM sample;"; 
sqlite3 *db; 
FILE *f = fopen("sample.csv", "w"); // ought to check for errors here; demo code! 
char *errs = NULL; 

if (sqlite3_open("data.db", &db)) { 
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); 
    sqlite3_close(db); 
    exit(1); 
} 
if (sqlite3_exec(db, sql, callback, f, &errs) != SQLITE_OK) 
    fprintf(stderr, "SQL error: %s\n", errs); 
sqlite3_close(db); 
+0

访问谢谢......最后它的工作.. – user1495372

+0

在上面回调函数的文件指针已closed.so我无法读取该文件。 – user1495372

2

的职位似乎有点老了,但我只是想更新对于任何游客寻找类似的信息。有一个用于SQLite3数据库导入/导出功能的开源C/C++ API。

API可以通过here