2012-11-15 103 views
0

我从写为下面的存储过程的DataTable取值:使用数据调用存储过程

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); 

现在,我需要遍历DataTable,并得到这个数据表和传球的值它是作为我存储的proc的一个参数。

+0

的foreach(DataRow的行dt.Rows) { } 我停留在这一点上 – Rash

回答

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 
} 

,甚至可以把你想要做什么,如果它是可能的(使用存储过程)

更新将其移动到DB更多的光线:传递价值存储proc使用command.Parameters

cmd.Parameters.AddWithValue("@FirstName", firstNameCol); 
+0

我如何通过这些值作为参数传递给 – Rash

+0

我已经展示了例如如何让每一列我的存储过程在我的答案中存储在变量中的每一行中的值。将变量传递给你的PROC。 – codingbiz

+0

好吧,我理解你 – codingbiz

-1

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

SqlDataReader Class

如果您需要其他的东西(如绑定到DataGrid)的数据表,然后用数据表和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评论读者会锁表。
您可以使用(无锁)或读入列表<>;
但是,你也可以留在DataTable中,这对我来说似乎是最好的计划。

+0

这是一条评论,而不是答案。 – Servy

+0

@Servy OP表示他们需要获取值并将它们传递给存储过程。 DataReader更高效。如果他们不知道如何循环DataTable,则OP可能不知道DataReader。如果它能达到既定的目标,那么我不同意“不要和回答”。 – Paparazzi

+0

我不是说任何方式都是错的,使用数据读取器可能更合适。这并没有改变,这不是他所问的。如果你想给OP提供可能有用的有趣信息,但在技术上并没有回答他的问题,你应该将其作为评论发布,而不是作为答案。如果它在回答中,除了实际回答您还没有完成的问题之外,还需要回答。您似乎不是一个全新的用户,所以我很惊讶我需要向您解释这一点。 – Servy

0

您可以使用:

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

     //do something with o 
    } 

} 
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” 值 “栏中的” 和参数“@plugh “为值17.该值可以是字符串,整数,布尔值,可能是其他值。

阅读SqlParameterCollection对象的文档以获取其他函数来设置参数。还有一些可以让你明确地设置SQL数据类型,而不是从C#数据类型中猜出SQL数据类型。我唯一需要这个的时候是我想设置一个Image值。

注意到,我很早就绊倒了:你不能通过NULL。如果你希望一个值为null,你必须传入System.DBNull.Value。毫无疑问,这有一个很好的理由,但我觉得这是一个恼人的痛苦。