我在C#和Visual Studio 2005中工作。我有一個嚮導創建的類型化數據集。我發現我可以運行MyGeneratedDataSet.tblFoo.Select()並從每個表中獲取數據,但是有沒有辦法對整個事物進行查詢,比如內存數據庫中的小內存,還是我需要做的事情它按桌子零碎的桌子?立即用連接查詢整個數據集?
謝謝! Joshua
我在C#和Visual Studio 2005中工作。我有一個嚮導創建的類型化數據集。我發現我可以運行MyGeneratedDataSet.tblFoo.Select()並從每個表中獲取數據,但是有沒有辦法對整個事物進行查詢,比如內存數據庫中的小內存,還是我需要做的事情它按桌子零碎的桌子?立即用連接查詢整個數據集?
謝謝! Joshua
你想把整個數據庫放入數據集?由於很多原因,這是一個壞主意,但主要是因爲隨着數據庫的增長(這是重點),應用程序中的資源消耗也會增長,並且您的應用程序會慢慢停下來。
除非你的數據庫只有兩個表(好吧,也許三個),我無法想象你爲什麼要這樣做。您應該設計您的應用程序,以便在用戶請求該部分時僅消耗所需的應用程序。
嘗試使用優質舊紙和鉛筆勾畫出一些窗口,並模擬用戶將看到的內容。我想你會看到你不想讓你手中的所有數據,只是與用戶正在採取的當前操作相關的數據。
有許多表,但在這種情況下,每個表中只有一對記錄,因爲我有這個導出的XML文件包含一個連接的記錄(在多個表上)並且想要使用代碼用於從數據庫加載記錄,從數據集加載它,然後用戶可以比較它們。 – Joshua 2010-01-26 23:35:09
我的意見仍然是,最好加載你知道你應該加載,而不是一切。如果你仍然打算這樣做,你可以看看類似的問題http://stackoverflow.com/questions/2037522/how-to-load-sql-server-db-into-dataset – 2010-01-27 15:28:07
假設你的數據集有兩個表(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);
現在整個集填充一個查詢。
這對於性能來說確實很棒。
(答案在VB,但你應該能夠將其轉換)
使用一個查詢來加載整個數據集...
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
我用這個過程幾次。如果你知道你想同時加載所有這些,比編寫單獨的查詢要好得多。我希望這可以幫助你!
您的DataSet是否包含DataRelations – 2010-07-20 19:17:58