LoginSignup
xxxkousukexxx03
@xxxkousukexxx03 (maru nanaga)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

c++でMySQLを使いたいが<mysql_driver.h>が見つからない

環境はwindows11,VSCordです
競プロ経験が少しあるのみでデータベースを触るのは初めてです
MySQLはインストール後動作確認をしました
MySQL Connector C++をインストールし、以下のコードをコピペしてc++ファイルで動かしたところ、
<mysql_driver.h>が見つからないとのことでした
ご教授願います、、、

#include <iostream>
#include <sstream>
#include <memory>
#include <mysql_driver.h>
#include <mysql_connection.h>
#include <mysql_error.h>
#include <cppconn/Statement.h>
#include <cppconn/ResultSet.h>

//define your own configurations in mysql_config.hpp
//for example: HOST = "tcp://127.0.0.1:3306", USER = "root", PASSWORD = "password"
//             DATABASE = "database_name"
#include "mysql_config.hpp"
using namespace std;

int main()
{
    try {
        sql::mysql::MySQL_Driver *driver = sql::mysql::get_mysql_driver_instance();
        unique_ptr<sql::Connection> con(driver->connect(HOST, USER, PASSWORD));
        unique_ptr<sql::Statement> stmt(con->createStatement());


        stmt->execute("USE " + DATABASE);
        stmt->execute("DROP TABLE IF EXISTS conference");
        stmt->execute("CREATE TABLE conference(cid int, name varchar(10))");
        cout << "\"conference\" table has been created." << endl;

        stmt->execute("INSERT INTO conference VALUES(1, 'SIGMOD')");
        stmt->execute("INSERT INTO conference VALUES(2, 'VLDB')");
        stmt->execute("INSERT INTO conference VALUES(3, 'ICDE')");
        stmt->execute("INSERT INTO conference VALUES(4, 'KDD')");

        unique_ptr<sql::ResultSet> res(stmt->executeQuery("SELECT * FROM conference"));

        size_t row = 0;
        while (res->next()) {
            cout << row << "\t";
            /* You can use either numeric offsets... */
            cout << "cid = " << res->getInt(1);
            /* ... or column names for accessing results. The latter is recommended. */
            cout << ", name = '" << res->getString("name") << "' " << endl;
            row++;
        }

    } catch (sql::SQLException &e) {
        cout << "# ERR: SQLException in " << __FILE__ << " on line " << __LINE__ << endl;
        cout << "# ERR: " << e.what() << endl;
        cout << " (MySQL error code: " << e.getErrorCode();
        cout << ", SQLState: " << e.getSQLState() << " )" << endl;
        return EXIT_FAILURE;
    } catch (runtime_error &e) {
        cout << "# ERR: runtime_error in " << __FILE__ << " on line " << __LINE__ << endl;
        cout << "# ERR: " << e.what() << endl;
        return EXIT_FAILURE;
    }
}
0

1Answer

こちらの事象に該当するかわかりませんが、私がC++でMySQLに接続するコードを書いたときは、MySQL関係のインクルードファイルはfull pathで指定するか、プロジェクトの設定っぽいところで追加のライブラリディレクトリを設定しました。

0

