Example #1
0
        /// <summary>
        /// 业务单据的保存数据方法
        /// </summary>
        public virtual SaveResult Update(DataSet data)
        {
            /***********************************************************************************
             *  数据更新注意事项:
             *
             *  1. 参数:data 是业务数据所有更新的数据表. DataSet第1张表为主表,
             *     第2,3,...n张表为明细表或其它相关数据。
             *
             *  2. 主表的主关键字可能是系统自动生成或用户输入,必须在保存前检查唯一性.
             *     当_UpdateSummaryKeyMode=UpdateKeyMode.None为用户自行输入单号.
             *
             *  3. 获取主表主键的值,调用UpdateDetailKey()方法更新所有明细表的外键值
             *     (更新外键:与主表建立关联的字段)
             *
             ************************************************************************************/

            SaveResult mResult = SaveResult.CreateDefault(); //预设保存结果

            string mGUID  = string.Empty;
            string mDocNo = string.Empty;

            //非用户手动事务模式,预设启用事务
            if (_UserManualControlTrans == false)
            {
                this.BeginTransaction();
            }

            if (_CurrentTrans == null)
            {
                throw new Exception("用户手动控制事务模式下,但您没有启用事务!");
            }

            try
            {
                //更新所有资料表
                foreach (DataTable dt in data.Tables)
                {
                    //仅处理有作修改的资料表
                    if (dt.GetChanges() == null)
                    {
                        continue;
                    }

                    //根据资料表名获取SQL命令生成器
                    IGenerateSqlCommand gen = this.CreateSqlGenerator(dt.TableName);
                    if (gen == null)
                    {
                        continue;              //当前数据层无法识别的SQL命令生成器,则不更新当前资料表
                    }
                    //本次更新是更新主表,取主表的主键用于设置明细表的外键
                    if (gen.IsSummary())
                    {
                        UpdateSummaryKey(_CurrentTrans, dt, _UpdateSummaryKeyMode, gen.GetPrimaryFieldName(),
                                         ref mGUID, gen.GetDocNoFieldName(), ref mDocNo);

                        mResult.GUID  = mGUID;
                        mResult.DocNo = mDocNo;
                    }
                    else
                    {
                        //更新明细表的外键
                        if (_UpdateSummaryKeyMode == UpdateKeyMode.OnlyDocumentNo) //单号
                        {
                            UpdateDetailKey(dt, gen.GetForeignFieldName(), mDocNo);
                        }
                        else if (_UpdateSummaryKeyMode == UpdateKeyMode.OnlyGuid) //GUID
                        {
                            UpdateDetailKey(dt, gen.GetForeignFieldName(), mGUID);
                        }
                        else if (_UpdateSummaryKeyMode == UpdateKeyMode.None)
                        {
                            UpdateDetailKey(dt, gen.GetForeignFieldName(), mDocNo);//不指定更新类型预设为用户输入单号
                        }
                    }

                    //使用基于ADO构架的SqlClient组件更新数据
                    SqlDataAdapter adp = new SqlDataAdapter();
                    adp.RowUpdating  += new SqlRowUpdatingEventHandler(OnAdapterRowUpdating);
                    adp.UpdateCommand = GetUpdateCommand(gen, _CurrentTrans);
                    adp.InsertCommand = GetInsertCommand(gen, _CurrentTrans);
                    adp.DeleteCommand = GetDeleteCommand(gen, _CurrentTrans);
                    adp.Update(dt);
                }

                if (_UserManualControlTrans == false)
                {
                    this.CommitTransaction();                                   //提交事务
                }
            }
            catch (Exception ex)
            {
                if (_UserManualControlTrans == false)
                {
                    this.RollbackTransaction(); //回滚事务
                }
                mResult.SetException(ex);       //保存结果设置异常消息

                throw new Exception("更新数据发生错误!Event:Update()\r\n\r\n" + ex.Message);
            }

            return(mResult); //返回保存结果
        }