最近、プロジェクトでmysqlデータベースに接続して操作する必要があるため、mysqlデータベースに接続するC ++の方法を研究しました。
C ++でmysqlデータベースに接続するには、1)mysql APIを使用して接続する、2)ADOを介して接続する、3)MySQLによって公式に提供されているMySQL Connector / C ++を介して接続する方法はたくさんあります。
エディターはC ++プログラミング環境を使用し、MySQL公式Webサイトによって提供されるコネクターでMySQLコネクター/ C ++を見つけました(公式ウェブサイトの方が信頼性が高いはずです)。そこで、データベースに接続するためにMySQL Connector / C ++を選択しました。
MySQL Connector / C ++は、SunMicrosystemsによって開発されたMySQLコネクタです。これは、MySQLサーバーを操作するためのオブジェクト指向ベースのプログラミングインターフェイスとデータベースドライバーを提供します。他の多くの既存のC ++インターフェイス実装とは異なり、Connector / C ++はJDBC仕様に従います。つまり、Connector / C ++ DriverのAPIは、主にJava言語のJDBCインターフェースに基づいています。JDBCは、Java言語をさまざまなデータベースに接続するための標準的な産業用インターフェースです。Connector / C ++は、ほとんどのJDBC4.0仕様を実装しています。C ++プログラムの開発者がJDBCプログラミングに精通している場合は、すぐに開始されます。
OK、公式講義の前に、編集者は全員のMySQLサービスがインストールされ実行されており、クライアントからアクセスできることを前提としています。トピックを入力しましょう〜
1. MySQL Connector / C ++をダウンロードします
MySQL公式WebサイトにアクセスしてMySQLコネクタ/ C ++をダウンロードし、アドレスhttps://dev.mysql.com/downloads/connector/cpp/をダウンロードします。
無料インストールバージョン(推奨)であるzipバージョンをダウンロードできます。インストールバージョンであるmsiバージョンをダウンロードすることもできます。ソースコードをダウンロードして自分でコンパイルすることもできます。
システムプラットフォームに応じて、対応するバージョンをダウンロードします。公式の推奨事項によると、開発と使用には、コンパイルされたMySQLConnectorと同じバージョンと同じバージョンを使用するのが最善です。そうしないと、予期しない問題が多数発生する可能性があります。(この編集者は試みを行い、記事の最後に予期しない問題をリストしました(─∙_─∙✧))
エディターで使用されるVSバージョンは2013です。公式の指示(下記)によると、ダウンロードされたMySQLConnectorのバージョンは1.1.9であり、インストールは無料です。
ダウンロードが完了したら、解凍すると、ディレクトリにincludeとlibを含む2つのフォルダが表示されます。
include \はヘッダーファイルです。
lib \には、DLLバージョン(動的)ライブラリとLIBバージョン(静的)ライブラリが含まれています。
- mysqlcppconn.dllおよびmysqlcppconn.libは、ダイナミックライブラリのファイルです。
- mysqlcppconn-static.libは静的ライブラリです。
2.ブーストライブラリを準備します
BoostライブラリのインターフェイスはConnector / C ++ライブラリで使用されるため、アプリケーションにBoostライブラリディレクトリを含める必要があります。
ブーストはhttps://www.boost.org/users/download/からダウンロードするか、SourceForgeからダウンロードできます:https://sourceforge.net/projects/boost/files/boost/
ソースコードをダウンロードして自分でコンパイルすることもできます。具体的なプロセスについては、ここでは詳しく説明しません。。。( ̄ ^  ̄Φ)(子供靴はこの投稿を読むことができます:https://blog.csdn.net/lt4959/article/details/108974041)
……。
……。
エディターはboost-1.58ライブラリーをコンパイルしました。
3. Connector / C ++を使用してデータベース接続を操作します
VSで新しいコンソールプロジェクトTestMySQLを作成し、プロジェクトに含まれるファイルとライブラリを設定します(下の図を参照)。ここで使用する32ビットバージョン、子供靴、必要に応じて構成してください。
ブーストライブラリディレクトリとConnectorC ++ライブラリディレクトリを追加のインクルードディレクトリに追加します。(追記。エディターはブーストライブラリディレクトリを環境変数として構成しているため、環境変数名から直接構成できます。=  ̄ω ̄ =)
ConnectorC ++ライブラリディレクトリを追加のライブラリディレクトリに追加します
追加の依存関係により、ConnectorC ++ライブラリが追加されます。
- 静的ライブラリを使用し、mysqlcppconn-static.libを依存関係に追加します
- ダイナミックライブラリを使用し、依存関係にmysqlcppconn.libを追加し、mysqlcppconn.dllをTestMySQLプロジェクトの出力パスにコピーします。
注:静的ライブラリを使用する場合は、マクロCPPCONN_LIB_BUILDも定義する必要があります。そうしないと、ヘッダーファイルが動的ライブラリと同じ方法で関数をインポートし、多数のエラーが発生します(質問2を参照)。
ヘッダーファイルをインクルードする前にマクロCPPCONN_LIB_BUILDを定義するか、プリプロセッサ定義に追加することができます。
4.テストコードを書く
(PS。Editorは、データベースに「my_test」という名前の新しいデータベースを作成しました)
#include "stdafx.h"
/*
Include directly the different
headers from cppconn/ and mysql_driver.h + mysql_util.h
(and mysql_connection.h). This will reduce your build time!
*/
#include <jdbc/mysql_connection.h>
#include <jdbc/cppconn/driver.h>
#include <jdbc/cppconn/exception.h>
#include <jdbc/cppconn/resultset.h>
#include <jdbc/cppconn/statement.h>
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
try {
sql::Driver *driver;
sql::Connection *con;
sql::Statement *stmt;
sql::ResultSet *res;
/* Create a connection */
driver = get_driver_instance();
con = driver->connect("tcp://127.0.0.1:3306", "root", "ahdms520");
if (con == NULL)
{
cout << "conn is null" << endl;
goto END;
}
cout << "连接数据库服务器成功" << endl;
/* Connect to the MySQL test database */
con->setSchema("my_test");
stmt = con->createStatement();
if (stmt == NULL)
{
cout << "stmt is null" << endl;
goto END;
}
res = stmt->executeQuery("SELECT * FROM `user`;");
int i = 0;
while (res->next()) {
// You can use either numeric offsets...
cout << "id = " << res->getInt(1); // getInt(1) returns the first column
// ... or column names for accessing results.
// The latter is recommended.
cout << ", name = '" << res->getString("name").c_str() << "'" << endl;
i++;
}
cout << "共" << i << "条" << endl;
con->close();
delete res;
delete stmt;
delete con;
}
catch (sql::SQLException& e)
{
std::cout << "# ERR: " << e.what();
std::cout << " (MySQL error code: " << e.getErrorCode();
std::cout << ", SQLState: " << e.getSQLState() << " )" << std::endl;
}
END:
system("pause");
return 0;
}
結果をコンパイルして実行します。
(๑╹ヮ╹๑)ノ勉強すると幸せになります
/ **********************************ゴージャスな分割線ლ(❛◡❛✿)ლ**** ********************************** /
これは、編集者が調査プロセス中に通り抜けたピットのリストです〜
質問1
MySQL公式WebサイトからダウンロードされたZipパッケージには、リリースリポジトリのみが含まれています。VSのデバッグモードでそのLIB(静的)ライブラリを使用すると、次のように一連のエラーが報告されます。
错误 1 error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项: 值“0”不匹配值“2”(TestMySQL.obj 中) E:\workspace\MyTest\TestMySQL\TestMySQL\mysqlcppconn-static.lib(mysql_driver.obj) TestMySQL
これは、現在のプロジェクトがデバッグバージョンであり、参照されるライブラリファイルがリリースバージョンであるため、不一致が発生することを意味します。したがって、現在のデバッグモードをリリースモードに変更します。
参照:https://www.cnblogs.com/lisuyun/p/6410393.html
DLL(ダイナミック)ライブラリを使用してもこの問題は発生しないので、子供靴は安心できます。O(∩_∩)O
質問2
静的ライブラリを使用する場合、コンパイラは次のエラーを報告します。次に、CPPCONN_LIB_BUILDマクロが定義されておらず、プログラムがダイナミックライブラリの方法で関数をインポートする必要があります。
错误 14 error LNK1120: 6 个无法解析的外部命令 E:\workspace\MyTest\TestMySQL\Release\TestMySQL.exe TestMySQL
错误 8 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) class sql::mysql::MySQL_Driver * __cdecl sql::mysql::get_driver_instance(void)" (__imp_?get_driver_instance@mysql@sql@@YAPAVMySQL_Driver@12@XZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL
错误 13 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall sql::SQLString::~SQLString(void)" (__imp_??1SQLString@sql@@QAE@XZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL
错误 12 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: __thiscall sql::SQLString::SQLString(char const * const)" (__imp_??0SQLString@sql@@QAE@QBD@Z) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL
错误 11 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: char const * __thiscall sql::SQLString::c_str(void)const " (__imp_?c_str@SQLString@sql@@QBEPBDXZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL
错误 10 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: class std::basic_string,class std::allocator > const & __thiscall sql::SQLException::getSQLState(void)const " (__imp_?getSQLState@SQLException@sql@@QBEABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@XZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL
错误 9 error LNK2001: 无法解析的外部符号 "__declspec(dllimport) public: int __thiscall sql::SQLException::getErrorCode(void)const " (__imp_?getErrorCode@SQLException@sql@@QBEHXZ) E:\workspace\MyTest\TestMySQL\TestMySQL\TestMySQL.obj TestMySQL
解決策:プリプロセッサー定義にCPPCONN_LIB_BUILDマクロ定義を追加します。
参照:https://www.cnblogs.com/sankeyou/p/4054472.html
質問3
クエリステートメントの実行後にgetStringを介してvarcharフィールドの値を取得すると、メモリ例外が原因でクラッシュします。
解決策:次の方法でvarcharフィールド値を取得します。
res-> getString( "列名").c_str();
参照:https://stackoverflow.com/questions/4822958/mysql-c-connector-getstring-doesnt-work-correctly-while-getint-works-perfe
質問4
MySQL Connector / C ++ 8.0.21がVS2013で使用されている場合(つまり、vs2019によってコンパイルされたバージョンが使用されている場合)、静的ライブラリ、
コンパイル後、次のように一連のエラーが表示されますฺ(▼ヘ▼#)
申し訳ありませんが、このピットエディターは出られません。子供用の靴は適切なバージョンを使用することをお勧めします。ㄟ(▔、▔)ㄏ
(追記:この問題を知っている友達は編集者に教えてください(^ _-))