Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ADO.NET:数据集或数据表以及如何检索数据_.net_Database_Ado.net - Fatal编程技术网

ADO.NET:数据集或数据表以及如何检索数据

ADO.NET:数据集或数据表以及如何检索数据,.net,database,ado.net,.net,Database,Ado.net,所以社区 我刚开始使用ADO.NET,对编程相当陌生。我已经得到了这个社区的一些支持,这是非常有用的,还有一个问题 简单来说,我正在创建一个简单的windows表单,其中包含一个员工姓名组合框和一个按钮,这样当用户单击按钮时,所选员工的电子邮件地址就会显示在表单的文本框中 在我的项目中,我有一个数据库,在加载表单时,我连接到数据库并创建一个datatable,如下所示: Public Class GetEmployeeDataset Private tbl As New DataTable

所以社区

我刚开始使用ADO.NET,对编程相当陌生。我已经得到了这个社区的一些支持,这是非常有用的,还有一个问题

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

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

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
现在我有两个问题:

我使用DataTable而不是DataSet,因为据我所知,DataSet是DataTables的集合,我这里只有一个简单的DataTable,5列,100行,所以仅仅使用DataTable似乎更容易。有什么问题吗? 既然在我的示例中有了一个数据表“tbl”,我如何查询该数据表以检索正确的数据,即基于员工姓名的EmailAddress?在SQL中,它将是selectemailaddress,其中EmployeeName=SelectedItem。我已经研究过如何使用DataTable的Select方法,但没有任何效果,然后使用DataView的RowFilter方法,但没有任何成功。 有人能给我指一下正确的方向吗


Alex

我根本不使用数据集或数据表。我发现使用它们的唯一原因是,如果您希望使所有数据保持脱机状态,对数据进行更改,然后根据需要将这些更改提交回数据库

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

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

听起来不错,因为你只需要一张桌子。 对DataTable使用Select方法,该方法将返回满足where条件的DataRows数组
一个简单的枚举就可以做到这一点:

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

由于数据集只存储多个数据表,并管理它们之间的关系和视图,所以在这里使用::shubder::DataTable很好

你应该考虑一下这里到底发生了什么。当你说SelectfromEmployeeTable时,你要做的就是从数据库中获取所有数据,然后在应用程序代码中尝试在数据库之外对其进行过滤。出于许多原因,这不是一个好主意,但现在让我们说,我们应该让数据库执行它们真正擅长的工作,即过滤和排序数据

您可能会发现LINQtoSQL是一种非常容易实现的技术,而不是通过ADO.NET实现。有很多关于这个主题的教程,所以尽管它比较老。Linq to SQL本质上允许您将基于集合的SQL知识引入应用程序域,并提供良好的启动性能,即,您可以从员工选择*开始,然后依次向其添加过滤器,例如最终在数据库上执行的WHERE Name='Smith'

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

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

继续使用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

对于100条记录或1000000条记录(如果根据员工姓名编制索引),对于这种特定情况,您最好的选择是使用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是用于离线存储的,在相对罕见的情况下,您需要它。没错,除非您需要脱机缓存整个数据库或数据库的子集,否则没有理由使用数据集。

谢谢您的帮助。我想这对我有帮助,我会试试看。亚历克斯