ADO.NET: нужна помощь, чтобы понять основы «набора данных» - PullRequest
3 голосов
/ 16 мая 2009

В качестве контекста, я новичок в ADO.NET и использую «Программирование ADO.NET 2.0» Дэвида Сцеппы, чтобы помочь мне накопить знания.

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

В качестве примера, я построил действительно простую форму с комбинированным списком с целью заполнения комбинированного списка именами людей в базе данных («MyDatabase»). Следующий код прекрасно работает для меня:

    Private Sub frmEmployee_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim strConn, strSQL As String
    strConn = "Data Source=.\SQLExpress;Initial Catalog=MyDatabase;Integrated Security=True;"
    strSQL = "SELECT LastName, FirstName FROM EmployeeTable"

    Dim da As New SqlDataAdapter(strSQL, strConn)
    Dim ds As New DataSet()
    da.Fill(ds, "AllEmployeesList")

    For i As Integer = 0 To ds.Tables("AllEmployeesList").Rows.Count - 1
        Dim row As DataRow = ds.Tables("AllEmployeesList").Rows(i)
        cbAllEmployeesList.Items.Add(row("LastName") & ", " & row("FirstName"))
    Next

End Sub

Теперь предположим, что в моей форме есть кнопка ('GetAge'), предназначенная для получения возраста сотрудника, выбранного в выпадающем списке из набора данных "AllEmployeesList", и отображения в текстовом поле в той же форме.

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

Насколько я понимаю, объект набор данных является автономным кэшем данных и не имеет ссылок на базовую базу данных. Это полезно, поскольку позволяет манипулировать данными, не оставляя соединение открытым, а затем Вы можете отправить любые изменения в Dataset обратно в исходную базу данных. Итак, как только я собрал свой набор данных в событии Load, как я могу дальше взаимодействовать с ним?

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

Спасибо всем, кто может помочь

Alex

Ответы [ 5 ]

1 голос
/ 08 июля 2009

Когда функция или подпрограмма завершат выполнение, все переменные, которые вы объявили с помощью оператора Dim, исчезнут. Если вы хотите, чтобы переменная существовала до тех пор, пока существует ваша форма, объявите переменную вне вашей Sub / Function:

Public Class frmEmployee
    Private dsEmployeeList As DataSet

    Private Sub frmEmployee_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    ...
    dsEmployeeList = New DataSet()
    da.Fill(dsEmployeeList, "AllEmployeesList")
    ...
    End Sub

    Private Sub GetAge_Click(sender As Object, e As EventArgs) Handles GetAge.Click
        Dim iRowIndex As Integer

        iRowIndex = cbAllEmployeesList.SelectedIndex 'In this case the rownumber is the same as the index of the selected item in the combobox

        'Check to see if an item from the combobox has been selected
        If iRowIndex >= 0 Then
            txtEmployeeAge.Text = dsEmployeeList.Tables("AllEmployeesList").Rows(iRowIndex).Item("Age").ToString()
        End If
    End Sub

Этот код может работать, но это не рекомендуемое решение. Как говорилось в предыдущем постере: получайте нужные данные только тогда, когда они вам нужны.

1 голос
/ 19 мая 2009

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

Я бы просто извлек данные имени и фамилии (возможно, используя SqlCommand.ExecuteReader), чтобы заполнить список, а затем сделать отдельный вызов в базу данных, чтобы узнать возраст, если пользователь нажмет кнопку. Я опубликовал пример чего-то подобного, используя SqlCommand.ExecuteScalar на ваш другой вопрос .

1 голос
/ 16 мая 2009

Набор данных может содержать несколько таблиц данных, поэтому, если вы заполняете тот же набор данных, в котором уже заполнена таблица данных «AllEmployeesList», вы можете заполнить другой элемент данных возрастом под другим именем таблицы. Изобразите набор данных как базу данных в памяти.

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

Другая часть наборов данных, о которых следует знать, это то, что вы можете создать набор данных времени разработки, чтобы все было более типично и безопасно.

1 голос
/ 16 мая 2009

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

Вы никогда не указали, используете ли вы WebForms, WinForms или что-то еще. Если вы используете WinForms, продвигайте DataSet как переменную-член формы. Он останется в памяти, пока форма открыта.

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

0 голосов
/ 16 мая 2009

Вы должны связать DataGrid с DataSet. При необходимости вы можете получить DataSet обратно из DataGrid.DataSource и привести его к DataSet.

Редактировать: добавлен пример кода

    DataSet ds = new DataSet();
    // Code to populate DataSet from your DB
    ...
    ...

Назначить ds источнику данных сетки данных

this.dataGridView1.DataSource = ds;

Чтобы получить набор данных, используйте код ниже

DataSet retrievedFromGrid = (DataSet)this.dataGridView1.DataSource;

Однако, если вам нужно выполнить операции с этим набором данных несколько раз, а память не является проблемой, я бы посоветовал вам сохранить ее в переменной класса, чтобы избежать дополнительных затрат на приведение объекта DataSet из DataGrid снова еще раз.

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