前提条件
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同士の依存関係か何か?に引っかかっているのではないか?と思うのですが。しかし、私の未熟さが原因でそもそもコードが根本的に間違っていたら申し訳ありません。
回答1件
あなたの回答
tips
プレビュー