SqlCommandBuilder在用SqlDataReader更新数据源时的作用

来源:互联网 发布:touchwin编程软件下载 编辑:程序博客网 时间:2024/05/23 14:57

用于将对DataSet所做的更改与关联的 SQL Server数据库的更改相协调。

SqlDataAdapter不会自动生成实现 DataSet的更改与关联的 SQL Server实例之间的协调所需的 Transact-SQL语句。但是,如果设置了 SqlDataAdapterSelectCommand属性,则可以创建一个 SqlCommandBuilder对象来自动生成用于单表更新的 Transact-SQL语句。然后,SqlCommandBuilder将生成其他任何未设置的 Transact-SQL语句。

关于如何向数据库传数据,以前我的数据都是采用Sql代码用SqlCommand一条一条语句的传入数据库。但是现在将SqlCommandBuilderSqlDataAdapter结合使用,可以方便地去数据库进行更新。只要指定Select语句就可以自动生成Insertupdate,delete语句,但要注意一点。Select语句中返回的列要包括主键列,否则将无法产生Update,Delete语句

 

构造函数public SqlCommandBuilder (SqlDataAdapter adapter)

使用关联的 SqlDataAdapter对象初始化SqlCommandBuilder类的新实例。

示例:SqlCommandBuilderSqlDataAdapter结合使用,对数据库进行更新

    查询tb_command表中的所有数据并显示在DataGridView中,单击某条数据会显示其详细信息。当对某条数据修改后,单击修改按钮,将调用SqlDataReader对象的update方法更新数据源。

namespace UpdateDataSet

{

   public partial class Form1 : Form

   {

       public Form1()

       {

           InitializeComponent();

       }

       SqlConnection conn;                                        //声明一个SqlConnection变量

       DataSet ds;                                                     //声明一个DataSet变量

       SqlDataAdapter sda;                                        //声明一个SqlDataAdapter变量

       private void Form1_Load(object sender, EventArgs e)

       {

           //实例化SqlConnection变量conn,连接数据库

           conn = new SqlConnection("server=.;database=db_14;uid=sa;pwd=911013");

           //创建一个SqlCommand对象

           SqlCommand cmd = new SqlCommand("select * from tb_command", conn);

           sda = new SqlDataAdapter();                      //实例化SqlDataAdapter对象

           sda.SelectCommand = cmd;                      //设置SqlDataAdapter对象的SelectCommand属性为cmd

           ds = new DataSet();                                        //实例化DataSet

           sda.Fill(ds, "tb_command");                       //使用SqlDataAdapter对象的Fill方法填充DataSet

           dataGridView1.DataSource = ds.Tables[0];//设置dataGridView1控件的数据源

       }

       private void button1_Click(object sender, EventArgs e)

       {

           DataTable dt = ds.Tables["tb_command"];      //创建一个DataTable

           sda.FillSchema(dt, SchemaType.Mapped);       //把表结构加载到tb_command表中一定不能少。 SqlDataAdapter填充 DataSet时,它为返回的数据创建必需的表和列(如果这些表和列尚不存在)。但是,除非MissingSchemaAction属性设置为 AddWithKey,否则这个隐式创建的架构中不包括主键信息。也可以使用FillSchema,让 SqlDataAdapter创建 DataSet的架构,并在用数据填充它之前就将主键信息包括进去。将SqlCommandBuilderSqlDataAdapter结合使用,可以方便地去数据库进行更新。只要指定Select语句就可以自动生成Insertupdate,delete语句,但要注意一点。Select语句中返回的列要包括主键列,否则将无法产生Update,Delete语句

 

 

           DataRow dr = dt.Rows.Find(txtNo.Text);  //创建一个DataRow

           //设置DataRow中的值

           dr["姓名"] = txtName.Text.Trim();

           dr["性别"] = this.txtSex.Text.Trim();

           dr["年龄"] = this.txtAge.Text.Trim();

           dr["奖金"] = this.txtJJ.Text.Trim();

           //实例化一个SqlCommandBuilder

           SqlCommandBuilder cmdbuider = new SqlCommandBuilder(sda);

           //调用其Update方法将DataTable更新到数据库中

           sda.Update(dt);

           

       }

       private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)

       {

           //dataGridView1控件的CellClick事件中实现单击某条数据显示详细信息

           txtNo.Text = dataGridView1.SelectedCells[0].Value.ToString();

           txtNo.ReadOnly = true;

           txtName.Text = dataGridView1.SelectedCells[1].Value.ToString();

           txtSex.Text = dataGridView1.SelectedCells[2].Value.ToString();

           txtAge.Text = dataGridView1.SelectedCells[3].Value.ToString();

           txtJJ.Text = dataGridView1.SelectedCells[4].Value.ToString();

       }

 

      

   }

}

原创粉丝点击