ページ 11

sqlite3_prepare_v2でエラー処理に入ってしまいます

Posted: 2022年5月31日(火) 07:44
by n-nn-n
タイトル通りですが、sqlite3_prepare_v2がうまく処理されません。
結果コードでSQLITE_ERROR(1)が返ってきてるのはわかってるのですが、
調べても解決できませんでした。
解決策をご存じの方がいらっしゃいましたら、ご教授くだいさい。

コード:

pOpen sqlite3_open = NULL;
pPrepare_v2 sqlite3_prepare_v2 = NULL;
pBind_text sqlite3_bind_text = NULL;
pStep sqlite3_step = NULL;
pFinalize sqlite3_finalize = NULL;
pReset sqlite3_reset = NULL;
pClose sqlite3_close = NULL;

hDll = LoadLibrary("sqlite3");

sqlite3_open = (pOpen)GetProcAddress(hDll, "sqlite3_open");
sqlite3_prepare_v2 = (pPrepare_v2)GetProcAddress(hDll, "sqlite3_prepare_v2");
sqlite3_bind_text = (pBind_text)GetProcAddress(hDll, "sqlite3_bind_text");
sqlite3_step = (pStep)GetProcAddress(hDll, "sqlite3_step");
sqlite3_finalize = (pFinalize)GetProcAddress(hDll, "sqlite3_finalize");
sqlite3_reset = (pReset)GetProcAddress(hDll, "sqlite3_reset");
sqlite3_close = (pClose)GetProcAddress(hDll, "sqlite3_close");

/*中略*/

ret = sqlite3_open((char*)"MY_DATA.db", &db);
if (ret != SQLITE_OK)
{
	sqlite3_close(db);
	FreeLibrary(hDll);
	return 0;
}

ret = sqlite3_prepare_v2(db, "insert into MY_DATA values (?, ?, ?, ?);", -1, &stmt, NULL);
if (ret != SQLITE_OK)
{
	sqlite3_close(db);
	FreeLibrary(hDll);
	return 0;
}

Re: sqlite3_prepare_v2でエラー処理に入ってしまいます

Posted: 2022年5月31日(火) 20:06
by みけCAT
insert の対象である MY_DATA テーブルが無いためにエラーになっている可能性が考えられます。
参照している MY_DATA.db が(正しいディレクトリに)存在するか、
正しく MY_DATA テーブルを作ったか(テーブル名にtypoが無いかなど)を確認してください。

Re: sqlite3_prepare_v2でエラー処理に入ってしまいます

Posted: 2022年5月31日(火) 20:27
by box
SQLのど素人が横から失礼します。
投げているSQL文の
insert into MY_DATA values (?, ?, ?, ?);
?, ?, ?, ?の部分、本当にそれでいいんですか?
それとも伏せ字にしているだけですか?

Re: sqlite3_prepare_v2でエラー処理に入ってしまいます

Posted: 2022年5月31日(火) 20:38
by n-nn-n
みけCAT 様

回答ありがとうございます。
他の自作関数内でselect文でデータを取得する処理をしています。
同じくMY_DATA.dbのMY_DATAというテーブルで、そちらは動作します。
処理の違いといえば、そちらのselect文ではプレースホルダを使う必要がないので
sqlite3_prepare_v2関数ではなく、sqlite3_exec関数を使用しているくらいです。

コード:

sqlite3_exec(db, "select * from MY_DATA", result_callback, 0, &err);

Re: sqlite3_prepare_v2でエラー処理に入ってしまいます

Posted: 2022年5月31日(火) 20:43
by n-nn-n
box 様

SQLインジェクション対策でプレースホルダを利用しています。
この後?の部分には正式な値を入れる処理をしています。
ですが、その処理に行く前にエラー判定になってしまってる状態なので困っています。

Re: sqlite3_prepare_v2でエラー処理に入ってしまいます

Posted: 2022年5月31日(火) 21:12
by box
sqlite系関数から返ってきたリターンコードを
printf()してみる、などという、最もシンプルな
デバッグ手法は試していますか?

Re: sqlite3_prepare_v2でエラー処理に入ってしまいます

Posted: 2022年5月31日(火) 21:30
by n-nn-n
そのリターンコードがSQLITE_ERROR(1)なのです。
SQLITE_ERRORを調べてみても
「SQLITE_ERROR の結果コードは、より具体的なエラーコードがない場合に使用される汎用的なエラーコードです。」
と書いてるだけでよくわからないのです。

Re: sqlite3_prepare_v2でエラー処理に入ってしまいます

Posted: 2022年6月01日(水) 14:35
by n-nn-n
色々試しました。
他の関数内でselect文でデータを取得している処理の部分で
sqlite3_prepare_v2を使用してselect文を試してみたところ正常に動作しました。
また逆に、今回質問させていただいてる関数内にある
sqlite3_prepare_v2で上記select文をコピペしてもエラーを吐きました。
この2つの関数でsqlite3_prepare_v2が実行されるまでの違いは変数宣言と引数、
関数の呼び出しが親ウィンドウかダイアログウィンドウかくらいで
ほぼほぼ同じと言っていいです。
なぜこのようなことが起きるのでしょうか?