首页 > 解决方案 > VB.NET DataSet 表数据为空

问题描述

我正在尝试将数据集用于报告,但是当我尝试使用它时数据消失了。这是我的大部分代码:

变量:

Dim ResultsDataView As DataView
Dim ResultsDataSet As New DataSet
Dim ResultsTable As New DataTable
Dim SQLQuery As String

搜索:这是在主视图中填充数据网格的位置。数据完美显示。

Private Sub Search(Optional ByVal Bind As Boolean = True, Optional ByVal SearchType As String = "", Optional ByVal SearchButton As String = "")
        Dim SQLQuery As String
        Dim ResultsDataSet
        Dim LabelText As String
        Dim MultiBudgetCenter As Integer = 0

        SQLQuery = "A long and detailed SQL query that grabs N rows with 7 columns"
        ResultsDataSet = RunQuery(SQLQuery)
        ResultsTable = ResultsDataSet.Tables(0)

        For Each row As DataRow In ResultsTable.Rows
            For Each item In row.ItemArray
                sb.Append(item.ToString + ","c)
                Response.Write(item.ToString + "\n")
                Response.Write(vbNewLine)
            Next
            sb.Append(vbCr & vbLf)
        Next
        'Response.End()

        If Bind Then
            BindData(ResultsDataSet)
        End If

    End Sub

绑定数据:我认为这是问题的一个原因。

Private Sub BindData(ByVal InputDataSet As DataSet)
        ResultsDataView = InputDataSet.Tables("Results").DefaultView

        ResultsDataView.Sort = ViewState("SortExpression").ToString()

        ResultsGridView.DataSource = ResultsDataView

        ResultsGridView.DataBind()
End Sub

报告操作:这是我尝试使用表格数据的地方。但它显示为什么。

Protected Sub ReportButton_Click(sender As Object, e As EventArgs) Handles ReportButton.Click
        For Each row As DataRow In ResultsTable.Rows
            For Each item In row.ItemArray
                Response.Write(item.ToString)
            Next
        Next
    End Sub

我试图遍历这些数据的原因是在主视图的网格视图中显示数据以及将数据导出到 CSV。如果有不同的方式将 SQL 查询导出到 CSV,我愿意接受任何建议。

我必须做一些事情才能从 SQL 查询中获取数据以通过ReportButton_Click方法持久保存。我尝试过复制数据表,尝试过全局变量,尝试过不同的循环数据集的方法。我错过了什么?!

谢谢大家。

编辑这是 Page_Load:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Page.IsPostBack Then
            'set focus to postback control
            Dim x As String = GetPostBackControlName(Page)

            If Len(x) > 0 Then
                x = x.Replace("$", "_")
                SetFocus(x)
            End If
        End If

        If Not IsPostBack Then
            ResultsGridView.AllowPaging = False

            'Enable Gridview sorting
            ResultsGridView.AllowSorting = True

            'Initialize the sorting expression
            ViewState("SortExpression") = "ID DESC"

            'Populate the Gridview
            Search()
        End If
    End Sub

标签: vb.netgridviewdatasetexport-to-csv

解决方案


在您的搜索功能中,在 ResultsTable 设置之后添加这一行

    ResultsTable = ResultsDataSet.Tables(0)
    Session("LastSearch") = ResultsTable

然后在您的报告单击事件处理程序中从 Session 变量中恢复您的数据

Protected Sub ReportButton_Click(sender As Object, e As EventArgs) Handles ReportButton.Click
    ResultsTable = DirectCast(Session("LastSearch"), DataTable)
    For Each row As DataRow In ResultsTable.Rows
        For Each item In row.ItemArray
            Response.Write(item.ToString)
        Next
    Next
End Sub

您需要阅读ASP.NET 生命周期并了解每次 ASP.NET 调用您的方法时,它都会创建 Page 类的新实例。当然这意味着 ASP.NET 中的全局页面变量不是很有用。
还要考虑阅读有关该 Session 对象的信息,不要滥用它。

SessionState 和 ViewState 有什么区别?


推荐阅读