我在C#和Visual Studio 2005中工作。我有一个向导创建的类型化DataSet。我看到我可以运行MyGeneratedDataSet.tblFoo.Select()并从每个表中获取数据,但有没有办法对整个事物进行查询,比如内存中的小数据库,或者我需要做什么它是桌子旁的零碎表吗?
谢谢! 约书亚
答案 0 :(得分:2)
您想将整个数据库带入数据集吗?出于很多原因,这是一个坏主意,但主要是因为随着数据库的增长(这一点),您的应用程序中的资源消耗也会增长,并且您的应用程序将慢慢停止运行。
除非您的数据库只有两个表(好的,可能是三个),否则我无法想象您为什么要这样做。您应该设计您的应用程序,以便它只消耗用户要求该文件时所需的内容。
尝试使用旧纸和铅笔绘制一些窗户,并模拟用户将看到的内容。我想你会发现你并不想要掌握所有数据,只需要与用户当前采取的行动相关的数据。
答案 1 :(得分:0)
假设您的数据集有两个表(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);
现在整个集合都填写了一个查询 这实际上可以很好地表现。
答案 2 :(得分:0)
(在VB中回答,但你应该可以转换它)
使用一个查询加载整个数据集......
1)编写一个存储过程或sql语句,它有多个返回结果的select语句。
2)在数据集中的一个tableadapter中,添加新查询。
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
我已经使用过几次了。如果你知道你想要同时加载所有这些,那么它比编写单独的查询要好得多。我希望这可以帮助你!