none
リストボックス C# PostgreSQL RRS feed

  • 質問

  • 環境:C# PostgreSQL FrameWork4.0

    リストボックス C# PostgreSQL

    つい昨日まで以下のコミュ二ティを利用させて頂いてたんですが、
    なぜかアクセスが出来なくなってしまったので、初参加ですが、どうぞ宜しくお願い致します。
    http://www.wankuma.com/

    いままで知恵袋などで部分的な質問をしてきましたが、完成図を作った上で質問した方がより早く正解に近づけると思い、この度完成図の資料を作成して、質問させて頂いております。

    エクセルのイメージ図がありますので以下からご覧下さい。
    http://yahoo.jp/box/sWh-1i

    1、概要
    まず、yahooニュースの記事のURLをリストボックスへ仕分けして入れます。(マウスドラッグ)。
    (芸能なら1、ITなら2、経済なら3という具合です。)
    画面はWebBrouzerコントロールを使用。
    すると、リストボックスに入ったURLがDBへ全て格納される。
    格納された後はそのURLへアクセスし画面表示されるようにする。

    ・格納のされ方
    リストボックスは5つあり、格納ボタンが一つある。
    格納ボタンを押すとリストボックス1から順にURLがDBに格納される。
    その後、リストボックス2、3、4、5と順に格納されるように作りたい。
    リストボックス1に入ったものはテーブルA、2はテーブルB、3はテーブルC、4はテーブルD、5はテーブルEへ格納されるようにしたいです。

    DBに格納された後は、格納された順にURLが読み込まれて、一定の間隔で画面に表示されるようにする。

    上記の続きになりますが、以下のようなプログラムを作りたいと思っています。


    エクセル表にあるように、5個のリストボックスにURLをランダムにドラッグして入れます。

    そして、格納ボタンを押す。

    すると、dispテーブル(DB)にURLが入り、画面表示がスタートする。

    5個のリストボックスにそれぞれ入っているURLに1つ1つアクセスして表示しては次の表示(表示とは1つのニュースのURLにアクセスして、そのニュースのページを開くという意味です)に移り、全体的な順序としてはリストボックス1→リストボックス2→リストボックス3→リストボックス4→リストボックス5

    全てのURLへのアクセス及び表示が終わったらストップする。

    この様なプログラムを作りたいと思っています。
    まずリストボックスへ格納、その後表示という具合です。

    わからない部分はいつくかあるのですが、まず一つ質問を記載させて頂きます。
    【1】現状ですと、リストボックス1、2、3、4、5、に入ったURLは「item_data」テーブルにまとめて格納されるようになっております。
    これを、リストボックス1は「item_data」、リストボックス2は「item_data2」、リストボックス3は「item_data3」に格納(同じように4、5)としたいです。

    これをやるには以下の記述をリストボックスの数(5回)だけ書かないとならないのでしょうか?
    どのように書いてあげれば【1】を実現できるでしょうか?
    他にもおかしな点あると思いますので指摘して頂ければと思います。
    初歩的な質問ですいませんがどうぞ宜しくお願い致します。

    ---------------------------------------------------
     String connStr = "Server=127.0.0.1;Port=5432;User Id=postgres;Password=xxxxxxxx;Database=xxxxxxxx";
                        String sql = "INSERT INTO ITEM_DATA (url1) VALUES(@url1)";
                        @url1 = lb.Text;

                            using (NpgsqlConnection conn = new NpgsqlConnection(connStr))
                            {
                                using (NpgsqlCommand cmd = new NpgsqlCommand(sql, conn))
                                {
                                    NpgsqlParameter parm;
                                    parm = new NpgsqlParameter("@url1", NpgsqlDbType.Varchar);
                                    parm.Value = url1;
                                    cmd.Parameters.Add(parm);
                                    //parm = new NpgsqlParameter("@name", NpgsqlDbType.Varchar);
                                    //parm.Value = name;
                                    //cmd.Parameters.Add(parm);
                                    //  NpgsqlConnection conn = new NpgsqlConnection("Server=127.0.0.1;Port=5432;User Id=postgres;Password=xxxxxxxx;Database=xxxxxxxx;");             
                                    try
                                    {
                                        conn.Open();

                                        int count = cmd.ExecuteNonQuery();
                                        if (count > 0)
                                        {
                                            MessageBox.Show(count.ToString() + "件登録しました。");

                                            listBox1.Text = "";
                                        }
                                        NpgsqlCommand com = new NpgsqlCommand("SELECT * FROM item_data", conn);
                                        NpgsqlDataReader reader = com.ExecuteReader();

                                        //Console.WriteLine("{0}\t");

                                        // 1 行ずつ読み込む
                                        //while (reader.Read())
                                        //{
                                            // 列の分だけ表示
                                            //for (int i = 0; i < reader.FieldCount; ++i)
                                            //{
                                            //    Console.WriteLine("{0}\t", reader[i]);
                                            //}
                                        //}
                                    }
                                    catch (Exception m)
                                    {
                                        Console.WriteLine(m.ToString());
                                    }
                                    finally
                                    {
                                        conn.Close();
                                    }

                                }
                            }
     --------------------------------------------------------------

    2013年5月27日 15:25

回答

  • まず一点だけですが・・・
    仮に5つのテーブルからデータを引っ張ってくるとしても
    NpgsqlConnection でデータベースと接続するのは一度だけで充分です。

    実装方法に関してですが、
    Npgsql.Net といえどもインターフェイスは基本的に ADO.NET データプロバイダ共通なので、
    Npgsql.Net の情報が足りなければ、ADO.NETのコードを参考にするといいと思います。


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答の候補に設定 星 睦美 2013年6月3日 1:27
    • 回答としてマーク 星 睦美 2013年6月6日 6:25
    2013年5月28日 2:07
    モデレータ
  • SQL文を文字列で組み立てているのですから、リストボックスに応じてテーブル名を変えてSQL文を組み立てれば良いと思います。ユーザーが入力した値を使ってSQL文を組み立てているわけではありませんから、SQLインジェクションの心配もありません。
    ただ、お勧めは、ストアドプロシージャ(ユーザー定義関数)を定義し、そちらで処理をさせることです。格納先のテーブルは何らかのパラメーターを用意し、それで制御すれば良いでしょう。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2013年6月3日 1:27
    • 回答としてマーク 星 睦美 2013年6月6日 6:25
    2013年5月28日 2:58
    モデレータ

すべての返信

  • まず一点だけですが・・・
    仮に5つのテーブルからデータを引っ張ってくるとしても
    NpgsqlConnection でデータベースと接続するのは一度だけで充分です。

    実装方法に関してですが、
    Npgsql.Net といえどもインターフェイスは基本的に ADO.NET データプロバイダ共通なので、
    Npgsql.Net の情報が足りなければ、ADO.NETのコードを参考にするといいと思います。


    ひらぽん http://d.hatena.ne.jp/hilapon/

    • 回答の候補に設定 星 睦美 2013年6月3日 1:27
    • 回答としてマーク 星 睦美 2013年6月6日 6:25
    2013年5月28日 2:07
    モデレータ
  • SQL文を文字列で組み立てているのですから、リストボックスに応じてテーブル名を変えてSQL文を組み立てれば良いと思います。ユーザーが入力した値を使ってSQL文を組み立てているわけではありませんから、SQLインジェクションの心配もありません。
    ただ、お勧めは、ストアドプロシージャ(ユーザー定義関数)を定義し、そちらで処理をさせることです。格納先のテーブルは何らかのパラメーターを用意し、それで制御すれば良いでしょう。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答の候補に設定 星 睦美 2013年6月3日 1:27
    • 回答としてマーク 星 睦美 2013年6月6日 6:25
    2013年5月28日 2:58
    モデレータ
  • フォーラム オペレーターの星 睦美です。
    mskozou さん、こんにちは

    コミュニティの回答者からの返信に引き続き質問がありませんので
    今回の質問に参考になるヒントが見つかったのではないかと思います。

    私のほうで[回答としてマーク] させていただきました。
    もし回答の内容に質問したい場合には遠慮なく[回答としてのマークの解除]をして返信できます。

    今後ともMSDN フォーラムをよろしくお願いします。


    日本マイクロソフト株式会社 フォーラム オペレーター 星 睦美

    2013年6月6日 6:32