Каков наилучший подход к привязке данных к элементу управления ReportViewer? (DataAdapter против DataReader)

У меня есть 2 подхода для привязки данных к элементу управления ReportViewer. Какой из них лучше? Не могли бы вы дать мне несколько советов?

Подход 1. Использование SqlDataAdapter

Dim dt As DataTable = New DataTable
Dim conn As SqlConnection = New SqlConnection(connString)
Try
    conn.Open()
    Dim cmd As New SqlCommand(sql, conn)
    Dim adapter As New SqlDataAdapter(cmd)
    adapter.Fill(dt)
Catch ex As Exception
Finally
    conn.Close()
End Try

Dim ds As New ReportDataSource(dataSourceName, dt)
rViewer.LocalReport.DataSources.Clear()
rViewer.LocalReport.DataSources.Add(ds)
rViewer.LocalReport.Refresh()

Подход 2: использование SqlDataReader

Dim dt As New DataTable()
Dim conn As SqlConnection = New SqlConnection(connString)
Try
    conn.Open()
    Dim cmd As New SqlCommand(sql, conn)
    Dim reader As SqlDataReader = cmd.ExecuteReader()

    dt.Load(reader)
    reader.Close()
Catch ex As Exception
Finally
    conn.Close()
End Try

Dim ds As New ReportDataSource(dataSourceName, dt)
rViewer.LocalReport.DataSources.Clear()
rViewer.LocalReport.DataSources.Add(ds)
rViewer.LocalReport.Refresh()

person Tri Nguyen    schedule 05.04.2011    source источник
comment
Вы очень можете комментировать, принимать или запрашивать дополнительную информацию. Именно так должен работать StackOverflow. Спасибо.   -  person LeftyX    schedule 07.04.2011


Ответы (1)


Если мне придется выбирать между двумя вариантами, я выберу первый, потому что набор данных заполняется внутри с помощью средства чтения данных.
Второй пример преобразует средство чтения данных в набор данных.
Первый вариант должен быть немного быстрее. Другим вариантом может быть использование объектов (сущностей) в качестве источника данных.
Дополнительную информацию можно найти здесь.

person LeftyX    schedule 05.04.2011
comment
Спасибо за ваш ответ. Мне было интересно, можем ли мы напрямую связать DataReader с ReportViewer. Я пытался использовать это, но, похоже, здесь были некоторые загадочные ошибки (из-за срочности моего проекта мне пришлось изменить свой подход, не выясняя, в чем проблема). Вы когда-нибудь пробовали это? - person Tri Nguyen; 09.04.2011
comment
Да, вы не можете этого сделать из-за своей природы. Datareader не является отключенным набором данных, как набор данных. Datareader остается подключенным к базе данных, пока вы не закроете соединение. Он извлекает одну строку за раз. ReportViewer не может с этим справиться, потому что ему нужен несвязанный (перечисляемый) набор данных. - person LeftyX; 09.04.2011
comment
@ nguyen190887: вообще никаких проблем. Я был бы рад, если бы вы могли просто принять (с кнопкой проверки рядом с моим ответом) мой ответ. Stackoverflow работает таким образом: вы принимаете, голосуете против или голосуете за ответы, чтобы пользователь (я) был вознагражден. - person LeftyX; 13.04.2011