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

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

ただいまの
回答率

88.06%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,682
退会済みユーザー

退会済みユーザー

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

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

//サーバー接続
string connstr = "server=サーバー名; userid=ユーザー名; password=パスワード; database=データベース名;";
MySqlConnection conn = new MySqlConnection(connstr);
conn.Open();

// データを格納するテーブル作成
DataTable dt = new DataTable();

// SQL文と接続情報を指定し、データアダプタを作成
MySqlDataAdapter da = new MySqlDataAdapter("select * from table", conn);

// データ取得
da.Fill(dt);

// データ表示
dataGridView.DataSource = dt;


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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/01/17 10:30

    「大丈夫なのか」は何を気にされているのでしょうか。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/01/17 10:36

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

    キャンセル

  • m.ts10806

    2019/01/17 11:45

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/01/17 11:51

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

    キャンセル

回答 2

checkベストアンサー

+7

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 10:55

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

    キャンセル

  • 2019/01/17 11:08

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

    キャンセル

  • 2019/01/17 13:32

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

    キャンセル

+1

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 11:34

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

    キャンセル

  • 2019/01/17 12:58

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

    キャンセル

  • 2019/01/17 13:09

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

    キャンセル

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

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る