как повторно использовать таблицу данных ado.net, чтобы избежать повторных запросов? - PullRequest
2 голосов
/ 11 июня 2011

Можно ли повторно использовать DataTable в .net?Вот пример из кода:

  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, все значениявернитесь правильно для каждой клетки, а не только для некоторых.

Ответы [ 3 ]

3 голосов
/ 11 июня 2011

Я не вижу, где определено r (посмотрите на Жизненный цикл страницы ASP.NET ), поэтому не могу сказать, почему значения пусты, но обычно вы можете хранить набор данных в сеансе, если данные уникальный для текущего пользователя или в кэше, если данные подходят для всех пользователей вашего веб-приложения.

Оба объекта являются частью Page, поэтому для хранения набора данных в методах Page можно использовать

Session["sillyDS"] = sillyDS;

или

Cache["sillyDS"] = sillyDS

и при получении

sillyDS = Session["sillyDS"];

или

sillyDS = Cache["sillyDS"]

И если ваш пользователь открывает несколько вкладок вашего приложения и сохраненные данные могут быть разными для каждой вкладки, тогда viewstate - ваш единственный вариант, потому что для этого пользователя сеанс одинаков. Но не сохраняйте весь набор данных или какой-либо большой объект в Viewstate, сохраняйте какой-то идентификатор в viewstate и используйте его для получения значения в Session.

0 голосов
0 голосов
/ 11 июня 2011

Сохранить набор данных в Viewstate "

ViewState["sillyDS"] = sillyDS;

Используйте его в любом месте страницы

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

Примечание - недостатком этого метода является то, что вы будете отправлять потенциально очень большие наборы данных клиенту между постбеками. В результате вам, вероятно, лучше использовать состояние сеанса, состояние приложения или ASP.NET Cache.

...