OscarCommandBuilder

OscarCommandBuilder是ADO.NET2.0新增的类新增的概念。ADO.NET2.0改变了DbDataAdapter更新数据库的方式,从而提升了性能。批处理更新支持被加入到DbDataAdapter中。这就意味着在调用Update方法时,DbDataAdapter把DataSet中的所有更新一次全部返回到数据库中。

每当设置了DataAdapter属性,OscarCommandBuilder就将其本身注册为RowUpdating事件的侦听器。一次只能将一个OscarDataAdapter与一个OscarCommandBuilder对象互相联系。

为了生成Insert,Update或Delete语句,OscarCommandBuilder会自动使用SelectCommand属性来检索所需的元数据集。如果在检索元数据后(例如在第一次更新后)更改 SelectCommand,则应调用RefreshSchema方法来更新元数据。

SelectCommand 还必须至少返回一个主键列或唯一的列。如果什么都没有返回,就会产生 InvalidOperationException 异常,不生成命令。

OscarCommandBuilder 还使用由 SelectCommand 引用的 Oscar Connection和Oscar Transaction属性。 如果修改了任何这些属性或者替换了 SelectCommand 本身,用户则应调用 RefreshSchema。否则,InsertCommand和DeleteCommand属性都保留它们以前的值。

如果调用 Dispose,则会解除 OscarCommandBuilder 与 OscarDataAdapter 的关联,并且不再使用生成的命令。(更多请参考MSDN)

如果,上一个示例采用OscarCommandBuilder对象来操作,则不必手动注册UpdateCommand。

如下的示例介绍该特性的用法:

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.OscarClient;
using System.Data;
using System.Data.SqlClient;
namespace TestProviderForHelpfiles
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectString = "Server=10.0.5.226;Port=2003;User
                                Id=SYSDBA;Password=szoscar55;Database=OSRDB;Encoding=GBK;";
            OscarConnection TheConnection = new OscarConnection(connectString);
            TheConnection.Open();
            DataSet ds = new DataSet();
            OscarDataAdapter da = new OscarDataAdapter("select * from tableb where
                    field_serial = (select max(field_serial) from tableb)",
                    TheConnection);
            OscarCommandBuilder cb = new OscarCommandBuilder(da);
            da.Fill(ds);
            DataTable dt = ds.Tables[0];
            DataRow dr = ds.Tables[0].Rows[ds.Tables[0].Rows.Count - 1];
            dr["field_int2"] = 4;
            DataSet ds2 = ds.GetChanges();
            da.Update(ds2);
            ds.Merge(ds2);
            ds.AcceptChanges();
            OscarDataReader dr2 = new OscarCommand("select * from tableb where
                                                field_serial = (select max(field_serial) from tableb)",
                                                TheConnection).ExecuteReader();
            dr2.Read();
            Console.WriteLine(dr2["field_int2"].ToString());
            dr2.Close();
        }
    }
}