ADO.NET:数据集或数据表以及如何检索数据
所以社区 我刚开始使用ADO.NET,对编程相当陌生。我已经得到了这个社区的一些支持,这是非常有用的,还有一个问题 简单来说,我正在创建一个简单的windows表单,其中包含一个员工姓名组合框和一个按钮,这样当用户单击按钮时,所选员工的电子邮件地址就会显示在表单的文本框中 在我的项目中,我有一个数据库,在加载表单时,我连接到数据库并创建一个datatable,如下所示:ADO.NET:数据集或数据表以及如何检索数据,.net,database,ado.net,.net,Database,Ado.net,所以社区 我刚开始使用ADO.NET,对编程相当陌生。我已经得到了这个社区的一些支持,这是非常有用的,还有一个问题 简单来说,我正在创建一个简单的windows表单,其中包含一个员工姓名组合框和一个按钮,这样当用户单击按钮时,所选员工的电子邮件地址就会显示在表单的文本框中 在我的项目中,我有一个数据库,在加载表单时,我连接到数据库并创建一个datatable,如下所示: Public Class GetEmployeeDataset Private tbl As New 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是用于离线存储的,在相对罕见的情况下,您需要它。没错,除非您需要脱机缓存整个数据库或数据库的子集,否则没有理由使用数据集。谢谢您的帮助。我想这对我有帮助,我会试试看。亚历克斯