ADO.NET:需要帮助来理解“数据集”的基础知识

时间:2009-05-16 15:31:12

标签: database ado.net

作为上下文,我是ADO.NET的新手,并且一直在使用David Sceppa的“Programming ADO.NET 2.0”来帮助我建立自己的知识。

我一直在尝试理解数据集对象,但我想我可能完全误解了这一点,并且正在寻找指导。

作为一个例子,我构建了一个带有组合框的非常简单的Form,目的是用数据库中的人名(“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”中检索在组合框中选择的员工的年龄,并显示在同一表单上的TextBox中。

我真的不明白的是我如何与我为了获得年龄而创建的原始数据集进行交互?在我看来,数据集仅在Load事件期间在内存中?如果我的数据集持续超出Load事件,那么我在哪里可以找到它?

我的理解是数据集对象是数据的脱机缓存,并且没有到底层数据库的链接。这很有用,因为它允许您在不保持连接打开的情况下操作数据您可以将数据集中的任何更改提交回原始数据库。因此,一旦我在Load事件中构建了我的数据集,我该如何进一步与它进行交互?

我怀疑我对 Dataset 对象的理解存在很大的错误。任何人都可以让我直截了当吗?

感谢任何可以提供帮助的人

亚历

5 个答案:

答案 0 :(得分:1)

数据集可以容纳多个数据表,因此如果填充已填充“AllEmployeesList”数据表的相同数据集,则可以使用另一个表名称下的年龄填充另一个数据表。将数据集描绘为内存数据库。

您可以将数据集存储在数据网格视图的数据源中,或者将其设置为表单级变量,以便您可以随时与其进行交互。

要注意的数据集的另一部分是,您可以制作设计时数据集,以便更安全,更明确。

答案 1 :(得分:1)

您似乎很好地掌握了DataSet的概念和原因。你的问题更多的是关于管理状态而不是数据集的来龙去脉。

如果您使用的是WebForms,WinForms或其他内容,那么您从未说过。如果您正在使用WinForms,请将DataSet提升为表单的成员变量。只要表格打开,它就会留在记忆中。

如果您正在使用WebForms,那么这将变得更加复杂。 This是一个很好的概述,可以帮助您入门。

答案 2 :(得分:1)

除非您的应用程序需要在断开连接模式下运行,否则在客户端上缓存数据库数据并不是绝对必要的,也不总是一个好主意。在这种情况下,您将为所有员工提取年龄数据,而不知道您是否需要任何员工。

我只需提取名字和姓氏数据(可能使用SqlCommand.ExecuteReader)来填充列表框,然后单独调用数据库以获取用户单击按钮时的年龄。我在your other question上使用SqlCommand.ExecuteScalar发布了类似的示例。

答案 3 :(得分:1)

当Function或Sub完成执行时,使用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

此代码可能有效,但不是推荐的解决方案。就像之前的海报所说的那样:只在你需要的时候得到你想要的数据。

答案 4 :(得分:0)

您应该将DataGrid绑定到DataSet。 reqd时,您可以从DataGrid.DataSource返回DataSet并将其强制转换为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转换到DataSet对象的开销。试。