2013-02-17 56 views
1

我希望返回不使用adapter.fill技术的Datatable。如何从数据库表中返回数据表,但不使用adapter.fill

internal DataTable ConnectedSelect(string TableName, string[] Cols, string Condition) 
    { 
     DataTable dt = new DataTable(); 
     using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)) 
     { 
      con.Open(); 
      using (SqlCommand cmd = new SqlCommand(GenerateSelectStatment(TableName, Cols, Condition),con)) 
      { 
       SqlDataReader rdr = cmd.ExecuteReader(); 
       object[] temp = new object[rdr.FieldCount]; 
       while (rdr.Read()) 
       { 
        rdr.GetValues(temp); 
        dt.Rows.Add(temp); 
       } 
      } 
     } 
     return dt; 
    } 
    } 

问题是我得到输入数组比这个表中的列数要长。 表有4列 有什么问题? rows.add应该添加一个包含4个与输入相同的元素的行。

回答

2

您可以使用DataTable

dt.Load(rdr); 

整个代码load方法是

internal DataTable ConnectedSelect(string TableName, string[] Cols, string Condition) 
{ 
    DataTable dt = new DataTable(); 
    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString)) 
    { 
     con.Open(); 
     using (SqlCommand cmd = new SqlCommand(GenerateSelectStatment(TableName, Cols, Condition),con)) 
     { 
      SqlDataReader rdr = cmd.ExecuteReader(); 
      if(rdr.HasRows) 
       dt.Load(rdr); 
     } 
    } 
    return dt; 
} 
} 
+0

甜效果很好:) 但怎会有没有在你的代码的循环? – AngelicCore 2013-02-17 09:06:26

+1

dt.Load(rdr)在DataTable中插入阅读器的所有值。在这种情况下,循环不是必需的。 – 2013-02-17 09:10:30

+0

但是读者不一次只返回一行吗? 或dt.load强制它返回所有行? – AngelicCore 2013-02-17 09:28:54