SqlCommandBuilder 的使用

来源:互联网 发布:pcb电路板设计软件 编辑:程序博客网 时间:2024/05/22 15:12

【转载于新浪博客】blog.sina.com.cn/s/blog_5252e0900100aobl.html

  用SqlCommandBuilder 实现批量更新

  1.功能:

   可以实现你对DataSet在UI层做任意操作后,直接丢给这个方法,这个方法就可以自动把你的修改更新到数据库中

  2.使用方法
  public int UpdateByDataSet(DataSet ds,string strTblName,string strConnection)
  {
   try
  {
   SqlConnection  conn = new SqlConnection(strConnection));
   SqlDataAdapter myAdapter = new SqlDataAdapter();
   SqlCommand myCommand = new SqlCommand("select * from "+strTblName),(SqlConnection)this.conn);   
   myAdapter.SelectCommand = myCommand;
   SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);    
   myAdapter.Update(ds,strTblName); 
   return 0;
}
catch(BusinessException errBU)

   throw errBU;
 
catch(Exception err)

   throw new BusinessException(err);
}
}

*******************************************

再比如如下的方法:

 Conn = new SqlConnection(strConn);
        string strSql = "SELECT * FROM Categories";
        myDataAdapter = new SqlDataAdapter(strSql, Conn);
        //创建CommandBuilder对象,该对象可以自动创建用于插入、删除及更新的SQL语句
        SqlCommandBuilder myCB = new SqlCommandBuilder(myDataAdapter);

************************************************************************************************

直接调用这个方法就可以啦,说明的一点是select * from "+strTblName是一定要的,
作用大家也应该想到了,主要是告诉 SqlDataAdapter更新哪个表

3.什么时候用?

    a. 有时候需要缓存的时候,比如说在一个商品选择界面,选择好商品,并且进行编辑/删除/更新后,

       最后一并交给数据库,而不是每一步操作都访问数据库,因为客户选择商品可能进行n次编辑/删除

       更新操作,如果每次都提交,不但容易引起数据库冲突,引发错误,而且当数据量很大时在用户执行

       效率上也变得有些慢

    b.有的界面是这样的有的界面是这样的,需求要求一定用缓存实现,确认之前的操作不提交到库,点击

      页面专门提交的按钮时才提交商品选择信息和商品的其它信息. 我经常遇到这样的情况

    c.有些情况下只往数据库里更新,不读取. 也就是说没有从数据库里读,SqlDataAdapter也就不知道是
      更新哪张表了,调用Update就很可能出错了。这样的情况下可以用SqlCommandBuilder 了.

4.
注意点:
  1.只能更新一个表,不能更新两个或两个以上相关联的表
  2.表中必须有主键
  3.更新的表中字段不能有image类型

5.优点:

    节省代码量,节省时间,这个方法可以代替所有的:  更新/删除/插入操作语句

6.缺点:
        访问两次数据库(select * TableName,就是这句,要确认是哪个表,除非是很大的数据量,一般是感觉不到的,效率有些慢

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

【转载于网易博客】anbangs.blog.163.com/blog/static/32182782008817114528353/

以前都是采用Sql代码用SqlCommand一条一条语句的传入数据库。

但是今天发现有更好的方法。

代码如下:

SqlConnection cn=new SqlConnection(ConStr);

   DataSet DS=new DataSet();

   SqlDataAdapter Sda=new SqlDataAdapter("Select * from Table1",cn);

   try

   {

    Sda.Fill(DS,"Table1");

    MessageBox.Show(DS.Tables[0].Rows.Count.ToString());

   }

   catch(Exception er)

   {

    MessageBox.Show(er.Message);

   }

   //DataSet DS2=DS.Clone();

   //Sda.SelectCommand=new SqlCommand("Select * from Table1");

   DataRow dr=DS.Tables[0].NewRow();

   dr["F1"]=5;

   dr["F2"]=5;

   dr["F3"]=5;

   DS.Tables[0].Rows.Add(dr);

   dr=DS.Tables[0].NewRow();

   dr["F1"]=6;

   dr["F2"]=6;

   dr["F3"]=6;

   DS.Tables[0].Rows.Add(dr);

   SqlCommandBuilder SCB=new SqlCommandBuilder(Sda);

   try

   {

    Sda.Update(DS,"Table1");

   }

   catch(Exception er)

   {

    MessageBox.Show(er.Message);

   }

    Sda.Dispose();

   cn.Close();

数据库用的是SQL2000,先在数据库中建立Table1的临时表,建立字段MainID,F1,F2,F3

初始数据如下

MainID     F1    F2    F3

1                1        1    1

2                2        2    2

3                3        3    3

4                4        4    4

注意到,我先把数据从数据库中读出来,赋值到DS中

结果显然为4行

然后我在该数据集DS中添加2个同构行

这是注意了,我没有做任何的Insert相关语句

打算直接采用SqlDataAdapter.Update(DataSet,TableScr)方法

但是注意,直接用是不行的,会提示缺少Insert命令的关联

这是可以用了如高亮标记的语句

SqlCommandBuilder SCB=new SqlCommandBuilder(Sda);

这是所有关联就都建立好了,全自动。奇妙,诡异阿

这样就方便多了。

 =============================================================

使用SqlCommandBuilder与SqlDataAdapter结合使用,可以方便地去数据库进行更新。只要指定Select 语句就可以自动生成Insert,update,delete语句

但要注意一点。【Select 语句中返回的列要包括主键列,否则将无法产生Update,和Delete语句】相应的操作将无法执行

【实例1】

public static DataSet SelectSqlSrvRows(string myConnection, string mySelectQuery, string myTableName)

{

   SqlConnection myConn = new SqlConnection(myConnection);

   SqlDataAdapter myDataAdapter = new SqlDataAdapter();

   myDataAdapter.SelectCommand = new SqlCommand(mySelectQuery, myConn);

   SqlCommandBuilder cb = new SqlCommandBuilder(myDataAdapter); 【1】

   myConn.Open();

   DataSet ds = new DataSet();

   myDataAdapter.Fill(ds, myTableName);

   //code to modify data in DataSet here

   //Without the SqlCommandBuilder this line would fail

   myDataAdapter.Update(ds, myTableName);                                                【2】

   myConn.Close();

   return ds;

}

【实例2】

public partial class DataSet_Delete : System.Web.UI.Page
{
    private string strConn = "data source=localhost;initial catalog=Northwind;user id=sa;password=sa";
    SqlConnection Conn;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //调用LoadGridView方法以填充和显示数据
            LoadGridView();
        }
    }
    private void ConnectionDB()
    {
        if (Conn == null)
        {
            //如果SqlConnection对象不存在新建该对象
            Conn = new SqlConnection(strConn);
        }
        if (Conn.State == ConnectionState.Closed)
        {
            //如果Connection对象的State状态为关闭Closed就将其打开
            Conn.Open();
        }
    }
    //创建CloseConnection方法,实现关闭数据库的操作
    private void CloseConnection()
    {
        Conn.Close();
    }
    //创建LoadGridView方法,实现填充GridView控件以显示数据
    private void LoadGridView()
    {
        string SelectSql = "SELECT * FROM Categories";
        ConnectionDB();
        SqlDataAdapter myDataAdapter = new SqlDataAdapter(SelectSql, Conn);
        DataSet myDataSet = new DataSet();
        myDataAdapter.Fill(myDataSet, "Categories");
        CloseConnection();
        GVCategory.DataSource = myDataSet.Tables["Categories"];
        GVCategory.DataBind();
    }

    protected void RowDelete(object sender, GridViewDeleteEventArgs e)
    {
        int CategroyID = Convert.ToInt32(GVCategory.Rows[e.RowIndex].Cells[0].Text);
        GVCategory.EditIndex = -1;
        ConnectionDB();
        string SelectSql = "SELECT * FROM Categories";
        SqlDataAdapter myDA = new SqlDataAdapter(SelectSql, Conn);
        DataSet DS = new DataSet();
        myDA.Fill(DS, "Categories");
        CloseConnection();
        //创建本地数据表table
        DataTable table = DS.Tables["Categories"];
        //设置table的PrimaryKey属性,其主键码设置为CategoryID列
        table.PrimaryKey = new DataColumn[] { table.Columns["CategoryID"] };
        //使用Find方法查找当前进行删除的数据行
        DataRow delRow = table.Rows.Find(CategroyID);
        //使用Delete方法删除数据行
        delRow.Delete();
        //创建SqlCommandBuilder对象myCB,它将自动创建DELETE语句
        SqlCommandBuilder myCB = new SqlCommandBuilder(myDA);
        ConnectionDB();
        //使用DataAdapter对象的Update方法将删除数据行后的table表推入到数据库中
        myDA.Update(table);
        CloseConnection();
        //重新载入数据,显示删除数据后的数据表内容
        LoadGridView();
    }
}