2017-10-12 3 views
0

は、私は次のプラグマコマンドを実行する必要があります。C-API経由でSQLite3 'PRAGMA'コマンドを実行するには?私のCプログラム内

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

をしかし、私はルーチンsqlite3_exec()sqlite3_prepare_v2()ルーチンを経​​由して、このSQLを実行しようとするかどうか、私のプログラムは、Windowsのコマンド・プロンプトでの作業/応答を停止(これはC言語のシンプルなコンソールプログラムです)。興味深いことに

、私はsqlite3.exe自体を実行して、コマンド・プロンプトは通常時と同じプラグマのSQLを実行したときに、それがうまく動作し、出力を次与えます:

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'コマンドを正常に実行するにはどうすればよいですか?

編集:実際の問題のコード行は次のとおりです。私は私のプログラムの失敗の原因を発見した、とMurphy's answerで手がかりとリードの(礼儀、それを固定している。しかし、問題を再現するに興味のある人のために、ここでプログラムを引き起こしていたコードの実際の線であるOR MCVE

sqlite3_exec()ルーチンのコールバック関数の中で、 ".mode column" & "のような列名の下に '----------'文字を印刷するためのコード(for-loop) .headers on "sqlite3コンソールの出力形式。

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

この問題はstrlen()によって引き起こされましたが、PRAGMA SQLの結果列dflt_valueには 'headers'が出力され、テーブルの最初の3つの列はNULLです。私が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

関連する問題