Frage

I am passing in a start date, an end date, a SQL stored procedure, and a identifying area code into a shared function to populate five declared datatables.

    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

The results of this function are then passed into the datatables like this

    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

The databinding is done like this

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

Then in preparation for the datatables to be sent to an Excel file the data in ViewState is set to a DataTable like this, but the dataTable.Rows.Count() is throwing a NullReferenceException error as though the databind isn't taking place?

    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
War es hilfreich?

Lösung

You must know that viewstate is a per page concept. So if you put data in the viewstate of a particular page you can't retrieve them from another page. Instead of viewstate you can use Session which is the same for all the pages executed within a user session.

Session("patiDataTable") = patiDataTable

Also, viewstate is by default stored client side ans thus is not suitable for large data objects such as datatables.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top