1.SelectCommand使用的select命令中必须包含主键(primary key)!
2.填充数据集时,使用如下方法:
da.FillSchema(ds,SchemaType.Source, "TableName"); //加载表架构 注意
da.Fill(dsPubs,"TableName"); //加载表数据
3. DataAdapter 的 MissingSchemaAction 属性设置为 AddWithKey
4.构造CommandBuilder对象时,将DataAdapter对象作为构造函数参数传入:
SqlCommandBuilder objCommandBuilder = new SqlCommandBuilder(da);
5.增加行,修改行,删除行;
6.调用DataAdapter的update方法更新数据源!
7.更新数据源成功,调用ds的Acceptchanges()方法,更新数据集!
对于在运行时动态指定 SelectCommand(例如通过采用用户提供的文本命令的查询工具)的情况,可能无法在设计时指定合适的 InsertCommand、UpdateCommand 或 DeleteCommand。如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommand、InsertCommand 和UpdateCommand。
为了自动生成命令,必须设置 SelectCommand 属性,这是最低的要求。SelectCommand 所检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。
为了返回构造插入、更新和删除命令所必需的元数据,CommandBuilder 必须执行 SelectCommand。因此,必须额外经历一次到数据源的行程,这可能会降低性能。若要实现最佳性能,请显式指定命令而不是使用 CommandBuilder。
SelectCommand 还必须返回至少一个主键或唯一列。如果不存在任何主键或唯一列,则将生成 InvalidOperation 异常,并且不会生成命令。
当与 DataAdapter 关联时,CommandBuilder 将自动生成 DataAdapter 的 InsertCommand、UpdateCommand和 DeleteCommand 属性(如果它们是空引用)。如果已存在用于某属性的 Command,则将使用现有 Command。
通过联接两个或更多个表来创建的数据库视图不会被视为单个数据库表。在这种情况下,将无法使用 CommandBuilder 来自动生成命令,而需要显式地指定命令。有关显式设置命令以便将对 DataSet 的更新解析回数据源的信息,请参阅使用 DataAdapter 和 DataSet 更新数据库。
11.8 使用CommandBuilder对象
前面我们介绍了DataSet对象的4种典型功能,包括数据的提取、删除、更新和插入。实际上我们是对DataSet对象的4个属性分别定义相应的SQL语句来完成的。比如,对SelectCommand对象定义Select语句,对DeleteCommand对象定义Delete语句等。
每次都需要开发人员来设计这些SQL语句是不是很烦琐?有没有很简单的解决方法呢?这就是CommandBuilder对象。
.NET Framework中的每种数据提供者都有自己的CommandBuilder对象,比如,SqlCommandBulder对象就是SQL Server数据库提供者的命名绑定对象。OleDb数据提供者的对象就是OleDbCommandBuilder等。
11.8.1 CommandBuilder对象使用方法
要使用CommandBuilder对象,需要首先定义起一个实例,将该实例绑定到数据适配器对象,然后调用数据适配器对象的Update方法更新DataSet对象即可。比如下面的语句。
SqlCommandBuilder MyCb = new SqlCommandBuilder(MyAdapter);
MyAdapter.Update(MyDataSet, "T_STUDENT");
11.8.2 使用CommandBuilder对象更新
下面介绍使用CommandBuilder对象更新数据的实例。
在Visual Studio 2005中新建一个控制台项目。在Program..cs文件中输入下列代码。该项目完成和ConsoleApplication2一样的更新数据的功能,但是不再需要定义UpdateCommand属性的Update语句了。
//引用系统命名空间
using System;
using System.Data;
using System.Data.SqlClient;
//项目生成的命名空间
namespace ConsoleApplication5
{
}
光盘文件:\ch11\ConsoleApplication5。
11.8.3 使用CommandBuilder对象插入
下面介绍使用CommandBuilder对象插入数据的实例。
在Visual Studio 2005中新建一个控制台项目。在Program..cs文件中输入下列代码。该项目完成和ConsoleApplication3一样的更新数据的功能,但是不再需要定义InsertCommand属性的Insert语句了。
//引用系统命名空间
using System;
using System.Data;
using System.Data.SqlClient;
//项目生成的命名空间
namespace ConsoleApplication6
{
}