Visual Basic 中学校 掲示板 投稿内容
タグのない投稿を抽出 統計 RSS

Visual Basic 中学校 > 投稿一覧 >

c# SQL接続と実行を別クラスで操作したい。 解決済み

タグの編集...

投稿者 ケンケン   (社会人)   投稿日時 2022/5/27 15:31:48
c# SQL接続と実行を別クラスで操作したい。

// MySQL用
using MySql.Data.MySqlClient;

public class Dblogin
{

   // DBの接続からオープンまで
   // MySQLへの接続情報
   string server = "localhost";
   string port = "3306";
   string database = "mysql";
   string user = "root";
   string pass = "root";
   string charset = "utf8";
   //  接続のインスタンス
   cn = new MySqlConnection();
   cn.ConnectionString = string.Format("Server={0};Port={1};Database={2};Uid={3};Pwd={4};Charset={5}",
   cn.Open();
   イメージです。
 }


   
}

別のフォームで

// MySQL用
using MySql.Data.MySqlClient;

public partial class frmlistsql
{
// DBの取得のみ
         //SQLコマンド定義
         using (MySqlCommand cmd = new MySqlCommand())
            {
              cmd.CommandText = " select C_Tknm from T_Tokuikubun ";
              MySqlDataReader rd = cmd.ExecuteReader();
              if (rd.HasRows == true)
                  while (rd.Read())
                    lsttext.Items.Add(rd["C_Tknm"].ToString());

               //  ファイルクローズ
                rd.Close();
            }

}

  ※ いろいろと足りないのでエラーになります。
    イメージです。


------------------------
|                                  |
|                                  | 
|                                   | 
|    listboxにdataを            |
|    取得                          |
|                                    |
|                                    | 
-----------------------


今コードはDBの接続と取得が一緒に
書いてあります。
クラス化にしたいです。

何方かご存じの方、ご教授お願い致します。




投稿者 るきお   (社会人)   投稿日時 2022/5/27 21:44:50
業務システムなど保守性や再利用性を重視するプログラムの場合、データベースの処理とUIの処理を明確に分離するのはよくあることです。ケンケンさんが、どのようなポイントで悩んでいるのか質問から読み取れませんでしたが、一例を紹介します。

この例は Windows フォーム アプリ(.NET 6)を使い、データベースには Sqlite のインメモリーデータベースを使っています。インメモリーデータベース は接続をCloseするとすべて消えてしまうので、このサンプルでは接続を閉じるのは一番最後です。MySQLのような通常のデータベースであれば、逐一OpenとCloseを行う方が一般的です。

SQLite は NuGet で Microsoft.Data.Sqliteをインストールするだけですぐに使えます。

この例ではデータベースアクセスを DbUtil というクラスで行います。

フォーム側(Form1.cs)
namespace DBandWinUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DbUtil util = new DbUtil();

            List<string> tokuiNames = util.SelectTokuiNames();
            lsttext.Items.AddRange(tokuiNames.ToArray());
        }
    }
}


DbUtil.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Data.Sqlite;

namespace DBandWinUI;

public class DbUtil:IDisposable
{
    private SqliteConnection Connection { get; set; }

    public DbUtil()
    {
        Connection = new SqliteConnection("Data Source=:memory:");
        //インメモリDBの特性上、Closeしたらすべて消えるので、Closeしません。
        Connection.Open();

        CreateTable();
        InsertSample();
    }

    private void CreateTable()
    {
        string sql = "CREATE TABLE T_Tokuikubun (C_Tkid, C_Tknm)";
        using var command = new SqliteCommand(sql, Connection);
        command.ExecuteNonQuery();
    }

    private void InsertSample()
    {
        string sql = "INSERT INTO T_Tokuikubun VALUES (1,'Apple'), (2, 'Banana'), (3, 'Cat')";
        using var command = new SqliteCommand(sql, Connection);
        command.ExecuteNonQuery();
    }

    public List<string> SelectTokuiNames()
    {
        string sql = "select C_Tknm from T_Tokuikubun";
        using var command = new SqliteCommand(sql, Connection);
       
        using var reader = command.ExecuteReader();

        List<string> result = new List<string>();
        while (reader.Read())
        {
            string tknm = (string)reader["C_Tknm"];
            result.Add(tknm);            
        }

        return result;
    }

    //このDisposeは簡易的な実装です。
    public void Dispose()
    {
        Connection.Close();
        Connection.Dispose();
    }
}




投稿者 ケンケン   (社会人)   投稿日時 2022/5/28 12:24:56
素早い回答ありがとうございます。

自分のイメージはるきおさんの通りです。

接続部分は、

 static class Program
 {
            Dblogin  lg = new Dblogin(); 
            この辺で接続したいです。
 
}

上記を呼ぶ時は

        public Form1()
        {
            InitializeComponent();
      この辺で行いたいです。
        }


  接続部分とDBの取得部分をクラスで分けたいです。

  此れが自分なりのクラス化です。

    わたしのイメージ伝わりますか?
  
  DBは、MySqlを使用したいです。

  よろしくお願いいたします。


  
     

投稿者 るきお   (社会人)   投稿日時 2022/5/28 12:54:12
>わたしのイメージ伝わりますか?
うーん。伝わらないです。ごめんなさい。

投稿者 るきお   (社会人)   投稿日時 2022/5/28 12:57:43
あと、ケンケンさんが何に悩んでいるのかもいまいちわからないです。

>接続部分とDBの取得部分をクラスで分けたいです。
分けたいなら、分ければよいと思うのですけど、何か悩んでいることがあるんですよね。
その何か悩んでいることが伝わらないです。

簡単に「イメージ」と言って概略的なプログラムを書くのではなく、動かなくてもエラーになってももっとちゃんとプログラムを書いて投稿していただなかないと読み取れないように思いますね。言葉で説明できるならそれでも良いですが、今のところ言葉では伝わっていません。
私もサンプルプログラムを作るのにそれなりに時間をかけています。

投稿者 ケンケン   (社会人)   投稿日時 2022/5/28 16:10:59
他力本願に成っていた事は事実です。
色々と思考錯誤をしながら試して行きます。

貴重な意見ありがとうございます。

甘えてました。