2012-07-02 39 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