使用ExecuteReader而不是SQLDataAdapter

时间:2014-03-31 21:14:05

标签: c# dataset code-behind

我有一个C#项目,我正在尝试导出数据网格的结果。有时数据会变得非常大,因此我不想重新执行代码,而是将数据集转储到会话变量中。

这在我的大多数项目中都很有效。我使用它的项目中的一个例子是:

    protected void Page_Load(object sender, EventArgs e)
    {
            SqlConnection sqlconnectionStatus = new SqlConnection(str);
            string DDL_Value = Convert.ToString(Request.QueryString["DDL_Val"]);
            //Use the ClassTesting class to determine if the dates are real, and fill in today's date if they're blank
            string StDt_Value = ClassTesting.checkFields(Request.Form["txtStartDate"], "Date");
            string EnDt_Value = ClassTesting.checkFields(Request.Form["txtEndDate"], "Date");

            //string StDt_Value = Convert.ToString(Request.QueryString["StDt_Val"]);
            //string EnDt_Value = Convert.ToString(Request.QueryString["EnDt_Val"]);

            string BTN_Value;
            // Because the date is stored as an INT, you have to request the string and then
            //   convert it to an INT
            string StDT_Vals = Request.QueryString["StDt_Val"].ToString();
            string EnDT_Vals = Request.QueryString["EnDt_Val"].ToString();


                //sqlquery = "Select PROC_NM as 'Agent Name', AdminLevel as Role, Count(Claim_ID) as 'Count of Claims Reviewed', Spare as AgentID ";
                //sqlquery = sqlquery + "from ClosedClaims_MERGE CCM ";
                sqlquery = "Select PROC_NM as 'Agent Name', AdminLevel as Role, Count(DISTINCT Claim_ID) as 'Count of Claims Reviewed', Spare as AgentID ";
                sqlquery = sqlquery + "from (SELECT DISTINCT Spare, SpareFinished, CLAIM_ID FROM ClosedClaims_MERGE ";
                sqlquery = sqlquery + "UNION SELECT DISTINCT Spare, SpareFinished, CLAIM_ID FROM tblAuditing) CCM ";
                sqlquery = sqlquery + "LEFT JOIN PROC_LIST PL ON CCM.Spare = PL.LOGIN ";
                sqlquery = sqlquery + "WHERE CCM.SpareFinished >= '" + StDt_Value + "' AND CCM.SpareFinished <= '" + EnDt_Value + "' ";
                sqlquery = sqlquery + "GROUP BY Spare, PROC_NM, AdminLevel ";
                sqlquery = sqlquery + "ORDER BY Count(Claim_ID) DESC";


            SqlConnection con = new SqlConnection(str);
            SqlCommand cmd = new SqlCommand(sqlquery, con);
            SqlDataAdapter adapter = new SqlDataAdapter(cmd);

            // Fill the DataSet.
            DataSet ds = new DataSet();
            adapter.Fill(ds, "dsEffVol");

            // Add this to a session variable so the datagrid won't get NULLed out on repost
            Session["SSEffVol"] = ds;

            // Perform the binding.
            grdEffVol.Attributes.Add("style", "overflow:auto");
            //GridView_WODetails.Attributes.Add("style", "table-layout:fixed");

            grdEffVol.AutoGenerateColumns = true;
            grdEffVol.DataSource = ds;
            grdEffVol.DataBind();

    }

我有一个新项目,我没有使用SQL字符串,而是基于SQL Server存储过程提取数据。代码块有:

    protected void btnSubmit_OnClick(object sender, EventArgs e)
    {
        List<ReportData> myReportData = new List<ReportData>();
        using (SqlConnection connection1 = new SqlConnection(str2))
        {
            //Query the Reports table to find the record associated with the selected report
            using (SqlCommand cmd = new SqlCommand("SELECT * from RM_tblManagerReports WHERE ReportID =  " + cboFilterOption.SelectedValue + "", connection1))
            {
                connection1.Open();
                using (SqlDataReader DT1 = cmd.ExecuteReader())
                {
                    while (DT1.Read())
                    {
                        //Read the record into an "array", so you can find the SProc and View names
                        int MyRptID = Convert.ToInt32(DT1[0]);
                        string MyRptName = DT1[1].ToString();
                        string MyRptSproc = DT1[2].ToString();
                        string MySQLView = DT1[3].ToString();
                        string MyUseDates = DT1[4].ToString();

                        //Run the Stored Procedure first
                        SqlConnection connection2 = new SqlConnection(str2);
                        SqlCommand cmd2 = new SqlCommand();
                        cmd2.CommandType = CommandType.StoredProcedure;
                        cmd2.CommandText = "" + MyRptSproc + "";
                        cmd2.Connection = connection2;


                        //Set up the parameters, if they exist
                        if (MyUseDates != "N")
                        {
                            cmd2.Parameters.Add("@StDate", SqlDbType.Date).Value = DateTime.Parse(txtStDate.Value);
                            cmd2.Parameters.Add("@EnDate", SqlDbType.Date).Value = DateTime.Parse(txtEnDate.Value);
                        }
                        else
                        {
                        }

                        try
                        {
                            connection2.Open();
                            GridView_Reports.EmptyDataText = "No Records Found";
                            SqlDataReader dr = cmd2.ExecuteReader(CommandBehavior.CloseConnection);
                            Session["SSRptMenu"] = dr;
                            GridView_Reports.DataSource = dr;
                            GridView_Reports.DataBind();
                            // Add this to a session variable so the datagrid won't get NULLed out on repost


                            GridView_Reports.DataBound += GridView_Reports_RowDataBound;
                        }
                        catch (Exception ex)
                        {
                            ScriptManager.RegisterStartupScript(btnSubmit, typeof(Button), "Report Menu", "alert('There is no View associated with this report.\\nPlease contact the developers and let them know of this issue.')", true);
                            Console.WriteLine(ex);
                            return;
                        }
                        finally
                        {
                            connection2.Close();
                            connection2.Dispose();
                        }

                    }
                }
            }
        }
    }

我有点猜测我的方式,我不确定我是否正确地将数据读入数据集。页面正在关闭,我很确定问题在于:

                        SqlDataReader dr = cmd2.ExecuteReader(CommandBehavior.CloseConnection);
                        Session["SSRptMenu"] = dr;
                        GridView_Reports.DataSource = dr;

老实说,我用谷歌搜索了SqlDataReader和SqlDataAdapter并且找不到任何东西,但是我需要在第二个例子中填充会话变量,并且还要正确填充数据网格。 因此,实质上,我需要将存储过程的结果放入数据集。任何人都可以提出我做错的建议吗?

1 个答案:

答案 0 :(得分:0)

我非常确定大多数控件都不接受其DataSource属性中的读者。此外,大多数读者都是前瞻性的,所以尽管您试图将读者存储为会话变量,但您很可能只能读取一次。

当您的帖子似乎表明您需要使用DataSet时,为什么要使用阅读器?为什么不按照您在第一篇文章中显示的方式使用适配器?适配器可以与使用sprocs的命令一起使用。

而不是:

SqlDataReader dr = cmd2.ExecuteReader(CommandBehavior.CloseConnection);
Session["SSRptMenu"] = dr;
GridView_Reports.DataSource = dr;

只需使用:

var adapter = new SqlDataAdapter(cmd2);
var ds = new DataSet();
adapter.Fill(ds, "MyTableName");
Session["SSRptMenu"] = ds;
GridView_Reports.DataSource = ds;