0

DataRow オブジェクトからオブジェクトを作成したいのですが、Datarow オブジェクトをトラバースすることで作成できます。ただし、ここでの制約は DataRow 列が固定されていないことです。DataRow が持つことができる列の数には変動がある可能性があります。すべての列がデータ行になるかわからないため、ColumnName に従って DataRow をトラバースできません。

たとえば、私はクラスを持っています

class Abc
{
    string attrib1;
    string attrib2;
    string attrib2;

    public Abc(DataRow dr)
    {
        attrib1 = dr["attrib1"].ToString();
        attrib2 = dr["attrib2"].ToString();
        attrib3 = dr["attrib3"].ToString();
    }
}

これは、DataRow オブジェクトに 3 つの列すべてがある場合に正常に機能します。しかし、そうでない場合、これは例外をスローします

私を助けてください。

次のようにコンストラクターでスイッチケースを使用してみました

class Abc
{
    string attrib1;
    string attrib2;
    string attrib2;

    public Abc(DataRow dr)
    {
         foreach (System.Data.DataColumn dc in record.Columns)
             {
                  switch (dc.ColumnName)
                  { 
                case "attrib1" :
                    attrib1 = dr["attrib1"].ToString();
                    break;
                case "attrib2" :
                    attrib2 = dr["attrib2"].ToString();
                    break;
                case "attrib2" :
                    attrib3 = dr["attrib3"].ToString();
                    break;
            } 
                  }  
           } 
     }      

正常に動作していますが、このアプローチが問題ないかどうかを知りたいです。

この問題を解決するのを手伝ってください

ありがとうございました

4

3 に答える 3

0

switchケースは問題ないと思いますが、defaultラベルを追加してそこに例外をスローすることをお勧めします。これにより、クエリに新しい列を追加する際のデバッグを大幅に節約できます。

于 2012-05-10T07:46:20.823 に答える
0

アルゴリズムがよくありません。

1- 「attrib1」、「attrib2」、「attrib3」を定数にしてください。

2- 擬似コードを参照してください:

if (dr[CONSTANT_ATT1] != null) then attrib1 = dr[CONSTANT_ATT1].ToString();
if (dr[CONSTANT_ATT2] != null) then attrib2 = dr[CONSTANT_ATT2].ToString();
if (dr[CONSTANT_ATT3] != null) then attrib3 = dr[CONSTANT_ATT3].ToString();
于 2012-05-10T07:49:17.140 に答える
0

値のみが必要な場合は、次のコード行を使用して DataRow をオブジェクト配列として取得できます。

object[] itemArray = dr.ItemArray;
于 2012-05-10T08:04:08.033 に答える