我在 C# 和 Visual Studio 2005 中工作。我有一个向导创建的类型化数据集。我看到我可以运行 MyGeneratedDataSet.tblFoo.Select() 并从每个表中获取数据,但是有没有办法对整个事情进行查询,比如内存中的小数据库,或者我需要做它是一桌接一桌的吗?
谢谢!约书亚
我在 C# 和 Visual Studio 2005 中工作。我有一个向导创建的类型化数据集。我看到我可以运行 MyGeneratedDataSet.tblFoo.Select() 并从每个表中获取数据,但是有没有办法对整个事情进行查询,比如内存中的小数据库,或者我需要做它是一桌接一桌的吗?
谢谢!约书亚
您想将整个数据库放入数据集中吗?出于很多原因,这是一个坏主意,但主要是因为随着数据库的增长(这是重点),应用程序中的资源消耗也会增加,并且应用程序将慢慢停止。
除非您的数据库只有两个表(好吧,也许三个),否则我无法想象您为什么要这样做。您应该设计您的应用程序,使其仅在用户请求该部分时才使用它需要的内容。
尝试用好的旧纸和铅笔勾勒出一些窗口,然后模拟用户将看到的内容。我想您会发现您不希望所有数据都在您手中,而只是与用户正在执行的当前操作相关的数据。
假设您的数据集有两个表 (A,B)
数据库具有相同的表 (A,B)
它们在 DB 和 DataSet 之间的名称可能不同,但是您需要进行映射
它实际上很容易。
(SQL SERVER 示例,伪代码)
string fQuery = "SELECT * FROM A;SELECT * FROM B:";
SqlCommand fCommand = new SqlCommand(fQuery, <connection>);
SqlDataAdapter fAdpter = new SqlDataAdapter(fCommand);
DataSet fSet = new DataSet();
fAdpter .Fill(pSet);
现在整个集合都填写在一个查询中。
这实际上对性能非常有用。
(用VB回答,但你应该能够转换它)
要使用一个查询来加载整个数据集...
1)编写一个存储过程或sql语句,其中有多个返回结果的select语句。
2) 在数据集中的一个表适配器中,添加新查询。
3) 获取此查询的生成代码。最简单的方法是在代码中使用该方法进行查询,然后右键单击该方法并选择“转到定义”。将该方法放在单独的 cs 或 vb 文件中。(见代码块 B)
您需要获取命名空间和 tableadapter 部分类才能使该方法正常工作。
4) 将数据集作为参数添加到重载函数中。该数据集将成为新填充语句的目标。(见代码块 B)
5) 使用以下代码匹配您的数据集结果表。
Public Shared Sub DatasetAutoMerge(ByVal Source As Data.DataSet, ByVal Target As Data.DataSet)
Target.EnforceConstraints = False
For Each dtTarget As Data.DataTable In Target.Tables
For Each dtSource As Data.DataTable In Source.Tables
Dim dtMatch = dtSource
For Each dcTarget As Data.DataColumn In dtTarget.Columns
If Not dtSource.Columns.Contains(dcTarget.ColumnName) Then
'The source does not have a column we need by name, not a match'
dtMatch = Nothing
Exit For
End If
Next
If dtMatch IsNot Nothing Then
dtTarget.Merge(dtMatch, False, Data.MissingSchemaAction.Ignore)
Exit For
End If
Next
Next
Target.EnforceConstraints = True
End Sub
代码块 B(覆盖方法的最终版本示例,VB)
Namespace dsMyDatasetTableAdapters
Partial Public Class Table1TableAdapter
Public Overridable Overloads Function Fill(ByVal dataset As dsMyDataset, ByVal OrderNumber As String) As Integer
Me.Adapter.SelectCommand = Me.CommandCollection(0)
If (RecordID Is Nothing) Then
Me.Adapter.SelectCommand.Parameters(0).Value = Global.System.DBNull.Value
Else
Me.Adapter.SelectCommand.Parameters(0).Value = CType(OrderNumber, String)
End If
'end autogenerated code'
'Start Custom Code'
Dim dsDump As New Data.DataSet
Me.Adapter.Fill(dsDump)
DatasetAutoMerge(dsDump, dataset)
End Function
End Class
End Namespace
我已经使用过这个过程几次。如果您知道要同时加载所有这些,这比编写单独的查询要好得多。我希望这可以帮助你!