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

我相信如果可能的话,这样的操作最好在数据库中完成,而不是为数据表行集合中的每一行去数据库。

您可以使用 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
}

如果可以将其移动到数据库(使用存储过程),您可以更清楚地了解您想要做什么

更新:使用将值传递给存储过程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

在存储过程中设置参数:

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 对象的文档以了解其他函数以设置参数。还有其他方法可以让您显式设置 SQL 数据类型,而不是让它从 C# 数据类型中猜测 SQL 数据类型。我唯一需要这个的时候是我想设置一个 Image 值。

旁注让我很早就绊倒了:你不能传入 NULL。如果你想让一个值为空,你必须传入 System.DBNull.Value。毫无疑问,这是有充分理由的,但我觉得这是一种恼人的痛苦。

于 2012-11-15T17:55:05.383 回答
-1

如果您只需要将数据作为参数传递给存储过程,请考虑使用 DataReader。
DataTable 有开销。
DataReader 是更高效、更简单的语法。

SqlDataReader 类

如果您需要 DataTable 来处理其他内容(例如绑定到 DataGrid),那么请继续使用 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 评论说 Reader 会锁定表。
您可以使用 with (no lock) 或读入 List<>;
但是您也可以只使用 DataTable,这对我来说似乎是最好的计划。

于 2012-11-15T17:37:51.243 回答