作者:Mauricio Ritter       翻译:小新0574

原文(代码)链接:http://www.codeproject.com/cs/database/relationaladonet.asp

Creating the structure (SQL Server 2000)

We'll start by creating the same structure that we used for Access 2000, but instead of creating the DataAdapter commands using the CommandBuilder, we'll create them by code, since we're going to use a SQL Server stored procedure to update the data.

我们将开始于创建我们为Access2000使用的相同的结构,但是与前面使用CommandBuilder创建DataAdapter命令不同,我们使用代码创建它们,因为我们要用一个SQL储存过程来更新数据。

CodeProject - Inserting relational data using DataSet and DataAdapter(下)// Create the DataSet object
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
DataSet oDS = new DataSet();
CodeProject - Inserting relational data using DataSet and DataAdapter(下)SqlConnection conn 
= new SqlConnection("Data Source=.;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
        Initial Catalog=Orders;Integrated Security=SSPI");
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
conn.Open();
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
// Create the DataTable "Orders" in the Dataset and the OrdersDataAdapter
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
SqlDataAdapter oOrdersDataAdapter = new
CodeProject - Inserting relational data using DataSet and DataAdapter(下)    SqlDataAdapter(
new SqlCommand("SELECT * FROM Orders", conn));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oOrdersDataAdapter.InsertCommand 
= new 
CodeProject - Inserting relational data using DataSet and DataAdapter(下)    SqlCommand(
"proc_InsertOrder", conn);
CodeProject - Inserting relational data using DataSet and DataAdapter(下)SqlCommand cmdInsert 
= oOrdersDataAdapter.InsertCommand;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.CommandType 
= CommandType.StoredProcedure;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters.Add(
new SqlParameter("@OrderId", SqlDbType.Int));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters[
"@OrderId"].Direction = ParameterDirection.Output;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters[
"@OrderId"].SourceColumn = "OrderId";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters.Add(
new SqlParameter("@CustomerName"
CodeProject - Inserting relational data using DataSet and DataAdapter(下)                             SqlDbType.VarChar,
50,"CustomerName"));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)                             
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters.Add(
new SqlParameter("@ShippingAddress",
CodeProject - Inserting relational data using DataSet and DataAdapter(下)                             SqlDbType.VarChar,
50,"ShippingAddress"));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oOrdersDataAdapter.FillSchema(oDS, SchemaType.Source);
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)DataTable pTable 
= oDS.Tables["Table"];
CodeProject - Inserting relational data using DataSet and DataAdapter(下)pTable.TableName 
= "Orders";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
// Create the DataTable "OrderDetails" in the
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
// Dataset and the OrderDetailsDataAdapter
CodeProject - Inserting relational data using DataSet and DataAdapter(下)

CodeProject - Inserting relational data using DataSet and DataAdapter(下)SqlDataAdapter oOrderDetailsDataAdapter 
= new
CodeProject - Inserting relational data using DataSet and DataAdapter(下)      SqlDataAdapter(
new SqlCommand("SELECT * FROM OrderDetails", conn));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oOrderDetailsDataAdapter.InsertCommand 
= new 
CodeProject - Inserting relational data using DataSet and DataAdapter(下)      SqlCommand(
"proc_InsertOrderDetails", conn);
CodeProject - Inserting relational data using DataSet and DataAdapter(下)      
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert 
= oOrderDetailsDataAdapter.InsertCommand;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.CommandType 
= CommandType.StoredProcedure;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters.Add(
new SqlParameter("@OrderId", SqlDbType.Int));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters[
"@OrderId"].SourceColumn = "OrderId";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters.Add(
new SqlParameter("@ProductId", SqlDbType.Int));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters[
"@ProductId"].SourceColumn = "ProductId";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters.Add(
new 
CodeProject - Inserting relational data using DataSet and DataAdapter(下)   SqlParameter(
"@ProductName", SqlDbType.VarChar,50,"ProductName"));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters.Add(
new 
CodeProject - Inserting relational data using DataSet and DataAdapter(下)   SqlParameter(
"@UnitPrice", SqlDbType.Decimal));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters[
"@UnitPrice"].SourceColumn = "UnitPrice";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters.Add(
new SqlParameter("@Quantity", SqlDbType.Int ));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)cmdInsert.Parameters[
"@Quantity"].SourceColumn = "Quantity";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oOrderDetailsDataAdapter.FillSchema(oDS, SchemaType.Source);
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)pTable 
= oDS.Tables["Table"];
CodeProject - Inserting relational data using DataSet and DataAdapter(下)pTable.TableName 
= "OrderDetails";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
// Create the relationship between the two tables
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
oDS.Relations.Add(new DataRelation("ParentChild",
CodeProject - Inserting relational data using DataSet and DataAdapter(下)    oDS.Tables[
"Orders"].Columns["OrderId"],
CodeProject - Inserting relational data using DataSet and DataAdapter(下)    oDS.Tables[
"OrderDetails"].Columns["OrderId"]));
CodeProject - Inserting relational data using DataSet and DataAdapter(下)

