1

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

谢谢!约书亚

4

3 回答 3

2

您想将整个数据库放入数据集中吗?出于很多原因,这是一个坏主意,但主要是因为随着数据库的增长(这是重点),应用程序中的资源消耗也会增加,并且应用程序将慢慢停止。

除非您的数据库只有两个表(好吧,也许三个),否则我无法想象您为什么要这样做。您应该设计您的应用程序,使其仅在用户请求该部分时才使用它需要的内容。

尝试用好的旧纸和铅笔勾勒出一些窗口,然后模拟用户将看到的内容。我想您会发现您不希望所有数据都在您手中,而只是与用户正在执行的当前操作相关的数据。

于 2010-01-26T23:30:28.840 回答
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);

现在整个集合都填写在一个查询中。
这实际上对性能非常有用。

于 2010-02-05T06:43:49.930 回答
0

(用VB回答,但你应该能够转换它)

要使用一个查询来加载整个数据集...

  1. 创建您的多结果查询。
  2. 使其成为对数据集的一个表适配器的查询(以利用键入的参数等)。
  3. 使用生成的代码的副本重载该查询。
  4. 将最后的 fill(datatable) 语句替换为 fill(dataset) 语句。
  5. 运行代码以将表映射到更正类型的表。

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

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

于 2010-05-08T13:48:33.893 回答