запросить целый набор данных одновременно с объединениями? - PullRequest
1 голос
/ 27 января 2010

Я работаю в C # и Visual Studio 2005. У меня есть типизированный DataSet, созданный мастером.Я вижу, что я могу запустить MyGeneratedDataSet.tblFoo.Select () и получить данные из каждой таблицы, но есть ли способ сделать запрос всего этого, например, небольшую базу данных в памяти, или это мне нужно сделатьэто по частям стол за столом?

Спасибо!Joshua

Ответы [ 3 ]

2 голосов
/ 27 января 2010

Вы хотите перенести всю базу данных в набор данных? Это плохая идея по многим причинам, но в основном потому, что по мере роста вашей базы данных (и это главное) потребление ресурсов в вашем приложении будет расти, и ваше приложение будет медленно останавливаться.

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

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

0 голосов
/ 08 мая 2010

(ответьте в VB, но вы должны быть в состоянии преобразовать его)

Чтобы использовать один запрос для загрузки всего набора данных ...

  1. Создайте запрос с несколькими результатами.
  2. Сделайте запрос для одной из таблиц-адаптеров вашего набора данных (чтобы воспользоваться набранными параметрами и т. Д.).
  3. Перегрузите этот запрос копией сгенерированного кода.
  4. Заменить окончательный оператор fill (datatable) оператором fill (dataset).
  5. Выполните код для сопоставления таблиц с правильными типизированными таблицами.

1) Напишите хранимую процедуру или оператор SQL, который имеет несколько операторов выбора, которые возвращают результаты.

2) Добавьте в один из ваших таблиц-адаптеров набор данных.

3) Получить сгенерированный код для этого запроса. Самый простой способ - использовать метод для запроса в коде, а затем щелкнуть правой кнопкой мыши метод и выбрать «Перейти к определению». Поместите этот метод в отдельный файл CS или VB. (См. Блок кода B)

Вам нужно получить частичный класс namespace и tableadapter, чтобы метод работал.

4) Добавить набор данных в качестве параметра к перегруженной функции. Этот набор данных будет целью нового оператора заполнения. (См. Блок кода B)

5) Используйте следующий код для соответствия таблицам результатов набора данных.

Public Shared Sub DatasetAutoMerge(ByVal Source As Data.DataSet, ByVal Target As Data.DataSet)
    Target.EnforceConstraints = False

    For Each dtTarget As Data.DataTable In Target.Tables
        For Each dtSource As Data.DataTable In Source.Tables
            Dim dtMatch = dtSource
            For Each dcTarget As Data.DataColumn In dtTarget.Columns
                If Not dtSource.Columns.Contains(dcTarget.ColumnName) Then
                    'The source does not have a column we need by name, not a match'
                    dtMatch = Nothing
                    Exit For
                End If
            Next

            If dtMatch IsNot Nothing Then
                dtTarget.Merge(dtMatch, False, Data.MissingSchemaAction.Ignore)
                Exit For
            End If
        Next
    Next

    Target.EnforceConstraints = True
End Sub

кодовый блок B (Образец окончательной версии метода переопределения, VB)

Namespace dsMyDatasetTableAdapters
    Partial Public Class Table1TableAdapter
        Public Overridable Overloads Function Fill(ByVal dataset As dsMyDataset, ByVal OrderNumber As String) As Integer
            Me.Adapter.SelectCommand = Me.CommandCollection(0)
            If (RecordID Is Nothing) Then
                Me.Adapter.SelectCommand.Parameters(0).Value = Global.System.DBNull.Value
            Else
                Me.Adapter.SelectCommand.Parameters(0).Value = CType(OrderNumber, String)
            End If

            'end autogenerated code'

            'Start Custom Code'
            Dim dsDump As New Data.DataSet

            Me.Adapter.Fill(dsDump)

            DatasetAutoMerge(dsDump, dataset)
        End Function

    End Class
End Namespace

Я использовал этот процесс несколько раз. Это гораздо лучше, чем писать отдельные запросы, если вы знаете, что хотите загрузить все это одновременно. Я надеюсь, что это поможет вам!

0 голосов
/ 05 февраля 2010

Скажем, у вашего набора данных есть две таблицы (A, B)
База данных имеет одинаковые таблицы (A, B)
Они могут различаться по имени между DB и DataSet, но тогда вам нужно сделать сопоставления

На самом деле это довольно просто.
(ПРИМЕР СЕРВЕРА SQL, псевдошумный код)

string fQuery = "SELECT * FROM A;SELECT * FROM B:";
SqlCommand fCommand = new SqlCommand(fQuery, <connection>);
SqlDataAdapter fAdpter = new SqlDataAdapter(fCommand);
DataSet fSet = new DataSet();
fAdpter .Fill(pSet);

Теперь весь набор заполнен одним запросом.
Это может быть очень полезно для производительности.

...