ADO.NET 快速入门(五):从 DataSet 更新数据库

时间:2023-03-09 19:39:59
ADO.NET 快速入门(五):从 DataSet 更新数据库
该主题说明了如何使用 DataSet 在数据库中更新数据。你依然可以直接使用 SqlCommand 在数据库中插入、更新、和删除数据,记住这一点也很重要。理解“从数据库填充DataSet”涵盖的概念有助于你理解这个主题。
前一篇“从数据库填充 DataSet”涵盖的部分主题包括从数据库检索数据和填充到 DataSet,以及 DataSet 怎样有别于数据库。一旦 DataSet 被加载,你可以修改数据,并且DataSet 会跟踪变化。
DataSet 可以被认为是从数据库检索出的在内存中的缓存数据。DataSet 包含一组表、关系、和约束。示例1中演示如何使用 Add 方法在 DataTable 添加新数据到 DataSet。Add 方法要么接受预期数据列的数组,要么接受 DataRow 作为参数。
示例1:
            SqlConnection myConnection = new SqlConnection("server=(local);Integrated Security=SSPI;database=northwind");
SqlDataAdapter myDataAdapter = new SqlDataAdapter("SELECT * FROM Customers", myConnection); DataSet myDataSet = new DataSet();
DataRow myDataRow; // 创建命令构建器,会自动创建更新命令,不必手动提供或创建。
SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myDataAdapter); // 为 MissingSchemaAction 属性设置 AddWithKey,除非指定 AddWithKey,Fill 将不会检索到主键 & 唯一键信息。
myDataAdapter.MissingSchemaAction = MissingSchemaAction.AddWithKey;
myDataAdapter.Fill(myDataSet, "Customers"); myDataRow = myDataSet.Tables["Customers"].NewRow();
myDataRow["CustomerId"] = "NewID";
myDataRow["ContactName"] = "New Name";
myDataRow["CompanyName"] = "New Company Name";
myDataSet.Tables["Customers"].Rows.Add(myDataRow); myDataAdapter.Update(myDataSet, "Customers");
请记住,DataTable 必须通过 NewRow 方法返回 DataRow。NewRow 方法返回了与 DataTable 匹配架构的 DataRow 对象。直到新的 DataRow 被添加到 RowsCollection集合之前,它一直独立于这个表。
可以通过 DataRow 改动数据。可以通过 Rows 属性的 RowsCollection 集合使用行索引,如示例2:
示例2:
    myDataSet.Tables["Customers"].Rows[]["ContactName"]="Peach";
你也可以通过主键值访问一个特定行,如示例3:
示例3:
    DataRow myDataRow1 = myDataSet.Tables["Customers"].Rows.Find("ALFKI");
myDataRow1["ContactName"]="Peach";
示例3中的 “ALFKI” 是 “Customers” 表中的主键 “CustomerID” 的值。当使用 SqlDataAdapter 时,主键是从库中建立的。即使没有使用库,你也可以通过 PrimaryKey 属性设置主键值。
使用 Delete 方法移除行。请记住,发生在 DataSet 上的逻辑删除,只有在 DataSet 被更新到数据库时候才会被物理删除(示例4)。同样地,在行被保存的情况下,你可以使用 DataSet 的 RejectChanges 放弃更改。
示例4:
    myDataSet.Tables["Customers"].Rows[].Delete();
行里维护着原始值和新值。原始值和新值皆可以允许被 RowChanging 事件访问,以便决定是否继续编辑。因为我们维护着原始值和新值,所以我们可以建立如乐观锁定和键值改变的场景。
在提交更改回数据库之前,你需要设置 InsertCommand、UpdateCommand、和 DeleteCommand 命令使数据库的变动和 DataSet 一致。对于受限的场景,你可以使用 SqlCommandBuilder 构建器自动生成那些命令对象,如示例5:
示例5:
    SqlCommandBuilder mySqlCommandBuilder = new SqlCommandBuilder(mySqlDataAdapter);
从 DataSet 提交数据到数据库,使用 SqlDataAdapter 的 Update 方法,如示例6:
示例6:
    mySqlDataAdapter.Update(myDataSet, "Customers");