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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
n-nn-n

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

#1

投稿記事 by n-nn-n » 2年前

タイトル通りですが、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;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 2年前

insert の対象である MY_DATA テーブルが無いためにエラーになっている可能性が考えられます。
参照している MY_DATA.db が(正しいディレクトリに)存在するか、
正しく MY_DATA テーブルを作ったか(テーブル名にtypoが無いかなど)を確認してください。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

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

#3

投稿記事 by box » 2年前

SQLのど素人が横から失礼します。
投げているSQL文の
insert into MY_DATA values (?, ?, ?, ?);
?, ?, ?, ?の部分、本当にそれでいいんですか?
それとも伏せ字にしているだけですか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

n-nn-n

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

#4

投稿記事 by n-nn-n » 2年前

みけCAT 様

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

コード:

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

n-nn-n

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

#5

投稿記事 by n-nn-n » 2年前

box 様

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

box
記事: 2002
登録日時: 14年前

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

#6

投稿記事 by box » 2年前

sqlite系関数から返ってきたリターンコードを
printf()してみる、などという、最もシンプルな
デバッグ手法は試していますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

n-nn-n

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

#7

投稿記事 by n-nn-n » 2年前

そのリターンコードがSQLITE_ERROR(1)なのです。
SQLITE_ERRORを調べてみても
「SQLITE_ERROR の結果コードは、より具体的なエラーコードがない場合に使用される汎用的なエラーコードです。」
と書いてるだけでよくわからないのです。

n-nn-n

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

#8

投稿記事 by n-nn-n » 2年前

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

返信

“C言語何でも質問掲示板” へ戻る