Comments

  1. なるほど、、、
    その際mysql_driver.hのファイルも触りました?
    探しても見つからないんですよね、、

  2. インストーラでしたら、
    C:\Program Files\MySQL\Connector C++ 8.0
    あたりに、
    zipでしたら中を探せばあると思います。

    他にも、MySQLをインストールされたとのことですので、
    C:\Program Files\MySQL\【インストールしたMySQL】\include
    C:\Program Files\MySQL\【インストールしたMySQL】\lib
    にも、接続に必要な.hや.libが含まれています。
    私はこちらを使用しています。コード片を一部コピーして貼り付けておきます。

    C++と言いつつ書き方がCなのは見逃してください。

    //略
    
    //.hや.libを外部参照する場合はconfigを入れるかfull pathにする
    #include <mysql.h>
    #pragma comment(lib, "libmysql.lib")
    #pragma comment(lib, "mysqlclient.lib")
    int func(){
        MYSQL* conn = NULL;
        MYSQL_RES* resp = NULL;
        MYSQL_ROW row;
        char sql_str[255];
        char* sql_serv = MYSQL_CLIENT;
        char* user = MYSQL_USER;
        char* passwd = MYSQL_PASSWORD;
        char* db_name = MYSQL_DB;
        memset(&sql_str[0], 0x00, sizeof(sql_str));
        conn = mysql_init(NULL);
        if (!mysql_real_connect(conn, sql_serv, user, passwd, db_name, 0, NULL, 0)) {
            return 0;
        }
        snprintf(&sql_str[0], sizeof(sql_str) - 1, "select * from xxxx where yyyy = 0 order by id limit 1");
        if (mysql_query(conn, &sql_str[0])) {
            mysql_close(conn);
            return 0;
        }
        resp = mysql_use_result(conn);
        if ((row = mysql_fetch_row(resp)) != NULL) {
            printf("%s", row[1]);
        }
        mysql_free_result(resp);
        mysql_close(conn);
    }
    
  3. 少し調べたのですが、参考にされた情報が少し古いかもしれません。

    mysql-connector-c++-8.3.0-winx64

    のzip版で動作検証をしました。

    zipの中に、includeディレクトリがあります。その中の、mysql/jdbc.hというのに、関連するファイルを全てincludeするコードが確認できると思います。

    includeディレクトリを丸ごと、ソースコードと同じ階層にコピーすれば、特別に指定しなければ相対pathで指定できます。

    このとき、.libファイルをリンクしないとコンパイルできません。例えばソース内に

    #pragma comment(lib, "./mysqlcppconn.lib")
    

    のように書くことができます。mysqlcppconn.libは、
    \mysql-connector-c++-8.3.0-winx64\lib64\vs14
    の中にありました。これも、絶対pathで入れるのが面倒でしたら、ソースコードと同じところに設置してしまえば一旦は動きます。

    コンパイル後、実行しようとすると、いろいろdllが無いと言われます。
    \mysql-connector-c++-8.3.0-winx64\lib64
    の中にあるdllを、コンパイル後の実行ファイルがあるところに置けばOKです。

    #include <iostream>
    #include <sstream>
    #include <memory>
    //#include <mysql_driver.h>
    //#include <mysql_connection.h>
    //#include <mysql_error.h>
    //#include <cppconn/Statement.h>
    //#include <cppconn/ResultSet.h>
    #include "./include/mysql/jdbc.h"
    #pragma comment(lib, "./mysqlcppconn.lib")
    
    
    
    //define your own configurations in mysql_config.hpp
    //for example: HOST = "tcp://127.0.0.1:3306", USER = "root", PASSWORD = "password"
    //             DATABASE = "database_name"
    //#include "mysql_config.hpp"
    
    #define HOST "host"
    #define USER "user_name"
    #define PASSWORD "hogehoge"
    
    
    using namespace std;
    
    int main()
    {
        try {
            sql::mysql::MySQL_Driver* driver = sql::mysql::get_mysql_driver_instance();
            unique_ptr<sql::Connection> con(driver->connect(HOST, USER, PASSWORD));
            unique_ptr<sql::Statement> stmt(con->createStatement());
    
    
            stmt->execute("USE database_name");
            stmt->execute("DROP TABLE IF EXISTS conference");
            stmt->execute("CREATE TABLE conference(cid int, name varchar(10))");
            cout << "\"conference\" table has been created." << endl;
    
            stmt->execute("INSERT INTO conference VALUES(1, 'SIGMOD')");
            stmt->execute("INSERT INTO conference VALUES(2, 'VLDB')");
            stmt->execute("INSERT INTO conference VALUES(3, 'ICDE')");
            stmt->execute("INSERT INTO conference VALUES(4, 'KDD')");
    
            unique_ptr<sql::ResultSet> res(stmt->executeQuery("SELECT * FROM conference"));
    
            size_t row = 0;
            while (res->next()) {
                cout << row << "\t";
                /* You can use either numeric offsets... */
                cout << "cid = " << res->getInt(1);
                /* ... or column names for accessing results. The latter is recommended. */
                cout << ", name = '" << res->getString("name") << "' " << endl;
                row++;
            }
    
        }
        catch (sql::SQLException& e) {
            cout << "# ERR: SQLException in " << __FILE__ << " on line " << __LINE__ << endl;
            cout << "# ERR: " << e.what() << endl;
            cout << " (MySQL error code: " << e.getErrorCode();
            cout << ", SQLState: " << e.getSQLState() << " )" << endl;
            return EXIT_FAILURE;
        }
        catch (runtime_error& e) {
            cout << "# ERR: runtime_error in " << __FILE__ << " on line " << __LINE__ << endl;
            cout << "# ERR: " << e.what() << endl;
            return EXIT_FAILURE;
        }
    }
    
  4. なんかうまくいきました!!
    怖いので色々調べて勉強してみます笑
    ご教授本当にありがとうございました!!!

  5. 解決したのでしたら、本問をクローズしましょう。

Your answer might help someone💌