【问题标题】:VB.NET DataSet table data emptyVB.NET DataSet 表数据为空
【发布时间】:2018-08-24 13:56:48
【问题描述】:

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

变量:

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

【问题讨论】:

  • 您能在 Page_Load 中显示代码吗?您是否在每次调用 Page_Load 时重新加载数据?
  • 我已将其添加为编辑。
  • 因此,您的 Search 函数仅在页面第一次加载时被调用,因此当您获得 Not IsPostBack 时,您之前的全局变量将完全被遗忘。您需要将加载结果保存在 Session 变量中,然后从此 Session 变量中恢复这些值
  • 你能举个例子吗?
  • RunQuery() 方法让我害怕。这可能会迫使您编写极易受到 sql 注入攻击的代码。

标签: vb.net gridview dataset export-to-csv


【解决方案1】:

在您的搜索功能中,在 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 Life Cycle 并了解每次 ASP.NET 调用您的方法时,它都会创建您的 Page 类的一个新实例。当然这意味着 ASP.NET 中的全局页面变量不是很有用。
还要考虑阅读有关该 Session 对象的信息,不要滥用它。

What is the difference between SessionState and ViewState?

【讨论】:

  • 谢谢!这让我发疯了。我以前从未使用过 Session 变量,所以这非常有帮助。再次感谢!
猜你喜欢
  • 2016-02-24
  • 2012-12-27
  • 2014-10-22
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 2010-12-10
  • 1970-01-01
相关资源
最近更新 更多