C++/CLIでMySQLを使う方法を教えてください。

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/07 15:26:06
  • 終了:2010/03/14 15:30:02

ベストアンサー

id:a532 No.3

a532回答回数31ベストアンサー獲得回数22010/03/08 13:54:37

ポイント26pt

[MySQLの接続機能]


調べてみたら、MySQLに接続させるための機能は2種類あるようです。

ひとつは、MySQL Connector/ODBC という機能で、もうひとつは、MySQL Connector/Net という機能です。

前者のMySQL Connector/ODBC のサンプルコード等は、

OdbcConnection

MySQL

のキーワードで検索して下さい。

後者のMySQL Connector/Net は、

MySqlConnection

MySqlDataAdapter

のキーワードで検索して下さい。

どちらでも良いと思いますが、名前から、おそらく、後者のMySQL Connector/Net の方が新しい機能だと思います。



[C♯からC++/CLIへの書き換え]

サンプルは見つかっても、VB.NET用とC♯だと思います。

よって、C♯のサンプルコードをC++/CLIへ書き換えて下さい。

私の開発用PCには、MySQLをインストールしていないので、Accessの場合での書き換えを下記に示します。申し訳ないのですが。

比較例ということで。

書き換えのコツがつかめると、本件以外でも、C♯のサンプルが使えますので、これを機会にチャレンジしてみて下さい。


<C♯時>

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1326641...



<C++/CLI時>




//----------------

// Form1クラスのメンバー変数

private: System::Data::OleDb::OleDbConnection^ dbConnect; // DB接続子

private: String^ SelectedTableName; // 選択テーブル名



//----------------

// データベース接続

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

{

// 接続文字列を作成して接続

dbConnect = gcnew System::Data::OleDb::OleDbConnection();

dbConnect->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source = C:\\Program Files\\Microsoft Office\\Office\\Samples\\ADDRBOOK.MDB";

try

{

dbConnect->Open();

MessageBox::Show("接続に成功", "接続状態通知");

dbConnect->Close();

}

catch (Exception^ ex)

{

MessageBox::Show(ex->Message, "接続状態通知");

}

//データベースに接続してテーブル名を取得する

dbConnect->Open();

DataTable^ dTab = dbConnect->GetOleDbSchemaTable(System::Data::OleDb::OleDbSchemaGuid::Tables, gcnew array<Object^> { nullptr, nullptr, nullptr, "TABLE" });

dbConnect->Close();

//テーブル名をリストボックスに設定

for each (DataRow^ dr in dTab->Rows)

{

listBox1->Items->Add(dr[2]->ToString());

}


}





//----------------

// リストボックスで指定されたテーブルを表示

private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e)

{


// 選択テーブル名

SelectedTableName = listBox1->SelectedItem->ToString();

// データセット等のオブジェクト生成

System::Data::OleDb::OleDbDataAdapter^ dataAdap;

DataSet^ dataSet = gcnew DataSet(SelectedTableName);

// データセットにテーブル情報を取得

dataAdap = gcnew System::Data::OleDb::OleDbDataAdapter("SELECT * FROM " + SelectedTableName, dbConnect);

dataAdap->Fill(dataSet, SelectedTableName);

// データセットに取得したテーブル情報をDataGridViewに設定

dataGridView1->DataSource = dataSet->Tables[SelectedTableName];


}




[書き換えのポイント]

重要な書き換えのポイントは、見比べれば分かるように、わずかです。

ClassName1.ClassName2 obj = new ClassName1.ClassName2();

は、以下に書き換え。

ClassName1::ClassName2^ obj = gcnew ClassName1::ClassName2();

また、

obj.func();

は、

obj->func();

あと、配列の書式は、

ClassName[]

は、

array<ClassName^>

null

は、

nullptr


そういった、おおまかなポイントを書き換えてから、ビルドしてみれば、あとの細かな違いは、エラーメッセージが知らせる箇所を修正するだけです。

その他の回答(2件)

id:Km1967 No.1

Km1967回答回数224ベストアンサー獲得回数352010/03/07 16:10:06

ポイント27pt

MySQLのバージョンにあわせたMySQL ODBCを準備すれば良いだけのはずだが単語だけでは無理だとすると入門書でも読んでもらうほうが先かもしれん

世界でいちばん簡単なVisualC++のe本―標準C++とC++/CLIの基本と考え方がわかる本

世界でいちばん簡単なVisualC++のe本―標準C++とC++/CLIの基本と考え方がわかる本

  • 作者: 金城 俊哉
  • 出版社/メーカー: 秀和システム
  • メディア: 単行本

