Можно ли определять последовательность контролируемых наборов записей в наборе результатов ADO.Net с несколькими записями? - PullRequest
1 голос
/ 03 июня 2010

Я использую код, подобный этой статье Support / KB , чтобы вернуть несколько наборов записей в мою программу на C #.

Но я не хочу, чтобы код C # зависел от физической последовательности возвращаемых наборов записей для выполнения своей работы.

Итак, мой вопрос: «Есть ли способ определить, какой набор записей из набора результатов множественных записей я сейчас обрабатываю?»

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

P.S. Я использую Visual Studio 2008 Pro & SQL Server 2008 Express Edition.

Ответы [ 2 ]

0 голосов
/ 05 июня 2010

Нет, потому что SqlDataReader только вперед. Насколько я знаю, лучшее, что вы можете сделать, - это открыть читатель с помощью KeyInfo и проверить таблицу данных схемы, созданную с помощью метода GetSchemaTable считывателя (или просто проверить поля, что проще, но менее надежно).

Я потратил пару дней на это. Я просто жил с зависимостью физического порядка. Я строго прокомментировал как метод кода, так и хранимую процедуру с !!!IMPORTANT!!!, и включил #If...#End If для вывода наборов результатов, когда это необходимо для проверки вывода хранимой процедуры.

Следующий фрагмент кода может вам помочь.

Полезный код

        Dim fContainsNextResult As Boolean
        Dim oReader As DbDataReader = Nothing

        oReader = Me.SelectCommand.ExecuteReader(CommandBehavior.CloseConnection Or CommandBehavior.KeyInfo)

#If DEBUG_ignore Then

        'load method of data table internally advances to the next result set
        'therefore, must check to see if reader is closed instead of calling next result

        Do
            Dim oTable As New DataTable("Table")
            oTable.Load(oReader)
            oTable.WriteXml("C:\" + Environment.TickCount.ToString + ".xml")
            oTable.Dispose()
        Loop While oReader.IsClosed = False

        'must re-open the connection
        Me.SelectCommand.Connection.Open()

        'reload data reader
        oReader = Me.SelectCommand.ExecuteReader(CommandBehavior.CloseConnection Or CommandBehavior.KeyInfo)

#End If

       Do

            Dim oSchemaTable As DataTable = oReader.GetSchemaTable

            '!!!IMPORTANT!!! PopulateTable expects the result sets in a specific order
            '   Therefore, if you suddenly start getting exceptions that only a novice would make
            '   the stored procedure has been changed!

            PopulateTable(oReader, oDatabaseTable, _includeHiddenFields)

            fContainsNextResult = oReader.NextResult

        Loop While fContainsNextResult
0 голосов
/ 03 июня 2010

Поскольку вы явно указываете, в каком порядке выполнять операторы SQL, результаты будут отображаться в том же порядке. В любом случае, если вы хотите программно определить, какой набор записей вы обрабатываете, вам все равно нужно определить некоторые столбцы в результате.

...