2017-10-12 28 views
0

里面我的C程序,我需要运行下面的编译命令:如何通过C-API运行SQLite3'PRAGMA'命令?

const char *sql = "PRAGMA table_info(family)"; /* 'family' is the table name */ 

但我是否尝试通过sqlite3_exec()例程或sqlite3_prepare_v2()程序来运行该SQL,我的程序停止响应,/在Windows命令提示符工作(这是一个简单的c语言控制台程序)。

有趣的是,当我运行,在命令提示符下相同的编译SQL正常运行的sqlite3.exe本身,它运行得很好,给了以下的输出:

sqlite> pragma table_info(family); 
cid   name  type  notnull  dflt_value pk 
---------- ---------- ---------- ---------- ---------- ---------- 
0   id   INTEGER  0      1 
1   name  TEXT  1      0 
2   nickname TEXT  1      0 
3   dob   TEXT  1   CURRENT_TI 0 

但是我自己的C程序里面没有。我对这个问题做了一些研究。谷歌和SQLite文档都指向this page here官方文档。但不幸的是,所提供的信息并没有使我足以解决问题。我们如何通过C-API成功运行SQLite3'PRAGMA'命令?

编辑:这里是实际有问题的代码行。 OR MCVE

我发现我的程序的失败的原因,并有固定的(线索提供者和Murphy's answer线索。但对于那些有兴趣重现问题,以下是这是造成程序代码的实际行 在我的sqlite3_exec()例程的回调函数中,我有这段代码(for-loop)用于在列名下面打印'----------'字符以模仿“.mode column”&“ .headers on“sqlite3控制台中的输出风格

 int h;  
     for(h=0; h <= (strlen(col_value[i])+5); h++) 
      printf("-"); 

在为PRAGMA sql的结果列dflt_value打印'headers'时,该问题是由strlen()引起的,对于表中的前三列为空。如果我停止运行strlen()dflt_value。该程序运行良好。同样,在sqlite3_prepare_v2()常规问题正在引起以下行:

 int h;  
     for(h=0; h <= (strlen(sqlite3_column_text(stmt, 4))+5); h++) 
      printf("-"); 

如果我删除或评论这些线,全部运行良好 - 尽管没有“.headers on”的风格。

回答

0

sqlite3_exec()的确应该是执行编译指令的方法。你没有给出MCVE(对你不好意思!),但我怀疑你要么忽略处理错误值,要么代码有其他错误。你应该尝试调试它。

+0

谢谢你的线索和线索。我已经提供了MCVE,并且可能涉及到:sqlite3_exec()和sqlite3_prepare_v2(),这两个例程都可以工作。 :) – FAQi