標籤:c#、ado.net
6、DataAdapter的使用
.NET架構通過 DataAdapter 來控制與現有資料來源的互動,每個 .NET 資料提供者都包含一個 DataAdapter對象;OLE DB .NET 資料提供者包含一個 OLEDBDataAdapter 對象,
而 SQL Server .NET 資料提供者包含一個 SqlDataAdapter 對象。
DataAdapter 對象用於從資料來源中檢索資料並填充 DataSet 中的表,並且還會將對 DataSet 作出的更改解析回資料來源。
DataAdapter 使用 .NET 資料提供者的 Connection 來串連到資料來源,使用 Command 對象從資料來源中檢索資料並將更改解析回資料來源。
6.1、使用DataAdapter填充DataSet
DataAdapter 的 SelectCommand 屬性是一個 Command 對象,它從資料來源中檢索資料。DataAdapter 的InsertCommand、UpdateCommand和DeleteCommand屬性也是 Command 對象,
它們按照對 DataSet 中資料的修改來管理對資料來源中資料的更新。
DataAdapter 的Fill方法用於使用 DataAdapter 的SelectCommand 的結果來填充 DataSet。Fill將要填充的DataSet和DataTable對象用作它的參數。
如果資料來源中存在主鍵且 DataAdapter.MissingSchemaAction設定為MissingSchemaAction.AddWithKey,否則不會建立主鍵。
6.1.1、代碼:
SqlConnection nwindConn = new SqlConnection("……");
SqlCommand selectCMD = new SqlCommand("SELECT CustomerID, CompanyName FROM Customer", nwindConn);
selectCMD.CommandTimeout = 30;
SqlDataAdapter custDA = new SqlDataAdapter();
custDA.SelectCommand = selectCMD;
nwindConn.Open();
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");
nwindConn.Close();
OleDbConnection nwindConn = new OleDbConnection("……");
OleDbCommand selectCMD = new OleDbCommand("SELECT CustomerID, CompanyName FROM Customers", nwindConn);
selectCMD.CommandTimeout = 30;
OleDbDataAdapter custDA = new OleDbDataAdapter();
custDA.SelectCommand = selectCMD;
DataSet custDS = new DataSet();
custDA.Fill(custDS, "Customers");
//這段代碼沒有顯示的開啟和關閉 Connection 如果Fill方法發現串連尚未開啟,它將隱式的開啟並關閉 Connection
6.1.2、多個結果集
如果 DdataAdapter 遇到多個結果集,它將在 DataSet 中建立多個表。將向這些表提供遞增的預設名稱 TableN,
以表示 Table() 的Table為第一個表名。如果以參數形式向Fill方法傳遞表名稱,則將向這些表提供遞增的預設名稱 TableNameN,
這些表名稱以表示TableName() 的 TableName為起始。
6.1.2、從多個 DataAdapter 填充 DataSet
可以將任意數量的DataAdapter與一個DataSet一起使用。每個DataAdapter都可用於填充一個或多個DataTable對象並將更新解析回相關資料來源。
//下面程式碼範例從 Microsoft SQL Server 2000上的Northwind資料庫填充客戶列表,從儲存在 Microsoft Access 2000 中的Northwind資料庫填充訂單列表。
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
class DoubleAdapter
{
public static void Main()
{
SqlConnection custConn = new SqlConnection("……");
SqlDataAdapter custDA = new SqlDataAdapter("SELECT * FROM Customers", custConn);
OleDbConnection orderConn = new OleDbConnection("……");
OleDbDataAdapter orderDA = new OleDbDataAdapter("SELECT * FROM Orders", orderConn);
custConn.Open();
orderConn.Open();
DataSet custDS = new DataSet();
//填充資料集
custDA.Fill(custDS, "Customers");
orderDA.Fill(custDS, "Orders");
//關閉串連
custConn.Close();
orderConn.Close();
DataRelation custOrderRel = custDS.Relations.Add("Customers",
custDS.Tables["Customers"].Columns["CustomerID"],
custDS.Tables["Orders"].Columns["OrderID"]);
foreach (DataRow pRow in custDS.Tables["Customers"].Rows)
{
Console.WriteLine(pRow["CustomerID"]);
foreach (DataRow cRow in pRow.GetChildRows(custOrderRel))
{
Console.WriteLine("\t" + cRow["OrderID"])
}
}
}
}
6.2、使用DataAdapter、DataSet更新資料庫
DataAdapter 的 Update 方法可調用來將 DataSet中的更改解析回資料來源。與Fill方法類似,
Update方法將DataSet執行個體和可選DataTable對象或DataTable名稱用作參數。
DataSet執行個體是包含已作出的更改的DataSet,而D啊他Table標識從其中檢索更改的表。
當調用Update方法時,DataAdapter將分析已作出的更改並執行相應的命令(INSERT、UPDATE、DELETE)。
當DataAdapter遇到對DataRow的更改時,它將使用InsertCommand、UpdateCommand、DeleteCommand來處理該更改。
當不存在用於已刪除行的DeleteCommand或其他命令,將引發異常。
6.2.1、使用DataAdapter參數
DataAdapter的Command參數可用於為DataSet中每個已修改行的SQL語句或預存程序指定輸入和輸出的值。
在調用DataAdapter的Update方法之前,必須設定InsertCommand、UpdateCommand或DeleteCommand屬性。
//範例程式碼:
custDA.Parameters.Add("@CompanyName", SqlDbType.NChar, 15, "CompanyName");
SqlParameter myParm = custDA.UpdateCommand.Parameters.Add("@CustomerID", SqlDbType.NChar, 5, "CustomerID");
myParm.SourceVersion = DataRowVersion.Original;
Parameters集合的Add方法採用參數的名稱、DataAdapter特定類型、大小(如果可應用於該類型)以及 DataTable中SourceColumn
的名稱。請注意,@CustomerID參數的SourceVersion設定為Original。這樣,如果識別欄位的值已經在修改後的DataRow中被更改,
就一定會更新資料來源中的現有行。在這種情況下,Original行值將匹配資料來源中的當前值,而Current行值將包含更新的值。
如果沒有為@CompanyName參數設定SourceVersion,而將使用預設的Current行值。
7、建立和使用DataSet
7.1、DataSet涉及到的方法:
在DataSet中以編程方式建立DataTables、DataRelations和Constraints並使用資料填充這些表。
通過DataAdapter用現有關係資料來源中的資料表填充DataSet。
使用XML載入和保持DataSet內容。
7.2、建立DataSet
預設參數為: "NewDataSet"
//代碼:
DataSet custDS = new DataSet("xxx");
7.3、向DataSet添加DataTable
ADO.NET可以建立DataTable對象並將其添加到現有的DataSet中。可以使用要添加到DataTable的Columns集合中的DataColumn對象的PromaryKey和Unique屬性來設定DataTable的約束資訊。
//範例程式碼: 以下構造一個DataSet,將一個新的DataTabel對象添加到該DataSet中,然後將3個DataColumn對象添加到該表中,最後設定一個主鍵列。
DataSet custDS = new DataSet("CustomerOrders");
DataTable orderTable = custDS.Table.Add("Orders");
//添加Column
DataColumn pkCol = ordersTable.Columns.Add("OrderID", typeof(Int32));
ordersTable.Columns.Add("OrderQuantity", typeof(Int32));
ordersTable.Columns.Add("CompanyName", typeof(string));
//添加主鍵
orderTable.PrimaryKey = new DataColumn[]{pkCol};
7.4、添加表關係DataRelation
在包含多個DataTable對象的DataSet中,可以使用DataRelation對象來使一個表與另一個表相關,在多個表之間導航,
以及從相關表中返回子行或父行。
建立DataRelation所需的參數是DataRelation的名稱以及用作關係中父列和子列的一個或多個DataColumn引用的數組。
當建立DataRelation後,可以使用它在多個表之間導航和檢索值。預設情況下,向DataSet中添加DataRelation會將一個
UniqueConstraint添加到父表中,並將一個ForeignKeyConstraint添加到子表中。
//一下程式碼範例使用DataSet中的兩個DataTable對象來建立一個DataRelation。每個DataTable包含一個名為CustID的列,它用作兩個DataTable對象之間的連結。
//每個DataTable包含一個名為CustID的列,它用作兩個DataTable對象之間的連結。
//該樣本中的第一個參數所建立的DataRelation的名稱。第二個參數設定父DataColumn,第三個參數設定子DataColumn。
custDS.Relations.Add("CustOrders", custDS.Tables["Customers"].Columns["CustID"]),
custDS.Tables["Orders"].Columns["CustID"]);
本文出自 “八部天龍” 部落格,請務必保留此出處http://1224517743.blog.51cto.com/2643474/1610232
C#資料庫開發讀書筆記2---DataAdapter、DataSet的使用