Как запросить локальные данные и вернуть информацию в базу данных на VB.net - PullRequest
0 голосов
/ 30 ноября 2018

Я пытаюсь передать запрос и существующие данные в функцию.Функция запросит переданные данные, используя переданный запрос, и выдаст результат.

К сожалению, я не могу вернуть какие-либо данные.Я разместил свой код ниже.Может кто-нибудь помочь мне это исправить?Я не знаю, что я делаю не так.

Public Function ExecQueryTest(Query As String, DT As DataTable) As DataTable

    Dim Result() As DataRow
    'initialize the table to have the same number of columns of the table that is passed into the function
    Dim LocalTable As DataTable = DT
    'initialize counting variables
    Dim x, y As Integer

    'use the select command to run a query and store the results in an array
    Result = DT.Select(Query)

   'remove all items from the localtable after initial formatting
    For x = 0 To LocalTable.Rows.Count - 1
        LocalTable.Rows.RemoveAt(0)
    Next

    'for loop to iterate for the amount of rows stored in result
    For x = 0 To Result.GetUpperBound(0)
        'add each array row into the table 
        LocalTable.Rows.Add(Result(x))
    Next

    ExecQueryTest = LocalTable
End Function

Если есть лучший способ достичь моей цели, я не против начать с нуля.Я просто хочу иметь возможность обрабатывать динамические таблицы, запросы и иметь возможность возвращать информацию в формате данных.

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Проблема здесь:

Dim LocalTable As DataTable = DT

Этот код не делает то, что вы думаете, что он делает.DataTable является ссылочным типом, что означает присвоение DT только переменной LocalTable назначает ссылку на тот же объект. Новая таблица не создается и ничего не копируется.Поэтому этот более поздний код также очищает исходную таблицу:

'remove all items from the localtable after initial formatting
For x = 0 To LocalTable.Rows.Count - 1
    LocalTable.Rows.RemoveAt(0)
Next

Попробуйте вместо этого:

Public Function ExecQueryTest(Query As String, DT As DataTable) As DataTable
    ExecQueryTest = New DataTable() 'create new DataTable object to hold results
    For Each row As DataRow In DT.Select(Query)
        ExecQueryTest.LoadDataRow(row.ItemArray, True)
    Next
End Function

Хотя вам также может понадобиться клонировать каждый DataRow запись.

0 голосов
/ 30 ноября 2018

Вы можете очистить таблицу с помощью

LocalTable.Clear()

вместо того, чтобы использовать этот цикл. Также результаты вашего выбора можно напрямую преобразовать в датированные с помощью

LocalTable = Result.CopyToDataTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...