【问题标题】:how to re-use an ado.net datatable so as to avoid re-querying?如何重新使用 ado.net 数据表以避免重新查询?
【发布时间】:2011-09-12 23:07:07
【问题描述】:

是否可以在 .net 中重复使用 DataTable? 以下是代码隐藏的示例:

  Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    ' the stored proc
    Dim SqlQuery As String = "some_silly_stored_proc"
    Dim conn As String = My.Settings.csSomeProject

    Using dbcon = New SqlConnection()

        Using cmd As New SqlCommand(SqlQuery, dbcon)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.Add("@SomeSillyParamID", SqlDbType.Int)
            cmd.Parameters("@SomeSillyParamID").Value = pn.Silly_now

            Using myCommand As New SqlDataAdapter()
                Dim sillyDS As New DataSet()

                dbcon.ConnectionString = conn

                dbcon.Open()
                myCommand.SelectCommand = cmd
                myCommand.Fill(sillyDS)
                dbcon.Close()

                r.someResultRows = sillyDS.Tables(0)
                r.someResultRowsAgain = sillyDS.Tables(1)
                ' etc...

            End Using
        End Using
    End Using

当我尝试在代码隐藏中重新访问 DataTable 时, 原始结果集不会随所有返回 如果事件在 Page_Load 事件之外触发,则正确的数据。

如果我在后面的代码中使用此代码进行测试, 一些带有整数和小数的列回来了 为 0 而不是它们的原始值。例如, 第 1 行第 2 列的值返回为 0 而不是整数 82。

    Dim var1, var2, var3, var4, var5, var6 As String
    Dim _r As DataRow

    For Each _r In r.sillyDS.Tables(0)
        var1 = _r(0).ToString()
        var2 = _r(1).ToString()
        var3 = _r(2).ToString()
        var4 = _r(3).ToString()
        var5 = _r(4).ToString()
        var6 = _r(5).ToString()
    Next

然而,如果 .aspx 页面上有一个类似的“For Each”循环, 每个单元格的所有值都正确返回, 不只是一些。

【问题讨论】:

    标签: asp.net vb.net ado.net datatable dataset


    【解决方案1】:

    我没有看到 r 是在哪里定义的(查看ASP.NET Page Life Cycle),所以无法判断为什么值是空的,但通常如果数据对于当前用户是唯一的,您可以将数据集存储在 Session 中,或者如果数据对您的网络应用的所有用户都有好处。

    这两个对象都是 Page 的一部分,因此您可以使用 Page 方法存储数据集

    Session["sillyDS"] = sillyDS;
    

    Cache["sillyDS"] = sillyDS
    

    以及检索时

    sillyDS = Session["sillyDS"];
    

    sillyDS = Cache["sillyDS"]
    

    如果您的用户打开应用程序的多个选项卡并且每个选项卡存储的数据可能不同,那么视图状态是您唯一的选择,因为 Session 对于该用户来说是相同的。但是不要将整个数据集或任何大型对象保存到 Viewstate,在 viewstate 中存储某种 ID 并使用它在 Session 中获取值。

    【讨论】:

      【解决方案2】:
      【解决方案3】:

      将数据集保持在 Viewstate 中"

      ViewState["sillyDS"] = sillyDS;
      

      在页面的任何地方使用它

      DataSet sillyDS = new DataSet();
      sillyDS (DataSet)ViewState["sillyDS"];
      

      注意 - 此方法的缺点是您将在回发之间向客户端发送可能非常大的数据集。因此,您最好使用会话状态、应用程序状态或 ASP.NET 缓存。

      【讨论】:

      • 你不会将数据集存储到视图状态,生成的页面可能非常大
      • 是的。完全不鼓励使用 ViewState 存储 DataTable。
      猜你喜欢
      • 2022-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2017-10-18
      相关资源
      最近更新 更多