質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

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

MySQL

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

2回答

6006閲覧

C#、MySQLを用いた開発でいくつかの疑問点があります

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

MySQL

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2019/01/17 01:09

編集2019/01/17 02:59

C#でMySQLデータベースに接続し、データを取得、表示させたいです。

自分なりに調べてみたところ、以下のような形で実現はできました。

C#

1//サーバー接続 2string connstr = "server=サーバー名; userid=ユーザー名; password=パスワード; database=データベース名;"; 3MySqlConnection conn = new MySqlConnection(connstr); 4conn.Open(); 5 6// データを格納するテーブル作成 7DataTable dt = new DataTable(); 8 9// SQL文と接続情報を指定し、データアダプタを作成 10MySqlDataAdapter da = new MySqlDataAdapter("select * from table", conn); 11 12// データ取得 13da.Fill(dt); 14 15// データ表示 16dataGridView.DataSource = dt;

しかし、いくつか疑問点があります。
1.string connstrに直接サーバー名やユーザー名を記述するのは大丈夫なのか?
(パスワードが直接書いてあるのがセキュリティ的に問題ないのか、ユーザーIDなどが変わったときに毎回プログラムを変更しないといけないのは面倒ではないか)
2.データアダプタはSQLを投げたい度に作成しないとなのか?
3.dataGridView以外の方法で表示させたい場合はどうするのか?
4.サーバーの接続はデータを取得したいタイミングで接続し、データを取得したらその都度閉じるべきなのか?

また、visualstudioを統合開発環境としているのですが、、、
イメージ説明
このサーバーエクスプローラーの活用方法がイマイチわかりません。

データベースを用いた開発は今回が初めてです。拙い質問ばかりですみません。。。
開発環境はvisualstudio2017、C#、MySQL5.7です。
よろしくお願いします。m(__)m

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

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

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

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

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

m.ts10806

2019/01/17 01:30

「大丈夫なのか」は何を気にされているのでしょうか。
退会済みユーザー

退会済みユーザー

2019/01/17 01:36

スミマセン。確かにこれでは分からないですね。修正しました。m(__)m
m.ts10806

2019/01/17 02:45

回答しておいてなんですが。 何となくですが、質問内容に対してタイトルがいっているカテゴリが大きすぎる気がします。 もう少し質問内容に寄せていただけませんか?
退会済みユーザー

退会済みユーザー

2019/01/17 02:51

確かに、質問タイトルが的を射ていないようですね。。。 実は私もこの質問にどのようなタイトルをつけるべきか迷いました。 少し考えて質問タイトルを修正しておきます。ありがとうございました。
guest

回答2

0

ベストアンサー

1.string connstrに直接サーバー名やユーザー名を記述するのは大丈夫なのか?

どういう意味の「大丈夫」か不明ですが、開発環境と運用環境では接続文字列が異なってくるでしょうから、ハードコーディングするのは好ましくないのは確かだと思います。

なので、app.config か settings ファイルに記述するのが普通だと思います。

2.データアダプタはSQLを投げたい度に作成しないとなのか?

何を作っているかによりますが、Windows Forms アプリのように DataAdapter のインスタンスをユーザーの PC に保持して作業を行う場合はそんな必要はないです。

3.dataGridView以外の方法で表示させたい場合はどうするのか?

「dataGridView以外」というと、Windows Forms アプリなら TextBox を並べて 1 レコードずつ表示することもできます。

4.サーバーの接続はデータを取得したいタイミングで接続し、データを取得したらその都度閉じるべきなのか?

DataTable + DataAdapter を使う非接続型アクセスでは、DataAdapter が自動的に接続を Open して DB よりデータを DataTable に取り込み、終わったら自動的に Close してくれますので、プログラマがそのあたりのコードを明示的に書く必要はないです。

このサーバーエクスプローラーの活用方法がイマイチわかりません。

そのあたりは何を知りたいか具体的に書いてもらえないと、範囲が広すぎて説明が難しいです。

