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
此时我有两个问题:
有人能指出我正确的方向吗?
亚历
答案 0 :(得分:1)
我根本不使用DataSet或DataTables。我发现使用它们的唯一原因是,如果您想要“脱机”保存所有数据,请对数据进行更改,然后根据需要将这些更改提交回数据库。
如果您所做的只是根据用户交互从服务器获取数据,那么使用DataTable可能会有点过分。
编辑:哦,并回答你的实际问题:
答案 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)
由于DataSet只存储多个DataTable并管理它们之间的关系和视图,所以你可以在这里使用:: shudder :: DataTable。
你应该考虑到这里究竟发生了什么。当您说“SELECT * FROM EmployeeTable”时,您将要做到这一点 - 从数据库中获取所有数据,然后尝试在应用程序代码中将其过滤到数据库之外。出于多种原因,这不是一个好主意,但现在让我们说,我们应该让数据库执行他们真正擅长的工作,即过滤和排序数据。
您可能会发现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。