從數據庫獲取數據很容易,處理數據更容易。如果想要從數據庫獲取只進、只讀的數據流結果集,你可以使用 DataReader 執行命令並且檢索它。關於如何使用 DataReader,請參考: 使用 OLE DB 檢索數據 、 使用 SQL Server 檢索數據 。更多關於綁定、瀏覽、或者遠程處理數據查詢結果集的操作,你可以如下例所示把結果集放到 DataSet 里。
請記住最重的是,DataSet 是一種獨立的有別於數據存儲的數據結構。盡管示例從數據庫獲取數據,但是數據來源是無所謂的;DataSet 總是呈現出一種統一的編程模型。這是一個簡單的關於關系型數據庫收集數據的示例。由於數據來源不可知,DataSet 上沒有加載、打開、或者執行操作。本節描述了如何使用 SqlDataAdapter 從數據庫獲取數據填充到DataSet。
你可以使用 Add 方法添加數據到 DataSet(請參考:
從 DataSet 更新數據庫),或者直接使用原生的XML方法(請參考:
讀寫 XML 數據)推送數據。SqlDataAdapter 除了可以用於從數據庫檢索數據,也可以反向推送數據回數據庫。這里,重點關注的是獲取輸出數據。
第一步是構建 SqlDataAdapter。也可以使用 SqlCommand 來構建 SqlDataAdapter。
String SelectCmdString = "select * from customers"; SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(SelectCmdString, myConnection); SqlCommand mySelectCommand = New SqlCommand("select * from customers", myConnection); SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter(mySelectCommand);
除了 Fill 和 Update 方法以外,SqlDataAdapter 對象和 SqlCommand 對象非常類似。Fill 方法填充 DataSet 對象。Update 方法獲取DataSet 的改動,並且把改動反映回數據庫。這是 DataAdapter 上指定的4個命令完成的。這些命令是:SelectCommand、UpdateCommand、InsertCommand,和 DeleteCommand。你可以顯式的指定這些命令,在運行時控制語句執行變動,包括使用存儲過程。對於特別的場景,CommandBuilder 對象可以基於 select 語句 (參考:
從 DataSet 更新數據庫). 在運行時創建他們。然而,運行時創建需要一次額外的服務器往返以便收集必要的元數據,因此在設計時顯式提供 insert、update、和 delete 命令可以得到更好的運行時性能。
備注:Visual Studio 建立了類型化 SqlDataAdapters 和 DataSets,並且最終為你創建存儲過程。通過使用 ComponentDesigner 和數據庫對象探究這個特性。
一旦創建了 SqlDataAdapter 對象,你就可以通過它來填充 DataSet。
myDataSet = new DataSet(); mySqlDataAdapter.Fill(myDataSet,"Customers");
當前的 DataSet 保存查詢結果集。實際上,DataSet 可以從多個查詢甚至關聯他們的查詢(請參考:
使用關系型數據)保存結果集。因為保存了多個結果集,所以 DataSet 包含了一組表。請注意 Fill 方法允許“Customers”作為第二個參數。這是填充到 DataSet 中的表名。如果表不存在,就為你創建它。
因為數據是存儲在表里一組行里面,所以你可以很容易使用 foreach 語句來迭代這些行:
foreach (DataRow myDataRow in myDataSet.Tables["Customers"].Rows) { Console.WriteLine(myDataRow["CustomerId"].ToString()); }
實際上,在列上同樣可以使用foreach語句。下面的例子演示了本節所有的代碼。了解如何更新數據回數據庫,請參考:
從 DataSet 更新數據庫。
public class GettingDataExample { public void Run() { SqlConnection myConnection = new SqlConnection("server=(local);Integrated Security=SSPI;database=northwind"); string selectCmdString = "SELECT * FROM Customers"; // 構建 SqlDataAdapter SqlDataAdapter myDataAdapter1 = new SqlDataAdapter(selectCmdString, myConnection); // 使用 SqlCommand 構建 SqlDataAdapter SqlCommand mySelectCommand = new SqlCommand(selectCmdString, myConnection); SqlDataAdapter myDataAdapter2 = new SqlDataAdapter(mySelectCommand); DataSet myDataSet = new DataSet(); myDataAdapter1.Fill(myDataSet, "Customers"); // 迭代 DataSet foreach (DataRow myDataRow in myDataSet.Tables["Customers"].Rows) { Console.WriteLine(myDataRow["CustomerId"].ToString()); } } }