none
検索した複数のレコードを配列に取得したい RRS feed

  • 質問

  • DBで検索した複数のレコードを配列に取り込もうとしています。
       データセット名; OrderDataSet  (dsGoods)
       テーブル名:     Goods
       フィールド名:   GoodsId,  GoodsName,  Price

    調べたところVBでは,
    Dim dr2() As OrderDataSet.GoodsRow
    dr2 = dsGoods.Goods.Select("GoodsName LIKE '" + key + "%'");
    としていましたので,わからないなりにこれをC#に書き換えてみましたがエラーへの対処の方法がわかりません。

    エラー 型 'System.Data.DataRow[]' を型 'Sample5_2.OrderDataSet.GoodsRow' に暗黙的に変換できません。 
    OrderDataSet.GoodsRow[] dr2;
    dr2 = new OrderDataSet.GoodsRow[] { dsGoods.Goods.Select("GoodsName LIKE '" + key + "%'") };

    どうすればいいのでしょうか。お教え願います。

    2006年7月24日 7:49

回答

すべての返信

  • まず、エラーの意味はわかりますか?
    Selectメソッドの戻り値がDataRow[] なのに型変換なしに
    OrderDataSet.GoodsRow[] に代入しているからです。

    これで用が足りるのかわかりませんが、
    こんな感じでどうでしょうか。

    // 案1:配列をDataRow[]で宣言
    DataRow[] dr2;
    dr2 = dsGoods.Goods.Select("GoodsName LIKE '" + key + "%'");

    // 案2:Selectメソッドの戻り値をキャスト(できるんだろうか)
    OrderDataSet.GoodsRow[] dr2;
    dr2 = (OrderDataSet.GoodsRow[])dsGoods.Goods.Select("GoodsName LIKE '" + key + "%'") ;

    たぶんどちらもコンパイルは通ると思います。

    # 型付DataSetのSelectメソッドは考えたことなかったな。

    2006年7月24日 8:41
  • mars12さん,ありがとうございました。

    おかげさまで解決できました。

    案1のときのレコードの取り出し方がわかりません。これについてもお教えいただけますと嬉しいのですが。よろしくおねがいします。

            private void tbxShohin_KeyDown(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Enter & tbxShohin .Text !="")
                {
                    string key = tbxShohin.Text;

                    //検索

           //案1

           //DataRow[] dr2;
                    //dr2 = dsGoods.Goods.Select("GoodsName LIKE '" + key + "%'");

          //案2

                    OrderDataSet.GoodsRow[] dr2;
                    dr2 = (OrderDataSet.GoodsRow[])dsGoods.Goods.Select("GoodsName LIKE '" + key + "%'");

                    //確認
                    if (dr2.Length ==0)
                    {
                        richTextBox1.Text = "";
                        MessageBox.Show("該当するレコードはありません");
                    }
                    else
                    {
                        string str = "";

                        for (int i = 0; i < dr2.Length ; i++)
                        {
                            str += dr2Idea.GoodsID.ToString().PadRight(6, ' ')
                            + dr2Idea.GoodsName.ToString().PadRight(17, ' ')
                            + dr2Idea.Price.ToString() + '\n';
                        }
                        richTextBox1.Text = str;
                    }

        }

        *電球のマークのところは,[ i ]です。(書き方の説明はどこかにあるのでしょうか?)

    2006年7月24日 9:58
  • 型指定されていないなら、



    dr2Idea["GoodsID"].ToString();

     

    のようにすれば良いと思います。

    #[code]の中でも電球に変換されちゃいますね。この説明って、どこかで見たことあるんですが、探せません。以前のMSDN Forumsにあったのかなぁ・・・?

    2006年7月24日 11:48
    モデレータ

  • 案1のときのレコードの取り出し方がわかりません。

    とはどういう意味でしょうか?

    DataRow のヘルプを見てもわかりませんか?



    DataRow[] dr2;
    ・・・
    str += ((int)dr2[ i ]["GoodsID"]).・・・

     

    #追記
    お~、かぶった。
    [ i ] <-このようにスペースを空けるとよい?

    2006年7月24日 11:49
  • mars12さん,trapemiyaさん,囚人さん,ありがとうございました。
    2006年7月25日 4:12