如何重用ado.net数据表以避免重新查询?

时间:2011-06-11 06:59:36

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

是否可以在.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事件之外触发,则为right数据。

如果我在代码后面用这段代码测试, 一些带有整数和小数的列会回来 为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”循环, 每个单元格的所有值都正确返回, 不只是一些。

3 个答案:

答案 0 :(得分:3)

我没有看到r的定义位置(查看ASP.NET Page Life Cycle),因此无法判断为什么值为空,但通常情况下,如果数据对于当前用户或在当前用户中是唯一的,则可以将数据集存储在会话中如果数据适合您的网络应用的所有用户,则缓存。

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

Session["sillyDS"] = sillyDS;

Cache["sillyDS"] = sillyDS

和检索时

sillyDS = Session["sillyDS"];

sillyDS = Cache["sillyDS"]

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

答案 1 :(得分:0)

答案 2 :(得分:-1)

将数据集保存在Viewstate“

ViewState["sillyDS"] = sillyDS;

在页面的任何位置使用它

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

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