2017-07-28 9 views
1

MySQLデータベースをローカルマシンに接続するためにMySQL C++コネクタを使用しようとしています。mysql C++コネクタの例外:ユーザー 'root' @ 'localhost'(パスワードはNOを使用)のアクセスが拒否されました。&& MySQLサーバーが終了しました

MySQL C++コネクタ7.1.1.9をインストールしてブーストしました。 C++ IDEで。ヘッダパスとコネクタライブラリファイルlibmysqlcppconn-static.aをプロジェクトに追加しました。プロジェクトはうまくコンパイルされます。

しかし、私はローカルデータベースに接続するだけの例を実行しようとします。

try{ 
    sql::mysql::MySQL_Driver *driver; 
    sql::Connection *con; 

    driver = sql::mysql::get_mysql_driver_instance(); 
    // I tried the user root here, but got same exception 
    //con = driver->connect("tcp://127.0.0.1:3306", "root", "password"); 
    con = driver->connect("tcp://127.0.0.1:3306", "user", "password"); 

    delete con; 
} 
catch(sql::SQLException &e) 
{ 
    // Edit1: fix code based on Macxx's comments 
    // a access denied exception is thrown from here. 
    std::cerr << e.what() << '\n'; 
} 


mySQL exceptions: Access denied for user 'root'@'localhost' (using password: NO)
例外がスローされます。私はMySQLがターミナルにアクセスして正しくインストールされていることを確認しました:

$ mysql -u root -p 
Enter password: // <---entered "password" here, so I am sure the password is correct 
Welcome to the MySQL monitor. Commands end with ; or \g. 
Your MySQL connection id is 6 
Server version: 5.7.18-0ubuntu0.16.04.1 (Ubuntu) 

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. 

Oracle is a registered trademark of Oracle Corporation and/or its 
affiliates. Other names may be trademarks of their respective 
owners. 

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. 

mysql> 

これは、コネクタが2番目のパラメータを無視しているようです。私は構造体ConnectOptionsMapを使って[password]を "password"に設定しようとしました。まだ正しく動作していません。
例外を修正するための提案はありますか?


接続が許可された後、約少し何か:私はOracleのMySQLの公式サイトからダウンロードしたバイナリライブラリ(libmysqlcppconn.so/libmysqlcppconn-static.a)を使用して、非常に困難な時間を過ごしました。 実行すると
con->setSchema("AN_EXISTING_DB")
アプリで例外が発生します:MySQL server has gone away;
私が使用している場合:

sql::Statement *st = con->createStatement(); 
st->execute("use AN_EXISTING_DB");` 

悪い配分によるアプリがクラッシュします。

結局、この問題はapt-get(sqlcppconnの初期バージョン)のパッケージを使用して解決しました。
sudo apt-get install libmysqlcppconn-dev 次に、/usr/lib/libmysqlcppconn.so/usr/lib/x86_64-linux-gnu/libmysqlclient.soにライブラリをリンクするためにプロジェクトファイルを変更しました。

[環境]
のUbuntu 16.04.2
のMySQL 5.7
のMySQLコネクタのバージョン:7.1.1.9
のMySQLコネクタのバージョン:7.1.1.7
ブースト1.58.0
G ++ 5.4.0

事前に

おかげ

答えて

0

に変更します。/etc/mysql/my.cnfには、バインドアドレス行があります。

0.0.0.0は、次にMySQLサービスを再起動する=

バインドアドレスに設定してください。

次はプログラムの実行を試みます。

また、MySQLデータベースの作成中に、ユーザーは必ず許可が(Ubuntuは/ Linux上有効)あなたは指示の下に参照することができ、適切です

CREATE USER 'user_user'@'localhost' IDENTIFIED BY 'user_password'; 
CREATE USER 'user_user'@'%' IDENTIFIED BY 'user_password'; 
GRANT ALL ON *.* TO 'user_user'@'localhost'; 
GRANT ALL ON *.* TO 'user_user'@'%'; 

create database user_database; 

grant usage on *.* to [email protected]'localhost' identified by 'user_password'; 
grant usage on *.* to [email protected]'%' identified by 'user_password'; 

grant all privileges on user_database.* to [email protected]'localhost' ; 
grant all privileges on user_database.* to [email protected]'%' ; 

を作り、あなたはQtの上でコードを書いている場合は、以下のコードは、私の作品

QSqlDatabase db; 

    db = QSqlDatabase::addDatabase("QMYSQL"); 

    db.setHostName(DBHost); 
    db.setDatabaseName(DBName); 
    db.setUserName(DBUserName); 
    db.setPassword(DBPassword); 
    db.setPort(DBPort); 


    if (!db.open()) 
    { 
     QMessageBox::critical(this,"Error","Could not connect to database."); 
    } 
+0

ご意見ありがとう、Kamal。私が 'ldd〜/ Qt/5.9/gcc_64/plugins/sqldrivers/libqsqlmysql.so'を実行すると、Qtの方法でデータベースにアクセスしないのです。私は 'libmysqlclient.so.18 => not found'を見つけました。行方不明のライブラリを見つけたり、Qt mysqldriverを再構築する必要があります。それから、ドライバーを作るのにいくつかの問題がありました。それは別の話です。 – r0ng

+0

あなたがubuntuを使っているなら、libmysqlclient-devパッケージをインストールすることができます。 libmysqlclient.so.xを入手する必要があります。 – Kamal

+0

はい、そうです。しかしバージョンは異なっています。確かに、libmysqlclient.so.20です。一方、Qt 5.9.1にはlibmysqlclient.so.18が必要です。 – r0ng

0

以前はpostgresだけを使っていましたが、データベースにアクセスする権限を与えなければならないと思います。これらのスレッドのいくつかを見て、私は、彼らはあなたを助けることを願っています:postgresので

あなたが設定ファイル(pg_hba.confの)を変更する必要があるためリモートアクセスを許可するデータベース。


私は投げられた例外を印刷したいと思う。最後の行を

{ 
    std::cerr << e.what() << std::endl; 
} 
+0

エラーメッセージが表示されます。私が意味することはそれのようなものでした。私はQtを使っていました。だから私はすべてのQtコードを取り除き、その部分を修正するのを忘れてしまった。元の質問を編集します。元の質問の 'e.what();'の内容は ''ユーザー 'root' @ 'localhost'(パスワード:NOを使用)のアクセスが拒否されました。ありがとう – r0ng

関連する問題