質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

4108閲覧

C++ SQLiteでのSQLエラーについて(C++, cocos2d-x, SQLite, Visualstudio2015)

tsysrtk

総合スコア15

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

COCOS2D-X

COCOS2D-Xは、 2Dゲームを手軽に開発できるフレームワークのことです。 iPhone(iOS)向け、Android等に対応しており、 実質ワンソースで開発が可能です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/07/06 02:26

編集2017/07/06 02:58

最近プログラムを始めた初心者という前提でお願いいたします。
個人的にcocos2d-xを使ってC++でゲームを作っています。
データ管理のためにSQLiteを使っています。

SQLiteでSQLを投げた時になぜか、エラーの分岐に入ってしまいます。

最初は「job_level」までの抽出で、問題なく製造を行えていましたが、
ステータスも取得しようと思い、追加したらエラーになってしまいます。

// characte_infoテーブルから、ユーザーのキャラクターレコードを抽出
std::string sql = "SELECT chara_id, chara_img, name, sex, job, level, job_level, str, agi, vit, int, dex, luk FROM character_info WHERE chara_id in('";
sql += GameManager::getInstance().characterId["chara_1"];
sql += "','";
sql += GameManager::getInstance().characterId["chara_2"];
sql += "','";
sql += GameManager::getInstance().characterId["chara_3"];
sql += "')";
sqlite3_stmt *pStmt = nullptr;
int result = sqlite3_prepare_v2(pDB, sql.c_str(), 128, &pStmt, nullptr);
if (result != SQLITE_OK) {
// sql失敗時
sqlite3_reset(pStmt);
sqlite3_finalize(pStmt);
sqlite3_close(pDB);
CCLOG("sql error!");
return false;
}

下は実際のsqlの中身です。(出力して確認しました。)

SELECT chara_id, chara_img, name, sex, job, level, job_level, str, agi, vit, int, dex, luk FROM character_info WHERE chara_id in('1','2','3')

DBのツールでこれを直接投げたら取得できるのですが、
ソース内で行うとsql失敗の分岐に入ってしまいます。

どなたかご教授よろしくお願いいたします。

※追記
vitまでは抽出できたのですが、intを入れるとエラーになってしまいました。
もしかして、抽出数に制限でもあるのでしょうか?
とりあえず、今は

SELECT * FROM character_info

で解決していますが、
なぜエラーになるのか知りたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takito

2017/07/06 02:38

sqlite3_prepare_v2 の戻り値 result にはどのような値が返されていますか?
tsysrtk

2017/07/06 02:40

1が帰ってきています。
tsysrtk

2017/07/06 02:40

通常なら0なのですが、vit以降にカラムを追加すると1になってしまいます
guest

回答2

0

ベストアンサー

SQL文のバイト数に-1を指定すると制限なしに出来ます。
無制限が怖ければ、2048とか十分な長さを指定すれば良いです。

cpp

1int result = sqlite3_prepare_v2(pDB, sql.c_str(), -1, &pStmt, nullptr);

投稿2017/07/06 04:02

mingos

総合スコア4025

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsysrtk

2017/07/06 04:05

あぁ、sql文の文字制限なのですね。 理解しました! いつもありがとうございます!
guest

0

int result = sqlite3_prepare_v2(pDB, sql.c_str(), 128, &pStmt, nullptr);

sqlite3_prepare_v2 の仕様を確認してください。

第3引数が、128になっていますが、
取得結果が、128 char を超えていませんか?
クエリの結果を格納する場所の、文字数も足りているか
併せて確認してください。

投稿2017/07/06 03:50

daive

総合スコア2028

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsysrtk

2017/07/06 04:01

>取得結果が 128char を超えていませんか? ここをいじったら無事取得できました。 しかし、128の場合でも前カラム抽出だとできるのはなぜなんでしょうか・・。
daive

2017/07/06 04:17 編集

×前カラム抽出、○全カラム ですよね。 出来る理由は、sqlite3_prepare_v2 のコードを解析してみないと、不明。 SELECT * FROM は、危険なクエリです、カラム(フィールド)順を暗黙の内に当てにしていますが、 SQLでは、*指定では、カラムの順番は規定されません。 画面への表示用途以外では、カラムは必ず指定しましょう。
tsysrtk

2017/07/06 04:59

なるほど・・・そんなことがあるのですね。 ちょうど、画面の表示用でしたのできちんとカラムを指定することにします。 指摘ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問