2014-03-31 77 views
1

我有一個C#項目,我試圖導出一個數據網格的結果。有時數據變得非常大,所以不是重新執行我想要將數據集轉儲到會話變量中的代碼。使用ExecuteReader而不是SQLDataAdapter

這在我的大部分項目中都能很好地工作。從一個項目,我用這是一個例子:

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; 

坦白地說,我GOOGLE了SqlDataReader的VS SqlDataAdapter的,並不能真正發現任何東西,但我需要補會話變量在第二個例子中也有正確填充的數據網格。 因此,本質上,我需要將存儲過程的結果放入數據集。任何人都可以提供我在做什麼錯誤的建議?

回答

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;