ADO.NET:DataSet或DataTable以及如何检索数据

时间:2009-05-18 19:33:20

标签: .net database ado.net

SO社区

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

简单来说,我正在创建一个简单的窗口表单,其中包含员工姓名和按钮的组合框,以便当用户单击该按钮时,所选员工的电子邮件地址将显示在表单上的文本框中。

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

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是DataTables的集合,我这里只有一个简单的DataTable(5列,100行)所以使用DataTable似乎更容易。有什么问题吗?
  2. 现在我有一个DataTable(在我的例子中为'tbl')如何查询DataTable以检索正确的数据,即基于员工姓名的EmailAddress?在SQL中,它将是“SELECT EmailAddress WHERE EmployeeName = SelectedItem”。我已经看过使用DataTable的Select方法,但无济于事,然后我继续使用DataView的RowFilter方法但没有任何成功。
  3. 有人能指出我正确的方向吗?

    亚历

5 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

坚持使用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

答案 2 :(得分:0)

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

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。

答案 3 :(得分:0)

  1. 由于DataSet只存储多个DataTable并管理它们之间的关系和视图,所以你可以在这里使用:: shudder :: DataTable。

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

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

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

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

答案 4 :(得分:0)

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

以下代码将为您提供员工姓名的EmailAddress。

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。

相关问题