通过连接一次查询整个数据集?

时间:2010-01-26 22:42:56

标签: c# dataset strongly-typed-dataset

我在C#和Visual Studio 2005中工作。我有一个向导创建的类型化DataSet。我看到我可以运行MyGeneratedDataSet.tblFoo.Select()并从每个表中获取数据,但有没有办法对整个事物进行查询,比如内存中的小数据库,或者我需要做什么它是桌子旁的零碎表吗?

谢谢! 约书亚

3 个答案:

答案 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. 创建多结果查询。
  2. 使其成为您的某个数据集的tableadapters的查询(以利用键入的参数等)。
  3. 使用生成的代码副本重载该查询。
  4. 用fill(dataset)语句替换最终填充(datatable)语句。
  5. 运行代码以将表映射到正确的类型表。
  6. 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
    

    我已经使用过几次了。如果你知道你想要同时加载所有这些,那么它比编写单独的查询要好得多。我希望这可以帮助你!