当前位置:  开发笔记 > 数据库 > 正文

使用sqlite3_exec

如何解决《使用sqlite3_exec》经验,为你挑选了1个好方法。

我有下一个SQLITE3命令生成一个超过6000万条记录的文件:

.mode csv
.output matppp.csv
select mat, ppp from matppp order by mat;
.output stdout

如何使用以下命令将这些命令包含到C程序中:

 sqlite3_exec(db, "..........", NULL, 0, &db_err); 

当我自己尝试这样做时,c程序在执行时会生成表达式错误.

谢谢!!



1> bk...:

如果你想在C中执行此操作(而不是使用sqlite3的命令行程序来管理那些具有那些漂亮的点命令),那么你将不得不使用回调.

为了您的剪切和粘贴方便,这里是代码,被用于统计计算的Apophenia库中.

第一部分:

sqlite3 *db=NULL; //The global database handle.

static int apop_db_open(char *filename){
    if (!filename)  
        sqlite3_open(":memory:",&db);
    else            
        sqlite3_open(filename,&db);
    if (!db)
        printf("Not sure why, but the database didn't open.\n");
    return 0;
}

//From the SQLite manual:
#define ERRCHECK {if (err!=NULL) {printf("%s\n",err); sqlite3_free(err);  return 0;}}

apop_data * apop_sqlite_query_to_screen(char *query){
  char *err = NULL;
    if (db==NULL) 
        apop_db_open(NULL);
    sqlite3_exec(db, query, The_Callback, a_param, &err); 
    ERRCHECK
}

第二部分:

回调将具有以下形式,并为返回的每一行运行一次.注意参数a_param如何传递; 如果你不需要它(如本例所示),只需将其设置为NULL即可.

int The_Callback(void *a_param, int argc, char **argv, char **column){
    for (int i=0; i< argc; i++)
        printf("%s,\t", argv[i]);
    printf("\n");
    return 0;
}


如果你得到一个错误,你应该打印它,然后用sqlite3_free(错误)释放它;
推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有