/// <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); //返回保存结果 }