🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

1回答

4411閲覧

C#でMySQLの.NETコネクタを使った接続が出来ない。

TKCpart2

総合スコア11

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2021/03/15 09:18

編集2021/03/16 02:21

前提条件
Windows10、MySQLserver8.0、MySQL connecter Net 8.0.23 を使用

やりたい事
C#のプログラムからMySQLへ接続したいのですが、接続が上手く繋がりません。

ソースコード(全体修正前なので問題だらけですがご容赦ください)

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using MySql.Data.MySqlClient; 6using System.Drawing; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11using System.Net; 12using System.Net.Sockets; 13using System.IO; 14 15namespace 掲示板サーバー 16{ 17 public partial class BoardServer : Form 18 { 19 public BoardServer() 20 { 21 InitializeComponent(); 22 } 23 24 //起動ボタン押した時の処理 25 private void ServerStart() 26 { 27 //下準備(ホスト名からIPアドレス取得) 28 string hostname = Dns.GetHostName(); 29 IPAddress[] iPAddresses = Dns.GetHostAddresses(hostname); 30 IPAddress iP = IPAddress.Parse(iPAddresses[2].ToString()); 31 32 //接続待ちをするオブジェクト作成 33 TcpListener tcpListener = new TcpListener(iP, 45559); 34 try 35 { 36 //接続開始 37 tcpListener.Start(); 38 TcpClient tcp = tcpListener.AcceptTcpClient(); 39 if(tcp.Connected==true) 40 { 41 Console.WriteLine("接続完了"); 42 } 43 else 44 { 45 Console.WriteLine("未接続。。。?"); 46 } 47 48 using (NetworkStream stream = tcp.GetStream()) 49 { 50 using (StreamReader streamReader = new StreamReader(stream)) 51 { 52 using (StreamWriter streamWriter = new StreamWriter(stream)) 53 { 54 string message = streamReader.ReadToEnd(); 55 56 57 //ここからデータベース関係の処理?(今回使用するのはMySQL) 58               //該当コード 59 MySqlConnection mySqlConnection = new MySqlConnection(); 60 61 MySqlConnectionStringBuilder stringBuilder = new MySqlConnectionStringBuilder(); 62 stringBuilder.Database = "keijiban"; 63 stringBuilder.Server = "localhost"; 64 stringBuilder.UserID = "General"; 65 stringBuilder.Password = "ringo"; 66 67 try 68 { 69 mySqlConnection.ConnectionString =$"Database={stringBuilder.Database};Server={stringBuilder.Server};UserID={stringBuilder.UserID};Password={stringBuilder.Password};"; 70 71 mySqlConnection = new MySqlConnection(mySqlConnection.ConnectionString); 72 textBox1.Text= mySqlConnection.ConnectionString.ToString(); 73 mySqlConnection.Open(); 74                 //該当コードここまで? 75 } 76 catch (MySqlException e) 77 { 78 ExceptionBox.Text = "MySQLに接続できません。"; 79 ExceptionBox.Text = e.Message; 80 } 81 82 MySqlScript mySqlScript = new MySqlScript(); 83 84 //主キー判定 85 try 86 { 87 mySqlScript.Query = "SELECT txt_id FROM Board;"; 88 string s = mySqlScript.Execute().ToString(); 89 90 91 if (s == null) 92 { 93 94 mySqlScript.Query = "INSERT INTO Board(txt_id) VALUES(1);"; 95 mySqlScript.Execute(); 96 } 97 else 98 { 99 mySqlScript.Query = "SELECT MAX txt_id FROM Board;"; 100 int icount = mySqlScript.Execute(); 101 icount = +1; 102 string final = icount.ToString(); 103 104 mySqlScript.Query = $"INSERT INTO Board(txt_id) VALUES({final});"; 105 mySqlScript.Execute(); 106 } 107 108 109 mySqlScript.Query = $"INSERT INTO Board(txt_contents) VALUES({message});"; 110 mySqlScript.Execute(); 111 mySqlScript.Query = "SELECT txt_contents FROM Board;"; 112 string txt = mySqlScript.Execute().ToString(); 113 114 streamWriter.WriteLine(txt); 115 } 116 catch (MySqlException e) 117 { 118 ExceptionBox.Text = "SQLクエリ入力又は実行関係?"; 119 ExceptionBox.Text = e.Message; 120 } 121 122 //書き込み終わったらデータベースとの接続切断? 123 mySqlConnection.Close(); 124 125 } 126 } 127 } 128 } 129 catch (Exception e) 130 { 131 ExceptionBox.Text = "その他の例外?クライアント接続?"; 132 ExceptionBox.Text = e.Message; 133 } 134 finally 135 { 136 //接続終了 137 tcpListener.Stop(); 138 } 139 140 141 } 142 143 private void ServerStartButton_Click(object sender, EventArgs e) 144 { 145 ServerStart(); 146 } 147 } 148} 149

試した事
同じような質問があり、NUGETパッケージでmySQL.dataやmySQLコネクタをインストールしましたが駄目でした。ポートも異常ありません。私自身、プログラムを書くのはほぼ始めてなので今まで学んだ文法書などと付き合わし、初歩的なミスがないか調べましたが見つけることが出来ませんでした。出力の例外を見るに、mySQLのDLL内とのことなので何か実行環境のプログラムが足りないのではないか?と考えられるのですが、これが調べても不明でした。最悪、データベースをフルリセットして全部入れ直す方法がありますが、それでは根本的解決にならないと思い、質問した次第です。見辛い文章で誠に申し訳ありません。どうかご教授を頂きたく存じます。

修正の要請を受けて
エラー内容はこの状態で実行すると
The connection property has not been set or is nullと出てきてしまいます。接続文字列の文はインターネット上のstringformat()で書かれたものを参考に$に書き換えただけなのですが…。DLL関連の例外はMySQLの付属コネクタ使用時及びNugetのコネクタ使用時どちらも出力ウィンドウの中にsystem.invalidoperation.exception(MySQL.dllの中)が検出されていました。
ご指摘ありがとうございます。コード全文を載せてみました。一応細かいところは後から手を入れて直していく予定でしたのでクライアントとの接続やSQLクエリなどは問題だらけかもしれません。MySqlConnectionのインスタンスの再生成は問題解決時にMySQLのリファレンスを調べていたところ、ConnectionStringプロパティは自動的な更新がされないことがあり意図しない動作を起こすことがある、とのことだったので変更が効いていないのかと思い、インスタンスを再生成してみましたが、再生成してもしなくても結果は同じでした。一応ブレークポイントや途中の出力命令などでも何度も値は確認しているのですが、文字列自体は入っていて値自体もコメント欄に書いた値と同様のものでした。コードはvisualstudio2019では「問題はみつかりませんでした」となり、実行も可能でした。個人的にはどうやらMySQLのコネクタはNugetの物を使わなければならなかったらしく、MySQLのインストール時についてきたコネクタを使用してしまった後、Nugetから色々引っ張ってきてしまったのでDLLが不足もしくはDLL同士の依存関係か何か?に引っかかっているのではないか?と思うのですが。しかし、私の未熟さが原因でそもそもコードが根本的に間違っていたら申し訳ありません。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TKCpart2

2021/03/15 09:21

申し訳ありません、質問書き込み中に手が滑って投稿ボタンをクリックしてしまいました。 つきましてはこのコメント欄に残りを書かせて頂きます。
TKCpart2

2021/03/15 09:24

ソースコード残り mySqlconection.open(); 試した事 同じような質問があり、NUGETパッケージでmySQL.dataやmySQLコネクタをインストールしましたが駄目でした。ポートも異常ありません。
TKCpart2

2021/03/15 09:32

私自身、プログラムを書くのはほぼ始めてなので今まで学んだ文法書などと付き合わし、初歩的なミスがないか調べましたが見つけることが出来ませんでした。出力の例外を見るに、mySQLのDLL内とのことなので何か実行環境のプログラムが足りないのではないか?と考えられるのですが、これが調べても不明でした。最悪、データベースをフルリセットして全部入れ直す方法がありますが、それでは根本的解決にならないと思い、質問した次第です。見辛い文章で誠に申し訳ありません。どうかご教授を頂きたく存じます。
退会済みユーザー

退会済みユーザー

2021/03/15 09:35

質問欄は編集できるので質問欄に追記してください。 > 接続が上手く繋がりません。 うまくいかないとか言われても具体性がなくてなんだか分かりません。エラーメッセージが出ているなら質問欄にコピペしてください。
TKCpart2

2021/03/15 09:43

了解致しました。修正致します。ご指摘ありがとうございます。
dodox86

2021/03/15 09:50

ソースコードも(要点のみ)とありますが、文末セミコロンが無かったりして読んでいる方にとってはどうも確実な感じを受けません。MySqlconnectionBuilder クラスとは何でしょう? MySqlサーバーはどこにインストールされているのでしょうか? 自マシン(localhost)で正しいですか? まず、C#のプログラムは置いておいて、MySql標準のコマンドラインツールを用いて、同じデータベース接続情報でMySqlサーバーに繋がるのかを試しましょう。そこが出発点です。
TKCpart2

2021/03/15 10:11

了解です。試してきました。 mySQLのコマンドラインツールでログイン、接続する事は可能でした。ソースコードすみません、質問のテンプレートがよくわからず手書きで打ち込んだので抜けていたなら申し訳ありません。MySqlConnectionBuilderクラスはmySQLコネクタのリファレンスに乗っていた接続文字列の項目をプロパティ化し、接続文字列の作成を助けるクラスとありましたので使用しました。
退会済みユーザー

退会済みユーザー

2021/03/15 10:11

他のDB接続ツール等では接続できるのでしょうか?
dodox86

2021/03/15 10:15

> MySqlConnectionBuilderクラスはmySQLコネクタのリファレンスに乗っていた ご提示のコードでは右辺と左辺でクラス名が違っていますね。 > MySqlconnectionBuilder stringBuilder > =new MySqlconnectionStringBuilder()
TKCpart2

2021/03/15 10:19

申し訳ございません、他のDB接続ツールと言いますとどのようなものでしょうか?私個人としてはMySQLのコマンドラインツール、.NETのコネクタ及び他(c++やjavaなど?)言語の接続ツールぐらいしか分からないのですが…。オープンソースの配布されたDBクライアントのようなものでしょうか?だとしたら申し訳ありません、インストールしていないのでお時間掛かってしまうかもしれません。
TKCpart2

2021/03/15 10:22

申し訳ございません!左辺が誤りです。正しくはMySqlconnectionStringBuilderです。
dodox86

2021/03/15 10:29 編集

> 接続文字列の文はインターネット上のstringformat()で書かれたものを参考に$に書き換えただけなのですが…。 > mySqlConnection.ConnectionString > =$"Database={stringBuilder.Database}; > Server={stringBuilder.Server}; > UserID={stringBuilder.UserID}; > Password={stringBuilder.Password}; 何となくこの処置も怪しい気がしますが。結果的にどのような文字列になっているか確認しましたか。せっかくMySqlconnectionStringBuilderを使って、そのクラスのプロパティに値をセットしているのであれば、最終的に適切な接続文字列を作るのは ToString()で良い気がします。(試していないので、あくまで"気がする"、ですが) https://dev.mysql.com/doc/dev/connector-net/8.0/html/T_MySql_Data_MySqlClient_MySqlConnectionStringBuilder.htm https://docs.microsoft.com/ja-jp/dotnet/api/system.data.common.dbconnectionstringbuilder.tostring?view=net-5.0#System_Data_Common_DbConnectionStringBuilder_ToString
TKCpart2

2021/03/15 10:49 編集

申し訳ありません、こんなにお手数をおかけしてしまって、、。一応文字列にして出力させて見ましたが、結果としては database=keijiban;server=localhost; userid=General;password=ringo; でした。すみません、長々とかかってしまって、、。
退会済みユーザー

退会済みユーザー

2021/03/15 11:02

user id=root ではなくて?
TKCpart2

2021/03/15 11:10 編集

管理者権限のアカウントでもやりましたが表示内容の文字列はrootとパスワード以外同じで入る事ができませんでした。そして、ごめんなさい、ワタワタしてて現状報告の情報が少なすぎました。以後気をつけます。コードは今のところ目に見えてわかるエラー起こしている訳ではないです…。
TKCpart2

2021/03/15 11:12

すみません、出力に例外ありました。system.invalidoperationexception(MySql.Data.dllの中) 少し調べてみます。
退会済みユーザー

退会済みユーザー

2021/03/16 00:29 編集

まず質問に載ってるサンプルコードが色々おかしいです。 C#の変数名、クラス名は大文字小文字を区別します。MySqlconnectionBuilderというクラスは無いですし、変数名がmysqlConnectionがmySqlConnectionと書いてある箇所もあったり、セミコロンが抜けているようにも見受けられ、そのまま貼り付けた状態ではコンパイル通りません。 現在は違うなら、質問を修正してコンパイルが通ったものをそのままコピペしてください。
退会済みユーザー

退会済みユーザー

2021/03/16 00:39

一回newで作成したMySqlConnectionを、わざわざまた作り直している辺りも気になりますが、そもそもConnectionStringはきちんと設定されているのでしょうか? ブレークポイントを設定し、デバッグ実行で変数を確認したい場所で停止させ、変数やクラスのプロパティ値を覗いたりしてみてください。 [Visual Studio デバッガーでブレークポイントを使用する] https://docs.microsoft.com/ja-jp/visualstudio/debugger/using-breakpoints?view=vs-2019
dodox86

2021/03/16 02:19

なぜ、TcpListenerを使っているのでしょう。クライアントからの接続を待つサーバープログラムなのですか?全体的なプログラムの意図が不明です。先のコメントで「ポートに異常はありませんでした」との記載がありましたが、それと関連していますか? 「DBサーバーへの接続を確認する」ことのためには、まず、その部分だけの(機能の)コードで試すのが定石です。
退会済みユーザー

退会済みユーザー

2021/03/16 02:45

> 個人的にはどうやらMySQLのコネクタはNugetの物を使わなければならなかったらしく、 Connector/NET のことを言っているならそうではありません。 MySQL をフルインストールすると以下の記事のようになりますが、その際 Connector/NET すなわち MySql.Data.dll は GAC にインストールされ、レジストリ、machine.config などもそれを使うように書き換えられます。 MySQL をインストールしました(その 3) http://surferonwww.info/BlogEngine/post/2020/04/20/installation-of-mysql-on-new-desktop-pc.aspx なので、それをそのまま使うのが基本で、 > Nugetから色々引っ張ってきてしまった などということはしてはいけません。 ただし、Visual Studio との不整合(というより MySQL にインストールに含まれる MySQL for Visual Studio との不整合ですが)で Visual Studio のウィザードが動かないということがあり、そういう場合は MySQL Installer で Connector/NET ごと入れ替えるという処置となります。 その事例は以下の記事を見てください。 MySQL での TableAdapter 構成ウィザード不具合 http://surferonwww.info/BlogEngine/post/2018/02/10/tableadapter-configuration-wizard-does-not-work-properly-for-mysql.aspx TableAdapter 構成ウィザードで不具合(その 2) http://surferonwww.info/BlogEngine/post/2020/04/21/tableadapter-configuration-wizard-does-not-work-2nd.aspx 多分もう何が起こっているか分からない状況と思いますが、とにかくまず Nugetから色々引っ張ってきてしまったものをアンインストールして、コードも問題を再現できるとことまでどんどん削ってもっと簡単にして試してみてはいかがですか。
TKCpart2

2021/03/16 03:38

すみません。色々手を尽くしてくださったところ申し訳ないのですが、dodoxさんのご指摘どおりDB接続機能のみでテストプログラムを作ったところ解決してしまいました。どうやらMySQLの接続はすでに最初から開いていたようです。「The connection property has not been set or is null」はこのconnection propertyは接続文字列の間違いではなく、ただ単にSQLのクエリーが間違っていただけなようです。お騒がせして申し訳ございませんでした。  今回の1件質問するまでもなかったようですが、他にも沢山勉強になりました。皆さん本当にありがとうございました。  疑問の回答として、TcpListnerを使用しているのは単に他のコンピューター(まずは試作型の為localhostと)と通信を開く方法がこの方法以外に思いつかず、逆引き事典で見つけてから公式リファレンスを参考に作ってみました。もし、もっと良い方法があれば申し訳ないです。サーバーの目的としては自分からリファレンスを調べたりしてプログラムを書くのは初めてなので(今までは入門書のサンプル改変など)クライアントからデータを受け取って処理する、かつDBとの接続も盛り込むという最低限の機能しか盛り込んでいません。なのでこのプログラムは試作練習用で深い意味は特にありません。 皆さん親身に教えて下さりありがとうございました。後ほどベストアンサーを選ばせて頂きます。
退会済みユーザー

退会済みユーザー

2021/03/16 03:41

> 後ほどベストアンサーを選ばせて頂きます。 自分で回答欄に解決した方法をできるだけ詳しく書いて、それで解決としてください。
TKCpart2

2021/03/16 04:11

了解致しました。書いておきます。
退会済みユーザー

退会済みユーザー

2021/03/16 04:11

もう既に解決されたみたいですが、 catch (MySqlException e) { ExceptionBox.Text = "SQLクエリ入力又は実行関係?"; ExceptionBox.Text = e.Message; } 例外処理はMessageだけ取得するより、e.ToString() した方がより詳細な情報が出力されます。 例外クラス名、StackTrace等もエラー原因・発生個所の特定に重要な情報です。
TKCpart2

2021/03/16 05:04

了解致しました。勉強になります。ありがとうございます。
guest

回答1

0

自己解決

解決方法
原因が思い当たらなかったのでデータベースへのプログラムのみを切り出し、別のプロジェクトでテストしてみました。

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10using MySql.Data.MySqlClient; 11using System.IO; 12using System.Net; 13 14namespace 実験環境 15{ 16 public partial class Form1 : Form 17 { 18 public Form1() 19 { 20 InitializeComponent(); 21 } 22 23 private void Test() 24 { 25 MySqlConnection mySqlConnection = new MySqlConnection(); 26 27 MySqlConnectionStringBuilder stringBuilder = new MySqlConnectionStringBuilder(); 28 stringBuilder.Database = "keijiban"; 29 stringBuilder.Server = "localhost"; 30 stringBuilder.UserID = "General"; 31 stringBuilder.Password = "ringo"; 32 33       //接続文字列 34 mySqlConnection.ConnectionString = $"Database={stringBuilder.Database};Server={stringBuilder.Server};UserID={stringBuilder.UserID};Password={stringBuilder.Password};"; 35 36 using (mySqlConnection = new MySqlConnection(mySqlConnection.ConnectionString)) { 37 mySqlConnection.Open(); 38 39 //現在のデータベース接続状態を文字列にして出力 40 ConnectionState connectionState = new ConnectionState(); 41 connectionState = mySqlConnection.State; 42 outputbox.Text = connectionState.ToString(); 43 44 MySqlScript mySqlScript = new MySqlScript(); 45 mySqlScript.Query = "INSERT INTO Board(txt_id) VALUES(1);"; 46 mySqlScript.Execute(); 47 mySqlScript.Query = "SELECT * FROM Board;"; 48 outputbox.Text = mySqlScript.Execute().ToString(); 49 mySqlConnection.Close(); 50 } 51 } 52 53 private void ExcuteButton_Click(object sender, EventArgs e) 54 { 55 Test(); 56 } 57 } 58} 59

結果は接続済みになっていました。「The connection property has not been set or is null」のconnection propertyは接続文字列の間違いではなく、SQLのクエリーが間違っていただけでした。

投稿2021/03/16 04:58

TKCpart2

総合スコア11

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問