2010-01-26 48 views
1

我在C#和Visual Studio 2005中工作。我有一個嚮導創建的類型化數據集。我發現我可以運行MyGeneratedDataSet.tblFoo.Select()並從每個表中獲取數據,但是有沒有辦法對整個事物進行查詢,比如內存數據庫中的小內存,還是我需要做的事情它按桌子零碎的桌子?立即用連接查詢整個數據集?

謝謝! Joshua

+0

您的DataSet是否包含DataRelations – 2010-07-20 19:17:58

回答

2

你想把整個數據庫放入數據集?由於很多原因,這是一個壞主意,但主要是因爲隨着數據庫的增長(這是重點),應用程序中的資源消耗也會增長,並且您的應用程序會慢慢停下來。

除非你的數據庫只有兩個表(好吧,也許三個),我無法想象你爲什麼要這樣做。您應該設計您的應用程序,以便在用戶請求該部分時僅消耗所需的應用程序。

嘗試使用優質舊紙和鉛筆勾畫出一些窗口,並模擬用戶將看到的內容。我想你會看到你不想讓你手中的所有數據,只是與用戶正在採取的當前操作相關的數據。

+0

有許多表,但在這種情況下,每個表中只有一對記錄,因爲我有這個導出的XML文件包含一個連接的記錄(在多個表上)並且想要使用代碼用於從數據庫加載記錄,從數據集加載它,然後用戶可以比較它們。 – Joshua 2010-01-26 23:35:09

+0

我的意見仍然是,最好加載你知道你應該加載,而不是一切。如果你仍然打算這樣做,你可以看看類似的問題http://stackoverflow.com/questions/2037522/how-to-load-sql-server-db-into-dataset – 2010-01-27 15:28:07

0

假設你的數據集有兩個表(A,B)
數據庫有相同的表(A,B)
他們可以在名稱beween DB和數據集有所不同,但那麼你需要做的映射

其實很簡單。
(SQL服務器的例子,pseudoish代碼)

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); 

現在整個集填充一個查詢。
這對於性能來說確實很棒。

0

(答案在VB,但你應該能夠將其轉換)

使用一個查詢來加載整個數據集...

  1. 創建多結果的查詢。
  2. 使其成爲查詢您的數據集的一個表適配器(以利用鍵入的參數等)。
  3. 用生成的代碼的副本重載該查詢。
  4. 用填充(數據集)語句替換最終填充(datatable)語句。
  5. 運行代碼以將表映射到正確的類型表。

1)編寫一個存儲過程或具有多個返回結果的select語句的sql語句。

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 

我用這個過程幾次。如果你知道你想同時加載所有這些,比編寫單獨的查詢要好得多。我希望這可以幫助你!