【追記】

下の 2019/01/17 11:08 で述べた件を以下に書きます。

  1. の接続文字列の質問についてはセキュリティの問題も考えるということですが、以下の記事が暗号化も含めて詳しく説明していますので見てください。

接続文字列と構成ファイル
https://docs.microsoft.com/ja-jp/dotnet/framework/data/adonet/connection-strings-and-configuration-files

Windows Forms アプリで、MySQL のテーブルのレコード一覧を ADO.NET + Connector/NET を使用して DataGridView に表示し、ユーザーがそれを編集して、編集結果を MySQL に反映するということをしていると思いますが、そうであれば、一度 Visual Studio のウィザードを使って定番の構成のアプリを作ってみてはいかがでしょう?

MySQL でもウィザードは使えます。ウィザードが自動生成するコードを見れば今後の開発の参考になると思います。

DB が SQL Server の場合ですが、以下のチュートリアル、

チュートリアル : データベースへのデータの保存 (単一テーブル)
https://docs.microsoft.com/ja-jp/previous-versions/0f92s97z(v=vs.120)

10 行でズバリ !! 非接続型のデータ アクセス (ADO.NET) (C#)
https://code.msdn.microsoft.com/windowsdesktop/10-ADONET-C-cbfe7688

・・・のように Visual Studio のデータソース構成ウィザードを利用して型付 DataSet + TableAdapter を作って、それを利用してアプリを作ると、以下のページの図のような構造のアプリが、ほとんど自分でコードを書くこと無しに作れます。

Windows フォーム アプリケーションでのデータへの接続
https://docs.microsoft.com/ja-jp/previous-versions/wxt2cwcc(v=vs.120)

操作に慣れると 10 分もかからず作れるはずです。自力で一からコードを書く場合のような種々の問題に悩むことはなくなり、開発工数は激減するはずです。保守工数も減るはずです。お試しください。

データソース構成ウィザードを利用して作った .xsd ファイル

自動生成された型付 DataSet + TableAdapter のコードは .Designer.cs に含まれています。

イメージ説明

実行結果(自分ではコードは一行も書いていません)

イメージ説明

【注】

Visual Studio のウィザードが使う MySql.Data.dll のバージョン 6.9.8 と、GAC の MySql.Data.dll のバージョン 6.9.9 に不一致があって、それが原因でウィザードが期待通り動かないことがありました。

質問者さんの環境ではどうか分かりませんが、以下に詳しい原因と解決策が書いてありますので、目を通してください。

MySQL での TableAdapter 構成ウィザード不具合
http://surferonwww.info/BlogEngine/post/2018/02/10/tableadapter-configuration-wizard-does-not-work-properly-for-mysql.aspx

投稿2019/01/17 01:45

編集2019/01/17 02:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/01/17 01:55

1ずつ丁寧にありがとうございます。m(__)m なるほど!と納得することばかりで大変勉強になりました。 また、サーバーエクスプローラーについては「なんだこれ?」程度で、何をするものなのかが分からない状態です。こちらについては自分でいろいろ触ってみます。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2019/01/17 02:08

1. の接続文字列の件の追加説明と、ウィザードを使って定番の構成のアプリを作ってみてはいかがというお勧めを回答欄に追記しておきます。
退会済みユーザー

退会済みユーザー

2019/01/17 04:32

ありがとうございます。m(__)m 一度アプリを作ってみます。何から何まですいません。勉強になります!
guest

0

C#に限らず一般論の角度から回答してみます。

1.string connstrに直接サーバー名やユーザー名を記述するのは大丈夫なのか?

(パスワードが直接書いてあるのがセキュリティ的に問題ないのか、ユーザーIDなどが変わったときに毎回プログラムを変更しないといけないのは面倒ではないか)

基本的にはプログラムを外側から直接覗く術はありません(覗けたら大変ですよね)
※Webアプリケーションの場合
ユーザーが見ているのは実行結果のみです。
C#ですと毎回コンパイルすることになるのでconfigなど設定ファイルに書いて外に出すのが通例かと思います

2.データアダプタはSQLを投げたい度に作成しないとなのか?

基本的には1SQL1アダプタの生成となると思います。
24.2.3.4. MySqlDataAdapter の使用

MySQLDataAdapter は、データソースに対して適切な SQL 文を使用し、DataSet 内のデータをデータソースのデータと一致するように変える DbDataAdapter.Fill と、データソースのデータを DataSet のデータと一致するように変える DbDataAdapter.Update をマッピングすることによってこのブリッジを供給します。

3.dataGridView以外の方法で表示させたい場合はどうするのか?

これは確かGridViewにデータをバインドしているやり方ですよね。
他に「どこにどう表示させたいか」で手法が変わってくると思います。
単にコンソール出力させたければreaderでループさせて出力するとか。
readerのように個々のデータを取り出せればあとは変数と同じなので、
如何様にも使えますよね。

4.サーバーの接続はデータを取得したいタイミングで接続し、データを取得したらその都度閉じるべきなのか?

.Netがどうか覚えてはないのですが、「毎回閉じる」必要ないと思います。
あくまで「1処理全て終わったら閉じる」形でしょうか。
ですので、コネクションの取得とオープン、クローズを共通のクラスに持っておき、
オープン→コネクションを保持しておいて持ちまわって色々処理→全て終わったらクローズ、という形が望ましいかなと。
中にはセッションにコネクションを保持しておいて半永久的に利用する方法もないわけではないですが(ログアウト時にはクローズする)
1処理終わった際にクローズと言うのが現実的でしょうね。

投稿2019/01/17 01:50

編集2019/01/17 04:36
m.ts10806

総合スコア80850

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

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

退会済みユーザー

退会済みユーザー

2019/01/17 02:07

4.について「1つの処理」でという考えがなかったです。とても参考になりました。 また2.については私自身がデータアダプタなどの仕様を詳しく知らないのでもっと調べてみます。リンクもありがとうございます。参考にします。 とても勉強になりました。ありがとうございます。m(__)m
m.ts10806

2019/01/17 02:09

プログラムによっては(もしくはDBの種類によっては)、処理が終わったら自動的にクローズしてくれるものもありますので、わざわざクローズを書かなくていいケースもあります。
Zuishin

2019/01/17 02:33

クローズの件ですが、おそらく質問者さんが気にされているのは非接続型データアクセスの使い方だと思います。 「1 処理」の単位ですが、接続型である ADO はデータの取得・編集・保存までが一つの処理でした。ADO.NET では、接続→データ取得→切断、データ編集、接続→データ保存→切断、のように、データベースへの接続時間を短くしてデータベースの負荷を減らすという思想で作られています。 なので、using を使って「データ取得」「データ保存」という単位をそれぞれ一処理、合計二処理としてそれぞれクローズするのが望ましい方法です。勝手に切断されるデータベースもありますが、それは期待せず必ず明示的にクローズしてください。
m.ts10806

2019/01/17 02:34

補足ありがとうございます(私も勉強になりました)
alg

2019/01/17 03:58

「string connstrに直接サーバー名やユーザー名を記述するのは大丈夫なのか?」に対して「特に問題ないです。プログラムを外側から直接覗く術はありません(覗けたら大変ですよね)」と回答されている箇所が引っかかりました。デコンパイラ等を使えば覗けます。*直接*覗く術はありません、というのは、何らかのツールを使わない限りは覗く術はない、という意図なのかもしれませんが、仮にそうだとしてもコード内にリテラルで接続文字列を書くのを「問題ない」と言いきるのは問題があると思います。
m.ts10806

2019/01/17 04:09

確かにそうかもしれませんね。 誤解を与える表現だったと思います。 このアプリケーションがどのシーンで使われるかにもよりますね。私がWeb畑なもので、Web前提で回答していました。 少し表現考えてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問