In this piece of code we're manually creating a SqlCommand to do all the inserts in the database table through the DataAdapter. Each SqlCommand calls a stored procedure in the database that has the parameters structure equal to the table structure.

在这段代码里我们手工创建了一个SqlCommand通过DataAdapter来实现数据表的所有插入。每个SqlCommand调用数据库里的一个储存过程,这个数据库有等同于表结构的参数结构。

The most important thing here is the OrderId parameter of the first DataAdapter's command. This parameter has a different direction than the others. The parameter has an output direction and a source column mapped to the OrderId column of the DataTable. With this structure, after each execution, the stored procedure will return the value to this parameter, that will be copied to the OrderId source column. The OrderId parameter receives the @@IDENTITY inside the procedure, like the one below.

在这最重要的东西就是在第一个DataAdapter命令里的OrderId 参数。这个参数跟其他的相比有一个不同的direction这个参数有一个output direction和一个映射到DataTableOrderId列的源列。有了这个结构,在每次执行以后,储存过程就会为这个参数返回一个值,这样这个值就会被拷贝到源OrderId列。OrderId参数在储存过程里接受@@IDENTITY,就像下面的这个:

CodeProject - Inserting relational data using DataSet and DataAdapter(下)CREATE PROCEDURE proc_InsertOrder
CodeProject - Inserting relational data using DataSet and DataAdapter(下)(@OrderId 
int output,
CodeProject - Inserting relational data using DataSet and DataAdapter(下) @CustomerName varchar(
50),
CodeProject - Inserting relational data using DataSet and DataAdapter(下) @ShippingAddress varchar(
50)
CodeProject - Inserting relational data using DataSet and DataAdapter(下))
CodeProject - Inserting relational data using DataSet and DataAdapter(下) AS
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)INSERT INTO Orders (CustomerName, ShippingAddress)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)VALUES
CodeProject - Inserting relational data using DataSet and DataAdapter(下)(@CustomerName, @ShippingAddress)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)SELECT @OrderId
=@@IDENTITY
CodeProject - Inserting relational data using DataSet and DataAdapter(下)

Inserting the Data

Now that we set the entire structure, its time to insert the data. The process is exactly the same as we have done with the Access database, using the SetParentRow method to maintain the relationship and guarantee that the IDENTITY column will be copied to the child table (OrderDetails).

现在我们设置了整个结构,是时候来插入数据了。过程就跟我们处理Access数据库一样,使用SetParentRow 方法维持关系,保证IDENTITY列被拷贝到子表里(OrderDetails)

CodeProject - Inserting relational data using DataSet and DataAdapter(下)// Insert the Data
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
DataRow oOrderRow = oDS.Tables["Orders"].NewRow();
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oOrderRow[
"CustomerName"= "Customer ABC";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oOrderRow[
"ShippingAddress"= "ABC street, 12345";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oDS.Tables[
"Orders"].Rows.Add(oOrderRow);
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)DataRow oDetailsRow 
= oDS.Tables["OrderDetails"].NewRow();
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oDetailsRow[
"ProductId"= 1;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oDetailsRow[
"ProductName"= "Product 1";
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oDetailsRow[
"UnitPrice"= 1;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oDetailsRow[
"Quantity"= 2;
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oDetailsRow.SetParentRow(oOrderRow);
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oDS.Tables[
"OrderDetails"].Rows.Add(oDetailsRow);
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oOrdersDataAdapter.Update(oDS, 
"Orders");
CodeProject - Inserting relational data using DataSet and DataAdapter(下)oOrderDetailsDataAdapter.Update(oDS, 
"OrderDetails");
CodeProject - Inserting relational data using DataSet and DataAdapter(下)
CodeProject - Inserting relational data using DataSet and DataAdapter(下)conn.Close();
CodeProject - Inserting relational data using DataSet and DataAdapter(下)

If you check the database you'll see that the OrderId column is updated with the correct IDENTITY column value.

如果你检查数据库你就会发现OrderId列更新了正确的IDENTITY 列值。

相关文章: