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