【问题标题】:ADO.NET: DataSet or DataTable and how to retrieve dataADO.NET:DataSet 或 DataTable 以及如何检索数据
【发布时间】:2009-05-18 19:33:20
【问题描述】:

SO 社区

我刚开始使用 ADO.NET,而且对编程还很陌生。我已经从这个社区获得了一些支持,这些支持非常有用并且还有另一个问题。

简单来说,我正在创建一个简单的 Windows 表单,其中包含员工姓名的组合框和一个按钮,这样当用户单击该按钮时,所选员工的电子邮件地址就会出现在表单的文本框中。

在我的项目中,我有数据库,在加载表单时,我连接到我的数据库并创建了一个数据表,如下所示:

Public Class GetEmployeeDataset

Private tbl As New DataTable

Public Sub New()
    Dim strConn, strSQL As String
    strConn = "Data Source=.\SQLExpress;Initial Catalog=MyDatabase;Integrated Security=True;"
    strSQL = "SELECT * FROM EmployeeTable"

    Dim da As New SqlDataAdapter(strSQL, strConn)
    da.Fill(tbl)
End Sub

End Class

此时我有两个问题:

  1. 我使用的是 DataTable 而不是 DataSet,因为据我了解,DataSet 是 DataTable 的集合,而我这里只有一个简单的 DataTable(5 列,100 行),因此使用 DataTable 似乎更容易.有什么问题吗?
  2. 现在我有一个 DataTable(在我的示例中为“tbl”),我如何查询该 DataTable 以检索正确的数据,即基于员工姓名的 EmailAddress?在 SQL 中,它将是“SELECT EmailAddress WHERE EmployeeName = SelectedItem”。我曾研究过使用 DataTable 的 Select 方法,但无济于事,然后我使用 DataView 的 RowFilter 方法,但没有任何成功。

谁能指出我正确的方向?

亚历克斯

【问题讨论】:

    标签: .net database ado.net


    【解决方案1】:

    我根本不使用数据集或数据表。我发现使用它们的唯一原因是,如果您想“离线”保存所有数据,对数据进行更改,然后根据需要将这些更改提交回数据库。

    如果您所做的只是根据用户交互从服务器获取数据,那么使用 DataTable 可能有点过头了。

    编辑:哦,回答你的实际问题:

    1. 听起来不错,因为您只需要一张桌子。
    2. 在 DataTable 上使用 Select 方法(这将返回满足 where 条件的 DataRows 数组)

    【讨论】:

      【解决方案2】:

      继续使用 ADO 对象,这就是您可以使用 DataView 的方式...

        Dim dv As DataView
        Dim strFilter As String
        Dim strEmail As String = ""  
      
        strFilter = "EmployeeName = '" & cbo.Text & "'"  
      
        dv = tbl.DefaultView
        dv.RowFilter = strFilter  
      
        If dv.Count > 0 Then
           strEmail = dv(0).Item("EmailAddress").ToString
        End If
      

      【讨论】:

        【解决方案3】:
        1. 作为一个 DataSet 只存储多个 DataTable 并管理它们之间的关系和视图,您可以在这里使用 ::shudder:: DataTable。

        2. 您应该考虑这里到底发生了什么。当您说“SELECT * FROM EmployeeTable”时,您将这样做 - 从数据库中获取所有数据,然后尝试在应用程序代码中将其过滤到数据库之外。出于多种原因,这不是一个好主意,但现在我们只说我们应该让数据库执行它们真正擅长的工作,那就是过滤和排序数据。

        您可能会发现 Linq to SQL 是一种比 ADO.NET 更容易实现的技术。有很多关于这个主题的教程,所以here's one to get you started(虽然它比较旧)。 Linq to SQL 本质上允许您将基于集合的 SQL 知识带到应用程序领域,并为您提供良好的启动性能(即您可以从“SELECT * FROM Employees”开始并依次添加过滤器,例如“WHERE Name = 'Smith'" 最终在数据库上执行)。

        如果您绝对、肯定地必须使用 ADO.NET 并且必须采用这种方法,您可以这样做:

        yourDataTable.Select("EmployeeName='" + yourSelectedValue + "'")
        

        【讨论】:

          【解决方案4】:

          一个简单的枚举就可以解决问题:

          string email = string.Empty;
          foreach (Row row in tbl.Rows)
          {
              string employeeName = (string)row["EmployeeName"];
              if (employeeName == "John")
              {
                  email = (string)row["Email"];
                  break;
              }
          }
          

          或者你可以试试 LINQ:

          var email = (from row in tbl.Rows
                      where (string)row["EmployeeName"] == "John"
                      select (string)row["Email"]).First ();
          

          我没有检查 VS 中的代码,所以“保留了错别字”。 对不起 C# 版本,但我不知道 VB。

          【讨论】:

          • 感谢您的帮助。我认为这对我有帮助,我会试一试。亚历克斯
          【解决方案5】:

          如果有 100 条记录(或 1,000,000 条,如果按员工姓名编制索引),对于这种特定情况,您最好的选择是使用 SqlCommand 对象的 ExecuteScalar 方法在需要时检索电子邮件地址。将整个表格拉过电线只是为了获得一个字段几乎总是一个坏主意。出于性能和维护方面的原因,即使使用 where 子句选择 * 通常也是一个坏主意。

          以下代码将为您获取员工姓名的电子邮件地址。

          Using cn as new SqlConnection("Data Source=.\SQLExpress;Initial Catalog=MyDatabase;Integrated Security=True;")
              Using cmd as new SqlCommand("SELECT EmailAddress From Employees WHERE EmployeeName = '" & employeeName & "'", cn)
                  Return TryCast(cmd.ExecuteScalar(), String)
              End Using
          End Using
          

          正如其他人所说,DataTables 用于在您需要它的相对罕见的情况下进行离线存储。没错,没有理由使用 DataSet,除非您需要离线缓存整个数据库(或数据库的子集)。

          【讨论】:

            猜你喜欢
            • 2021-11-28
            • 1970-01-01
            • 2015-09-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多