Datareader在将数据加载到datatable时有行我得到行计数= 0

时间:2013-01-31 13:37:55

标签: c# asp.net datatable sqldatareader

try
        {
            String empid1 = Request.QueryString["MyText"];

            int empid = int.Parse(empid1);
            string constr = System.Configuration.ConfigurationManager.ConnectionStrings["EmployeeDatabase"].ConnectionString;
            SqlConnection con = new SqlConnection(constr);
            con.Open();
            SqlCommand cmd = new SqlCommand("ReportingManagers", con);
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@EmpID", SqlDbType.Int, 0).Value = empid;

            SqlDataReader dr = cmd.ExecuteReader();
            dr.Read();
            LinkButton3.Text = string.Empty;
            int i = 1;
             while(dr.Read())
            {


                TreeNode parentNode = new TreeNode("L" + i++ + "Manager : " + dr["Emp_Name"].ToString());
                parentNode.Value = dr["Emp_ID"].ToString();
                TreeView1.Nodes.Add(parentNode);
                parentNode.ChildNodes.Add(new TreeNode("Short ID : " + dr["Short_ID"].ToString()));
                parentNode.ChildNodes.Add(new TreeNode("EmpID : " + dr["Emp_ID"].ToString()));
              //  LinkButton3.Text = "Reporting Managers";  
            }

             DataTable dt = new DataTable();
             dt.Load(dr);
             if (dt.Rows.Count > 1)
             {
                 LinkButton3.Text = "Reporting Managers";  
             }

            dr.Close();
            con.Close();
        }

请解释一下为什么我的if循环没有在上面的代码中执行。我可以看到在datatable dt中我得到行数'0'但是我的博士显示为有行...我不想在这个场景中使用sql adapter。

如何在这种情况下捕获数据表的行数?

2 个答案:

答案 0 :(得分:0)

因为在将它加载到TreeNode结构(读取整个读取器的while循环)时已经读过读者。 DataReader只是前传,所以你不能只是“重置”阅读器。

答案 1 :(得分:0)

您无法使用已用于数据末尾的数据加载器加载数据表 尝试以这种方式更改代码执行的顺序

SqlDataReader dr = cmd.ExecuteReader();
LinkButton3.Text = string.Empty;
int i = 1;
DataTable dt = new DataTable();
dt.Load(dr);
if (dt.Rows.Count > 1)
{
    LinkButton3.Text = "Reporting Managers";  
    foreach(DataRow r in dt.Rows)
    {
        TreeNode parentNode = new TreeNode("L" + i++ + "Manager : " + r["Emp_Name"].ToString());
        parentNode.Value = r["Emp_ID"].ToString();
        TreeView1.Nodes.Add(parentNode);
        parentNode.ChildNodes.Add(new TreeNode("Short ID : " + r["Short_ID"].ToString()));
        parentNode.ChildNodes.Add(new TreeNode("EmpID : " + r["Emp_ID"].ToString()));
    }
}