0

以下のように記述されたストアド プロシージャから値をフェッチするデータテーブルがあります。

SqlConnection sqlcon = new SqlConnection(ConfigurationManager.ConnectionStrings["db"].ConnectionString);
sqlcon.Open();

DataTable dt = new DataTable("tmp");
DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();

SqlCommand cmd = new SqlCommand("usp_abc", sqlcon);

cmd.CommandType = CommandType.StoredProcedure;
da.SelectCommand = cmd;

da.Fill(dt);

ここで、データ テーブルをループして、このデータ テーブルの値を取得し、それをパラメーターとしてストアド プロシージャに渡す必要があります。

4

4 に答える 4

1

このような操作は、データテーブル行コレクションの行ごとに DB に行くのではなく、可能であれば DB で行う方がよいと思います。

foreach を使用してデータテーブルをループ処理し、それぞれDataRowが返された結果の行を表すことができます。

foreach(DataRow row in dt.Rows)
{
     var col1 = row[0];  //access using column index/position

     var firstNameCol = row["FirstName"].ToString();  //access through column name
}

DBに移動できる場合は、やりたいことにもっと光を当てることができます(ストアドプロシージャを使用)

更新:を使用してストアド プロシージャに値を渡すcommand.Parameters

cmd.Parameters.AddWithValue("@FirstName", firstNameCol);
于 2012-11-15T17:33:23.113 に答える
0

以下を使用できます。

foreach (DataRow row in dt.Rows)
{
    foreach(object o in row.ItemArray)
    {

       //do something with o
    }

 } 
于 2012-11-15T17:41:01.740 に答える
0

sproc でパラメータを設定するには:

SqlCommand cmd = new SqlCommand("usp_abc", sqlcon);
cmd.CommandType = CommandType.StoredProcedure;
cmd.parameters.AddWithValue("@foo", "bar");
cmd.parameters.AddWithValue("@plugh", Integer.valueOf(17));

これにより、パラメーター "@foo" が値 "bar" に設定され、パラメーター "@plugh" が値 17 に設定されます。値は、文字列、整数、ブール値、その他の値にすることができます。

パラメータを設定する他の関数については、SqlParameterCollection オブジェクトのドキュメントを参照してください。C# データ型から SQL データ型を推測する代わりに、明示的に SQL データ型を設定できるものもあります。これが必要になったのは、Image 値を設定したいときだけでした。

早い段階でつまずいた補足: NULL を渡すことはできません。値を null にする場合は、System.DBNull.Value を渡す必要があります。これには何らかの正当な理由があることは間違いありませんが、私はそれが厄介な痛みだと思います.

于 2012-11-15T17:55:05.383 に答える
-1

ストアド プロシージャにパラメーターとして渡すデータのみが必要な場合は、DataReader を検討してください。
DataTable にはオーバーヘッドがあります。
DataReader は、より効率的で単純な構文です。

SqlDataReader クラス

他のもの(DataGridへのバインドなど)にDataTableが必要な場合は、DataTableを使用してください.codingbiz +1からの答えは正しいようです。
Servy は、DataRow で値を参照する方法を回答に含める必要があると強く感じています。
序数または列名で実行できます。

row[0];
row["colx"];

しかし、あなたはすでに condigbiz からその回答を得ており、それがあなたの使用するものであるかどうかは、codingbiz に確認する必要があります。

SqlDataReader reader = command.ExecuteReader();
// Call Read before accessing data. 
while (reader.Read())
{
   if (!reader.IsDBnull(0))
   { 
       cmd.Parameters.AddWithValue("@param1", Reader.GetString(0));
   }
}
// Call Close when done reading.
reader.Close();

OPは、リーダーがテーブルをロックするとコメントしました。
with (ロックなし) を使用するか、List<> に読み込むことができます。
しかし、DataTable をそのまま使用することもできます。それが最善の計画のように思えます。

于 2012-11-15T17:37:51.243 に答える