MySQL ODBCについては下から辿ってくれ。

http://dev.mysql.com/doc/refman/5.1/ja/myodbc-introduction.html

id:central_dogma

ありがたいです。

2010/03/08 09:11:52
id:karla No.2

karla回答回数130ベストアンサー獲得回数42010/03/07 19:59:08

ポイント27pt

mysqlppというライブラリを使いMySQLへアクセスしていました。

元々、MySQLに標準で含まれていたものです。

http://tangentsoft.net/mysql++/

サンプルを見てもらうと分かりますがシンプルに書ける

ライブラリとなっています。

http://tangentsoft.net/mysql++/doc/html/userman/tutorial.html#si...

id:central_dogma

どうもです。

2010/03/08 09:11:54
id:a532 No.3

a532回答回数31ベストアンサー獲得回数22010/03/08 13:54:37ここでベストアンサー

ポイント26pt

[MySQLの接続機能]


調べてみたら、MySQLに接続させるための機能は2種類あるようです。

ひとつは、MySQL Connector/ODBC という機能で、もうひとつは、MySQL Connector/Net という機能です。

前者のMySQL Connector/ODBC のサンプルコード等は、

OdbcConnection

MySQL

のキーワードで検索して下さい。

後者のMySQL Connector/Net は、

MySqlConnection

MySqlDataAdapter

のキーワードで検索して下さい。

どちらでも良いと思いますが、名前から、おそらく、後者のMySQL Connector/Net の方が新しい機能だと思います。



[C♯からC++/CLIへの書き換え]

サンプルは見つかっても、VB.NET用とC♯だと思います。

よって、C♯のサンプルコードをC++/CLIへ書き換えて下さい。

私の開発用PCには、MySQLをインストールしていないので、Accessの場合での書き換えを下記に示します。申し訳ないのですが。

比較例ということで。

書き換えのコツがつかめると、本件以外でも、C♯のサンプルが使えますので、これを機会にチャレンジしてみて下さい。


<C♯時>

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1326641...



<C++/CLI時>




//----------------

// Form1クラスのメンバー変数

private: System::Data::OleDb::OleDbConnection^ dbConnect; // DB接続子

private: String^ SelectedTableName; // 選択テーブル名



//----------------

// データベース接続

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e)

{

// 接続文字列を作成して接続

dbConnect = gcnew System::Data::OleDb::OleDbConnection();

dbConnect->ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source = C:\\Program Files\\Microsoft Office\\Office\\Samples\\ADDRBOOK.MDB";

try

{

dbConnect->Open();

MessageBox::Show("接続に成功", "接続状態通知");

dbConnect->Close();

}

catch (Exception^ ex)

{

MessageBox::Show(ex->Message, "接続状態通知");

}

//データベースに接続してテーブル名を取得する

dbConnect->Open();

DataTable^ dTab = dbConnect->GetOleDbSchemaTable(System::Data::OleDb::OleDbSchemaGuid::Tables, gcnew array<Object^> { nullptr, nullptr, nullptr, "TABLE" });

dbConnect->Close();

//テーブル名をリストボックスに設定

for each (DataRow^ dr in dTab->Rows)

{

listBox1->Items->Add(dr[2]->ToString());

}


}





//----------------

// リストボックスで指定されたテーブルを表示

private: System::Void listBox1_SelectedIndexChanged(System::Object^ sender, System::EventArgs^ e)

{


// 選択テーブル名

SelectedTableName = listBox1->SelectedItem->ToString();

// データセット等のオブジェクト生成

System::Data::OleDb::OleDbDataAdapter^ dataAdap;

DataSet^ dataSet = gcnew DataSet(SelectedTableName);

// データセットにテーブル情報を取得

dataAdap = gcnew System::Data::OleDb::OleDbDataAdapter("SELECT * FROM " + SelectedTableName, dbConnect);

dataAdap->Fill(dataSet, SelectedTableName);

// データセットに取得したテーブル情報をDataGridViewに設定

dataGridView1->DataSource = dataSet->Tables[SelectedTableName];


}




[書き換えのポイント]

重要な書き換えのポイントは、見比べれば分かるように、わずかです。

ClassName1.ClassName2 obj = new ClassName1.ClassName2();

は、以下に書き換え。

ClassName1::ClassName2^ obj = gcnew ClassName1::ClassName2();

また、

obj.func();

は、

obj->func();

あと、配列の書式は、

ClassName[]

は、

array<ClassName^>

null

は、

nullptr


そういった、おおまかなポイントを書き換えてから、ビルドしてみれば、あとの細かな違いは、エラーメッセージが知らせる箇所を修正するだけです。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません