- 締切済み
リストボックス C# Postgre インサート
ヤフーニュースのURLをlistboxへ入れます。 そしてlistBox 4個の中に入ったURLを全てDBへインサートしたいです。 文字数の関係でコードが全て掲載できなかったのでyahooBoxへ載せました。 大変お手数ですが、以下のURLから見て頂いて何か回答頂けるとうれしいです。 https://box.yahoo.co.jp/guest/viewer?sid=box-l-7b3vo56op2wefu5nppdmkxij6q-1001&uniqid=d45e41a9-c40e-4fb7-ae62-b93d3d217cf5&viewtype=detail 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- Yune-Kichi
- ベストアンサー率74% (465/626)
> foreach (var lb in new[] { listBox1, listBox2, listBox3, listBox4, listBox5 } > ) > foreach (var item in lb.Items) > { > parm.Value = item; > } > > int count = cmd.ExecuteNonQuery(); なぜこういうコードを書いたのですか。 デバッグ実行して,ブレークポイントを最初のforeachにおいて,lb, item, parm.Valueをウォッチしながらステップ実行をしてみましたか。 やりたいのは,「すべてのリストボックス」の「すべての要素」に対して,「SQLを実行したい」のですよね。 そう書かないと,プログラムはそのようには動きません。 私がANo.2で書いたコメントの位置を,勝手に別の場所に書いてもよいと解釈してはいけませんよ。
- n-jun
- ベストアンサー率33% (959/2873)
button1_ClickイベントからEntryDataToDb(String pStrUrl)に データを渡しても渡されるデータは、 String strUrl = listBox1.Text; これだけですよね? そもそもbutton1_Clickイベント内のみで リストボックスコントロールを順次取得し そこから各々の値を取得して 書き込めば良いような気がします。 EntryDataToDb は必要なのでしょうか? ⇒C#はまったく詳しくはありませんが。。。
- Yune-Kichi
- ベストアンサー率74% (465/626)
> 今の状況ですと、listBoxに入ったURL(文字列)はlistBox1つに対して1つしかインサートが出来ていない状況です。 > ですが、やりたい事はlistBoxに入ったURLを全てDBへインサートすることなのです。 > listBox1に入ったURLをインサートし終わったら、listBox2、3、4、5 と全てインサートしたいのです。 とりあえず, // connをopen // parmを作成してcmd.Parametersに追加 // cmd.Prepareすると効率が良くなるかもしれない foreach (var lb in new [] { listBox1, listBox2, listBox3, listBox4, listBox5 }) foreach (T item in lb.Items) // Tはlb.Itemsに追加したオブジェクトの型 { // parm.Valueにitem等の値を設定 // cmd.ExecuteNonQueryを実行 } とやれば全部インサートできます。 ただ,やはりデータはListBoxとは別に持っておいて,それを挿入する形にした方がよいでしょう。 # ちゃんとクラスを分離するのも必要ですが。
補足
Yune-Kichi様 ご連絡ありがとうございます。 こんな感じで書いてみましたがうまく行きません。 初歩的な質問ですみませんが、添削して頂けないでしょうか? try { conn.Open(); foreach (var lb in new[] { listBox1, listBox2, listBox3, listBox4, listBox5 } ) foreach (var item in lb.Items) { parm.Value = item; } int count = cmd.ExecuteNonQuery(); if (count > 0) { MessageBox.Show(count.ToString() + "件登録しました。"); listBox1.Text = ""; } これだと、一番最後に入れたURLのみが5回繰り返してインサートされます。 何かアドバイスを頂ければと思います。 宜しくお願い致します。
- Yune-Kichi
- ベストアンサー率74% (465/626)
何がわからないのかをちゃんと提示して下さい。 「インサートしたいならすればよいのでは」という,身も蓋もない回答で良ければしますが……。 とりあえず,ListBoxはViewとControllerであってModelではないので, DBにinsertするのは,ちゃんと別途用意しておあるModelに保持しておくのが正攻法でしょうね。
補足
Yune-Kichi様 ご連絡ありがとうございます。 今の状況ですと、listBoxに入ったURL(文字列)はlistBox1つに対して1つしかインサートが出来ていない状況です。 ですが、やりたい事はlistBoxに入ったURLを全てDBへインサートすることなのです。 listBox1に入ったURLをインサートし終わったら、listBox2、3、4、5 と全てインサートしたいのです。 どこを書きかえればいいのでしょうか? public void EntryDataToDb(String pStrUrl) { string connStr = "Server=127.0.0.1;Port=5432;User Id=postgres;Password=xxxxxxxxx;Database=xxxxxxxx"; String sql = "INSERT INTO ITEM_DATA (url1) VALUES(@url1)"; @url1 = pStrUrl; 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 = ""; }
補足
ありがとうございます。 ListBoxの中に複数のURLをいれているのですが、それが全て取得できてないようなのです。 もしお時間ありましたら、以下を見て頂けないでしょうか? http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12107085502