我在fedora 14中使用sqlite3版本3.6.23.1.我能够使用这样的命令提示符将表导出到文件中,
sqlite3 data.db
sqlite> .output sample.txt;
sqlite> select *from sample;
Run Code Online (Sandbox Code Playgroud)
我想在应用程序级别处理此案例.
我正在使用sqlite3开源"C"API在应用程序级别执行此命令.
execute("delete from sample:);// working fine
execute(".output sample.txt"); //Not working
Run Code Online (Sandbox Code Playgroud)
它的投掷错误叫做 "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;
}
Run Code Online (Sandbox Code Playgroud)
小智 5
您正在使用的 SQLite API 调用只接受 SQL:
“sqlite3_exec() 接口运行零个或多个 UTF-8 编码的、以分号分隔的 SQL 语句传递到其第二个参数中,在作为其第一个参数传入的数据库连接的上下文中.” [来自 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]);
}
}
Run Code Online (Sandbox Code Playgroud)
.outputSQLite shell 的命令是该 shell 的一项功能(以及以 开头的所有其他命令.)。如果您使用 C 接口,则应该执行查询来获取所需的行,并迭代它们,一次将它们写入文件中。
改编自本教程中的示例代码\xe2\x80\xa6
\n\nstatic int callback(void *handle, int argc, char **argv, char **azColName) {\n FILE *f = handle;\n int i;\n const char *sep = "";\n for (i=0;i<argc;i++) {\n fprintf(f, "%s\\"%s\\"", sep, argv[i]);\n sep = ", ";\n }\n fprintf(f, "\\n");\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\nconst char *sql = "SELECT * FROM sample;";\nsqlite3 *db;\nFILE *f = fopen("sample.csv", "w"); // ought to check for errors here; demo code!\nchar *errs = NULL;\n\nif (sqlite3_open("data.db", &db)) {\n fprintf(stderr, "Can\'t open database: %s\\n", sqlite3_errmsg(db));\n sqlite3_close(db);\n exit(1);\n}\nif (sqlite3_exec(db, sql, callback, f, &errs) != SQLITE_OK)\n fprintf(stderr, "SQL error: %s\\n", errs);\nsqlite3_close(db);\nRun Code Online (Sandbox Code Playgroud)\n