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

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

ただいまの
回答率

89.64%

DBに接続できない(C++, cocos2d-x, Mysql, connector/C, Visualstudio2015)

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,892

tsysrtk

score 11

最近プログラムを始めた初心者という前提でお願いいたします。
個人的にcocos2d-xを使ってC++でゲームを作っています。
データ管理のためになじみのあるMysql選択し、C++で接続しようと試みました。
参考にしたサイトは
http://qiita.com/tomov3/items/cd2a3df22f025ff167cd
です。

しかし、なかなかうまくいかず四苦八苦しております。

下準備として、
visualstudioのプロジェクトに
connector/Cと、MysqlのIncludeパス、ライブラリパスは設定しております。

Connector/Cは64bit、 プロジェクトのプラットフォームはWin32です。

include <mysql_driver.h>

include <mysql_connection.h>

include <mysql_error.h>

include <cppconn/Statement.h>

include <cppconn/ResultSet.h>

.
.
.
.

auto driver = sql::mysql::get_mysql_driver_instance();

このコードを書いただけで、

LNK2019    未解決の外部シンボル "declspec(dllimport) class sql::mysql::MySQL_Driver * cdecl sql::mysql::get_driver_instance(void)" (imp_?get_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ) が関数 "class sql::mysql::MySQL_Driver * cdecl sql::mysql::get_mysql_driver_instance(void)" (?get_mysql_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ) で参照されました。

LNK4272    ライブラリのコンピューターの種類 'x64' がターゲットのコンピューターの種類' X86' と競合しています    

と出てしまいます。

したのエラーに関しては、プロジェクトの設定が違う(?)という記事が調べたらでてきましたので、
x64のプロジェクトに設定を変えようと試みましたが、そうした場合cocos2d-xの方で、
エラーが出てしまいます。
そのせいで、ライブラリを読み込めず、上のエラーが出てしまうと認識しています。

そこで、質問があります。

C++でMysqlを接続する方法について(上記エラーや環境設定に対して見落とし、あるいは解決法)
ほかに簡単な方法はないのか?(Mysql以外に接続が容易なRDBMSなど。そしてその方法)

すみませんがご教授のほどよろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • can110

    2017/06/30 14:33

    インストールしたConnector/Cが64bit or 32bitか?とプロジェクトのプラットフォームがx64 or Win32か?を明記ください。

    キャンセル

  • tsysrtk

    2017/06/30 14:41 編集

    Connector/Cは64bit、
    プロジェクトのプラットフォームはWin32です。

    キャンセル

回答 3

checkベストアンサー

+2

C++でMySQLを扱った事がないので、代わりにsqliteをおすすめしておきます。
私自身、仕事でcocos2d-xでsqliteを使ったAndroid/iOSゲームを開発・リリースしていて、実績があるため。

 cocos2d-xにsqliteを導入する方法

http://www.sqlite.org/download.html からsqlite-amalgamation-3190300.zipをダウンロードして展開します。

Classes/以下にこの3つのファイルをコピーします。
sqlite3.c
sqlite3.h
sqlite3ext.h

以上で完了です。
後は必要なところで、sqlite3.hをインクルードする事でsqliteの命令が使えます。

 使い方

「C++ sqlite」でGoogle検索するといろいろ出てきます。

一番目に出てきたページを紹介します。
SQLite C言語向けAPI チートシート - Qiita 

 その他

sqliteのDBをあらかじめ作っておきたい場合は、PupSQLite などのフリーソフトでsqliteのDBファイルを作る事が出来ます。
作ったDBファイル(*.db)をResources以下に配置しておけば良いと思います。


 追記

Resources/test.db の内容をSELECTする例を記載します。

void MainScene::test() {
    sqlite3* db = nullptr;
    if (sqlite3_open("test.db", &db) != SQLITE_OK) {
        return;
    }

    // sampleテーブルの全レコードを抽出
    std::string sql = "SELECT * FROM sample";
    sqlite3_stmt *stmt = nullptr;
    int result = sqlite3_prepare_v2(db, sql.c_str(), 128, &stmt, nullptr);
    if (result != SQLITE_OK) {
        sqlite3_reset(stmt);
        sqlite3_finalize(stmt);
        sqlite3_close(db);
        return;
    }

    int colCount = sqlite3_column_count(stmt);
    while (sqlite3_step(stmt) == SQLITE_ROW) {
        for (int col = 0; col < colCount; col++) {
            std::string name = sqlite3_column_name(stmt, col);
            std::string value = StringUtils::format("%s", sqlite3_column_text(stmt, col));
            CCLOG("name=%s, value=%s", name.c_str(), value.c_str());
        }
    }

    sqlite3_reset(stmt);
    sqlite3_finalize(stmt);
    sqlite3_close(db);
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/07/01 12:44

    手元で試して実際に動作しているコードを回答に追記しました。
    sqlite3_execは使った事がなかったのですが、sqlite3_execでいろいろ試しましたがどうもうまく行きません。
    私がいつも使っている、sqlite3_prepare_v2で動作したのでこっちの例を記載しています。
    それからsqlite3_step(stmt)でカーソルが移動するので、これは必要な回数だけ実行する必要があります。

    キャンセル

  • 2017/07/01 13:00

    ありがとうございます!!!

    name=id, value=test1234
    name=password, value=test1234

    無事データを取得することができました!!!!!
    1週間もC++のDB接続について悩んでいたので、ものすごく感謝です!
    またSQLite関連で困ったら質問を立ち上げるかもしれませんが、
    またその時はよろしくお願いいたします!


    PHPだったら簡単なのに・・・。

    キャンセル

  • 2017/07/01 15:44

    うまく行ったようで安心しました。
    C++も難しいですが、さらにsqlite3のAPIが使いにくいですよね。
    自分も初めて使った時はかなり苦戦しました。
    でも、一度処理を書いてしまえばコピペで済みますので、がんばってください。

    キャンセル

+2

x86=32bit版のEXEにx64=64bit版のライブラリはリンクできないといった意味のエラーです。
開発環境にインストールしたライブラリConnector/C++ と、ご自身のC++プロジェクトのプラットフォームが異なることが原因だと思います。

ビルドするにはx86用のConnector/C++ライブラリのインストールが必要です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/30 15:19

    ご回答ありがとうございます。
    試してみます。

    キャンセル

  • 2017/06/30 16:12

    めちゃくちゃ文字化けしていますが、
    なんとか接続できたみたいです。
    ありがとうございました!!

    キャンセル

+1

メッセージIDである「LNK4272」で検索すると結構出てきます。
内容からするとMYSQLのドライバーがWindowsのbitと合ってないのではと推察されます。
参照先にも「OS に応じて適切なものを選択」とありますよね。
メッセージからすると質問者のOSは32bitと思われますので32bit版のドライバーを利用すると良いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/30 14:31

    なるほど、それはあるかもしれませんね・・・。
    調べてみます。

    キャンセル

  • 2017/06/30 14:35 編集

    解決につながる回答とならずすみません。

    キャンセル

  • 2017/06/30 14:42 編集

    Mysqlについて少し認識が異なっていました。

    ※32bitと書かれていますが、64bit版のPCにも利用することができます

    とのことでした。

    https://techacademy.jp/magazine/1940

    キャンセル

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

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る