

引数受け渡しの練習をし、次にDBから受け取った値を表示しようとしています。DB接続・値取得クラスを作成し、表示するクラスも作成しました。が、この場合はどう引数を使えば良いですか？、、何かアドバイスをください。。。

（DBConnectionクラス）

[code]

        public static void Main()
        {
            string words;
            string con;
            con = "Server = localhost; Port = 5432; User Id = postgres; Password = Password; Database = voc";
            NpgsqlConnection conn = new NpgsqlConnection(con);
            conn.Open();
            var cmd = new NpgsqlCommand(@"select * from t_voc", conn);
            try
            {
    
                NpgsqlDataReader dataReader = cmd.ExecuteReader();
                while (dataReader.Read())
                {
                    for (int i = 0; i < dataReader.FieldCount; i++)
                    {
                        words = dataReader[i].ToString();
                        return words;
                    }
                }
    
            }
            catch (Exception e)
            {
                var ArgumentException = new ArgumentException();
    
            }
    
            conn.Close();
    
[/code]

（表示クラス）

[code]

    public MainForm()
        {
            InitializeComponent();
        }
    
        private static void StartButtonClick(object sender, EventArgs e)
        {
          //まだ途中ですが、ここがとてもややこしいです
          string words = MainForm.
    
        }
    
[/code]


CC BY-SA 3.0
2016-10-22T12:41:38.820
29801
2016-10-22T23:50:45.090
2016-10-22T12:48:59.977
19274
19274
question
c#
引数で値の受け渡し（２）


おそらく理想としては以下のような形式なのだと推測しますが、

[code]

    // 戻り値として使用する型
    class Row
    {
        // 必要な列を定義する
        public string ColumnName1 { get; set; }
        public int ColumnName2 { get; set; }
        public bool ColumnName3 { get; set; }
    }
    
    class DBConnection : IDisposable // このクラス名はDbConnectionと被っているので変更をお勧めします
    {
        // ローカル変数から移動
        NpgsqlConnection conn;
    
        // ローカル変数conからプロパティに変更
        public string ConnectionString { get; set; }
            // ConnectionStringの初期値 (設定ファイルから取得するべき)
            = "Server = localhost; Port = 5432; User Id = postgres; Password = Password; Database = voc";
    
        // メソッドは以下のように変更する
        // public static void Main()
        public List<Row> GetData()
        {
            // 複数行を想定しているのであれば、リストを使用する
            // string words;
            List<Row> list = new List<Row>();
    
            // インスタンスへ移動
            // string con;
            // con = "Server = localhost; Port = 5432; User Id = postgres; Password = Password; Database = voc";
    
            // インスタンス化しているので初回のみ接続を開始する。
            //NpgsqlConnection conn = new NpgsqlConnection(con);
            if (conn == null)
            {
                conn = new NpgsqlConnection(ConnectionString);
    
                // 例外処理はこちらに移動する。
                try
                {
                    conn.Open();
                }
                catch (Exception e)
                {
                    throw new InvalidOperationException("接続の開始中に例外が発生しました。", e);
                }
            }
            var cmd = new NpgsqlCommand(@"select * from t_voc", conn);
    
            // conn.Open()へ移動
            //try
            //{
    
            NpgsqlDataReader dataReader = cmd.ExecuteReader();
            while (dataReader.Read())
            {
                // 一行ごとに値を取り出して設定する
                //for (int i = 0; i < dataReader.FieldCount; i++)
                //{
                //    words = dataReader[i].ToString();
                //    return words;
                //}
                var row = new Row();
                row.ColumnName1 = dataReader.GetString(1);
                row.ColumnName2 = dataReader.GetInt32(4);
                row.ColumnName3 = dataReader.GetBoolean(9);
    
                // 行を戻り値のリストに追加する。
                list.Add(row);
            }
    
            // conn.Open()へ移動
            //}
            //catch (Exception e)
            //{
            //    var ArgumentException = new ArgumentException();
    
            //}
    
            // クローズは1度だけ行う
            // conn.Close();
    
            // 最後に戻り値を返す。
            return list;
        }
    
        // 共通クローズ処理
        public void Dispose()
        {
            conn?.Dispose();
            conn = null;
        }
    }
    
    // 表示側
    private static void StartButtonClick(object sender, EventArgs e)
    {
        // usingで確実にDisposeを行う
        using (var c = new DBConnection())
        {
            // データの受け渡し方
            c.ConnectionString = ...;
            var data = c.GetData();
            textBox1.Text = data[0].ColumnName1;
        }
    }
    
[/code]

上記の通り修正点は多数あるので、まずは簡便な`NpgsqlDataAdapter`+`DataTable`などでデータアクセスについて学ばれた方が良いのではないかと思います。


CC BY-SA 3.0
2016-10-22T23:50:45.090
29820
2016-10-22T23:50:45.090
5750
29801
answer