SqlDataAdapter 的用法------不能进行更新

本文深入解析了使用DataAdapter更新数据源的方法,包括更新过程中的行状态检查、语句生成及执行顺序,以及如何处理数据更新前后事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是Msdn给出的解释

更新是逐行进行的。对于每个已插入、修改和删除的行,Update 方法会确定已对其执行的更改的类型(插入、更新或删除)。根据更改类型,通过执行InsertUpdate,Delete 命令模板将已修改的行传播给数据源。当应用程序调用Update 方法时,DataAdapter 根据DataSet 中配置的索引顺序为每一行检查RowState 属性,并迭代执行所需的 INSERT、UPDATE 或 DELETE 语句。例如,由于DataTable 中行的排序,Update 可能先执行一个 DELETE 语句,接着执行一个 INSERT 语句,然后再执行另一个 DELETE 语句。

应注意,这些语句不是作为批处理进程执行的;每一行都是单独更新的。在必须控制语句类型顺序的情况下(例如,INSERT 在 UPDATE 之前),应用程序可以调用GetChanges 方法。有关更多信息,请参见使用 DataAdapter 更新数据源

如果未指定 INSERT、UPDATE 或 DELETE 语句,Update 方法会生成异常。但是,如果设置 .NET Framework 数据提供程序的SelectCommand 属性,则可以创建SqlCommandBuilder OleDbCommandBuilder 对象来为单个表更新自动生成 SQL 语句。然后,CommandBuilder 将生成其他任何未设置的 SQL 语句。此生成逻辑要求DataSet 中存在键列信息。有关更多信息,请参见自动生成命令

Update 方法在执行更新之前从第一个映射列出的表中检索行。然后,Update 使用 UpdatedRowSource 属性的值刷新该行。忽略返回的任何其他行。

在将任何数据加载回 DataSet 之后,将引发 OnRowUpdated 事件,从而允许用户检查经协调的 DataSet 行以及该命令返回的任何输出参数。在对一行成功进行更新之后,将接受对该行的更改。

当使用 Update 时,执行的顺序如下:

  1. DataRow 中的值移至参数值。

  2. 引发 OnRowUpdating 事件。

  3. 执行命令。

  4. 如果该命令设置为 FirstReturnedRecord,返回的第一项结果将放置在 DataRow 中。

  5. 如果存在输出参数,它们将被放在 DataRow 中。

  6. 引发 OnRowUpdated 事件。

  7. 调用 AcceptChanges

DataAdapter 关联的每个命令通常都有一个与其关联的参数集合。参数通过 .NET 数据提供程序的 Parameter 类的 SourceColumnSourceVersion 属性映射到当前行。SourceColumn 引用DataTable 列,DataAdapter 引用该列来获取当前行的参数值。

 

下面给出例子

        /// <summary>
        /// 保存数据
        /// </summary>
        private bool Save()
        {
            DataLib.DataHelper myHelper = new DataLib.DataHelper();
            DataLib.sysClass myClass = new DataLib.sysClass();
            DataSet dsSave = ((DataTable)binMaster.DataSource).DataSet;
            //极其重要否则不能进行修改
            binMaster.EndEdit();

            if (myHelper.SaveData(dsSave, "select * from t_SellStorage where F_BillID = '" + strBillID + "'")==0)
            {
                dsSave.AcceptChanges();
                return true;

            }
            else
            {
                return false;
            }

        }

    public string SaveData(string strDB,DataSet ds, string strSQL)
    { 
        try
        {
            SqlConnection con = new SqlConnection(GetConStr(strDB));
           
            SqlDataAdapter myAdt = new SqlDataAdapter(strSQL, con);
            SqlCommandBuilder bd = new SqlCommandBuilder(myAdt);
           
            myAdt.Update(ds);
            con.Dispose();
            myAdt.Dispose();
            bd.Dispose();
            return "";
        }
        catch (SqlException ex)
        {
            if (ex.Number == 2627)
                return "数据重复,请检查!!";
            else
                return ex.Message;
        }
    }

其中如果            binMaster.EndEdit();这句不写的话是不能对数据库表进行更新的。

在同页面如果进行插入操作的话要把AcceptChanges();去掉否则会插入重复主键的值。

            if (myHelper.SaveMuteData(dsData, strSQL).Length == 0)
            {
                DataLib.SysVar.SetLog(this.Text, "保存", "保存" + editControl1.GetValue().ToString());
                MessageBox.Show("数据保存成功!!", "提示");
                //DataBind();
                //strBillID = editControl1.GetValue().ToString();
                //decID = decID + 1;
                //dsMaster.AcceptChanges();
                //dsSlaver.AcceptChanges();
                btNewStart();
                Status(2);
                return true;
            }
            else
            {
                return false;
            }

    public string SaveMuteData(string strDB,DataSet[] ds, string[] strSQL)
    {
        //string strCon = System.Configuration.ConfigurationManager.AppSettings["ConStr"];
        SqlConnection con = new SqlConnection(GetConStr(strDB));
        int intCnt, i;
        intCnt = ds.Length;
        con.Open();
        SqlTransaction tran = con.BeginTransaction();
        try
        {
            try
            {
                for (i = 0; i < intCnt; i++)
                {
                    SqlCommand myComm = new SqlCommand();
                    myComm.Connection = con;
                    myComm.Transaction = tran;
                    myComm.CommandText = strSQL[i];

                    myComm.CommandTimeout = 0;

                    SqlDataAdapter myAdt = new SqlDataAdapter();
                    myAdt.SelectCommand = myComm;

                    SqlCommandBuilder bd = new SqlCommandBuilder(myAdt);
                    myAdt.Update(ds[i]);
                }
                tran.Commit();
                return "";
            }
            catch (Exception ex)
            {
                tran.Rollback();
                return ex.Message;
            }
        }
        finally
        {
            tran.Dispose();
        }

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值