使用CommandBuilder对象

来源:互联网 发布:sims4 mac版破解版 编辑:程序博客网 时间:2024/06/15 05:26

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(例如通过采用用户提供的文本命令的查询工具)的情况,可能无法在设计时指定合适的 InsertCommandUpdateCommand 或 DeleteCommand。如果 DataTable 映射到单个数据库表或从单个数据库表生成,则可以利用 CommandBuilder 对象自动生成 DataAdapter 的 DeleteCommandInsertCommand 和UpdateCommand

为了自动生成命令,必须设置 SelectCommand 属性,这是最低的要求。SelectCommand 所检索的表架构确定自动生成的 INSERT、UPDATE 和 DELETE 语句的语法。

为了返回构造插入、更新和删除命令所必需的元数据,CommandBuilder 必须执行 SelectCommand。因此,必须额外经历一次到数据源的行程,这可能会降低性能。若要实现最佳性能,请显式指定命令而不是使用 CommandBuilder

SelectCommand 还必须返回至少一个主键或唯一列。如果不存在任何主键或唯一列,则将生成 InvalidOperation 异常,并且不会生成命令。

当与 DataAdapter 关联时,CommandBuilder 将自动生成 DataAdapter 的 InsertCommandUpdateCommand和 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

{

    //项目中的类

    class Program

    {

        //项目执行入口

        static void Main()

        {

            string connectionString = GetConnectionString();

            //定义数据库连接对象

            SqlConnection connection = new SqlConnection(connectionString);

            //定义SQL字符串

           String MySQL = "Select * From T_STUDENT;";

            //定义数据适配器对象

            SqlDataAdapter MyAdapter = new SqlDataAdapter(MySQL, connection);

            {

                try

                {

                    //打开数据库连接

                    connection.Open();

                    //定义数据集对象

                    DataSet MyDataSet = new DataSet();

                    //用表T_STUDENT的内容填充数据集对象

                    MyAdapter.Fill(MyDataSet, "T_STUDENT");

                    //定义数据行对象

                    DataRow MyRow =

                         MyDataSet.Tables["T_STUDENT"].Rows[0];

                    //读者可以在这里更改字段的取值,然后可以发现数据库中的数据会被更改

                    MyRow["T_S_NAME"] = "赵军";

                    //定义命令绑定对象

                    SqlCommandBuilder MyCb=new SqlCommandBuilder(MyAdapter);

                    //提交更新

                    MyAdapter.Update(MyDataSet, "T_STUDENT");

                    Console.WriteLine("成功更新表中的数据");

                }

                catch (SqlException ex)

                {

                     Console.WriteLine(ex.ToString());

                    Console.ReadLine();

                }

                finally

                {

                    connection.Close();

                    Console.ReadLine();

                    Console.WriteLine("成功关闭到SQL Server 2005数据库的连接");

                }

            }

        }

        //返回连接字符串的函数

        static private string GetConnectionString()

        {

            return " Integrated Security=Yes;

                        Initial Catalog=DB_student;

                        Server=Mynetserver";

        }

    }

}

光盘文件:\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

{

    //项目中的类

    class Program

    {

        //项目执行入口

        static void Main()

        {

            string connectionString = GetConnectionString();

            //定义数据库连接对象

            SqlConnection connection=new SqlConnection(connectionString);

            //定义SQL字符串

            String MySQL = "Select * From T_STUDENT;";

            //定义数据适配器对象

            SqlDataAdapter MyAdapter = new SqlDataAdapter(MySQL, connection);

            {

                try

                {

                    //打开数据库连接

                    connection.Open();

                    MyAdapter.SelectCommand = new SqlCommand(MySQL, connection);

                    //定义数据集对象

                    DataSet MyDataSet = new DataSet();

                    //填充数据集的数据

                    MyAdapter.Fill(MyDataSet, "T_STUDENT");

                    //定义数据表对象

                    DataTable MyTable =

                       MyDataSet.Tables["T_STUDENT"];

                    //定义一个全新的数据行对象

                    DataRow MyRow = MyTable.NewRow();

                    //定义数据行中各字段的值

                    MyRow["T_S_NAME"] = "陈超";

                    MyRow["T_S_SEX"] = "男";

                    MyRow["T_S_BIRTHDAY"] = "1985-09-11";

                    MyRow["T_S_ID"] = 2002080524;

                    MyRow["T_S_NATIONALITY"] = "汉";

                    MyRow["T_S_PHOTO"] = null;

                    //在内存中的表对象中添加一个新行,但此时新行的内容没有更新到数据源中

                    MyTable.Rows.Add(MyRow);

                    //定义命令绑定对象

                    SqlCommandBuilder MyCb=new SqlCommandBuilder (MyAdapter);

                    //调用数据适配器的Update方法,将新插入的数据更新到数据源中

                    MyAdapter.Update(MyDataSet, "T_STUDENT");

                    Console.WriteLine("成功更新数据库的数据!");

                }

                catch (SqlException ex)

                {

                    Console.WriteLine(ex.ToString());

                    Console.ReadLine();

                 }

                finally

                {

                    connection.Close();

                    Console.ReadLine();

                    Console.WriteLine("成功关闭到SQL Server 2005数据库的连接");

                }

            }

        }

        //返回连接字符串的函数

        static private string GetConnectionString()

        {

            return "Integrated Security=Yes;

                       Initial Catalog=DB_student;

                       Server=Mynetserver";

        }

    }

}

原创粉丝点击