2014-02-14 61 views
0

我傳遞在開始日期,結束日期,SQL存儲過程,以及識別區域碼到一個共享函數來填充5個聲明的數據表。然後堅持視圖狀態數據表和數據綁定

Public Shared Function getNBOCAPData(ByVal startDate As DateTime, ByVal endDate As DateTime, ByVal sp As String, ByVal orgCode As String) As DataTable 
     Dim SqlConn As New SqlConnection(ConfigurationManager.ConnectionStrings("CancerRegisterConnectionString").ConnectionString.ToString) 
     Dim sqlCmd As New SqlCommand 
     getNBOCAPData = New DataTable 
     Try 
      SqlConn.Open() 
      sqlCmd.CommandType = CommandType.StoredProcedure 
      sqlCmd.Connection = SqlConn 
      sqlCmd.CommandTimeout = 300 
      sqlCmd.CommandText = sp 

      sqlCmd.Parameters.AddWithValue("@StartDate", startDate) 
      sqlCmd.Parameters.AddWithValue("@EndDate", endDate) 
      sqlCmd.Parameters.AddWithValue("@UserOrgCode", orgCode) 
      Dim reader As SqlDataReader = sqlCmd.ExecuteReader() 

      getNBOCAPData.Load(reader) 

     Catch ex As Exception 
      Common.LogError(ex, True) 
     Finally 
      SqlConn.Close() 
      SqlConn.Dispose() 
     End Try 
    End Function 

此函數的結果被傳遞到數據表這樣

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Dim patiDataTable As DataTable = getNBOCAPData(Request.QueryString("startDate"), Request.QueryString("endDate"), "NBOCAP_DOWNLOAD_PATI", Request.QueryString("orgCode")) 
     Dim tumDataTable As DataTable = getNBOCAPData(Request.QueryString("startDate"), Request.QueryString("endDate"), "NBOCAP_DOWNLOAD_TUM", Request.QueryString("orgCode")) 
     Dim surDataTable As DataTable = getNBOCAPData(Request.QueryString("startDate"), Request.QueryString("endDate"), "NBOCAP_DOWNLOAD_SUR", Request.QueryString("orgCode")) 
     Dim cheDataTable As DataTable = getNBOCAPData(Request.QueryString("startDate"), Request.QueryString("endDate"), "NBOCAP_DOWNLOAD_CHE", Request.QueryString("orgCode")) 
     Dim patDataTable As DataTable = getNBOCAPData(Request.QueryString("startDate"), Request.QueryString("endDate"), "NBOCAP_DOWNLOAD_PATH", Request.QueryString("orgCode")) 

     Dim hidCount As Integer = 0 

     If patiDataTable.Rows.Count = 0 Then 
      divPati.Visible = False 
      hidCount += 1 
     End If 

     If tumDataTable.Rows.Count = 0 Then 
      divTum.Visible = False 
      hidCount += 1 
     End If 

     If surDataTable.Rows.Count = 0 Then 
      divSur.Visible = False 
      hidCount += 1 
     End If 

     If cheDataTable.Rows.Count = 0 Then 
      divChe.Visible = False 
      hidCount += 1 
     End If 

     If pathDataTable.Rows.Count = 0 Then 
      divPath.Visible = False 
      hidCount += 1 
     End If 

     If hidCount = 5 Then 
      divNoResults.Visible = True 
      divInstructions.Visible = False 
     Else 
      ViewState("patiDataTable") = patiDataTable 
      ViewState("tumDataTable") = tumDataTable 
      ViewState("surDataTable") = surDataTable 
      ViewState("cheDataTable") = cheDataTable 
      ViewState("pathDataTable") = pathDataTable 
     End If 
End Sub 

的數據綁定然後在製備這樣

Public Shared Sub RetRptBySPNBOCAP(ByRef dg As GridView, ByVal dataTable As DataTable) 
     dg.DataSource = dataTable 
     dg.DataBind() 
    End Sub 

做用於數據表被髮送到一個Excel文件中,ViewState中的數據被設置爲這樣的DataTable,但dataTable.Rows.Count()拋出NullReferenceException錯誤,就好像數據綁定沒有發生一樣?

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Dim cellDate As DateTime = DateTime.MinValue 
    Dim dataTable As DataTable = Nothing 
    Dim prefix As String = "Pati_NBOCAP" 

    Select Case (Request.QueryString("type").ToString) 
     Case "Pati" 
      dataTable = ViewState("patiDataTable") 
     Case "Tum" 
      dataTable = ViewState("tumDataTable") 
      prefix = "Tum_NBOCAP" 
     Case "Che" 
      dataTable = ViewState("cheDataTable") 
      prefix = "Che_NBOCAP" 
     Case "Path" 
      dataTable = ViewState("pathDataTable") 
      prefix = "Path_NBOCAP" 
     Case "Sur" 
      dataTable = ViewState("surDataTable") 
      prefix = "Sur_NBOCAP" 
    End Select 

    RetRptBySPNBOCAP(Results, dataTable) 

    Dim rCount As Integer 
    If dataTable.Rows.Count() > 0 Then 
     rCount = dataTable.Rows.Count() 
    End If 



End Sub 
+0

如果我正確地讀你的代碼,你有2'Page_Load'方法 - 這些是2個不同的'Pages'?哪些[**'頁面VIEWSTATE **](http://msdn.microsoft.com/en-us/library/z1hkazw7.aspx)有數據? – EdSF

+0

EDSF謝謝你,但現在我已經解決了這個問題 –

回答

1

您必須知道viewstate是每個頁面的概念。因此,如果您將數據放入特定頁面的視圖狀態中,則無法從其他頁面檢索它們。您可以使用會話,而不是視圖狀態,這對於用戶會話中執行的所有頁面都是相同的。

Session("patiDataTable") = patiDataTable 

此外,viewstate默認存儲客戶端ans,因此不適合大數據對象,如數據表。

+0

DadyFuji謝謝你,是的,我明白你的意思,現在我已經使用Session變量來存儲數據表,它是工作,因爲它應該。我還必須更改第二頁加載子來將數據轉換爲數據表昏暗,如下所示dataTable = CType(Session(「patiDataTable」),System.Data.DataTable) –