1. 程式人生 > >ADO.NET 快速入門(四):從資料庫填充 DataSet

ADO.NET 快速入門(四):從資料庫填充 DataSet

ADO.NET 快速入門(四):從資料庫填充 DataSet

從資料庫獲取資料很容易,處理資料更容易。如果想要從資料庫獲取只進、只讀的資料流結果集,你可以使用 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語句。下面的例子演示了本節所有的程式碼。瞭解如何更新資料回資料庫,請參考:

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