private bool UpdateDetail() { if (_sInsertDetail == string.Empty) { GenSqlString(); } bool success = false; foreach (DataRow drDetail in _lstDrCurrentDetails) { List <SqlField> tmp = new List <SqlField>(); List <string> paraNames = new List <string>(); List <object> paraValues = new List <object>(); List <SqlDbType> paraTypes = new List <SqlDbType>(); string sql = string.Empty; bool isDeleteDt = false, isDelete = false, updateIdentity = false; success = false; switch (drDetail.RowState) { case DataRowState.Added: if (_identityPkDt) { updateIdentity = true; } if (_identityPk) { string pk = _drTableMaster["Pk"].ToString(); if (drDetail.Table.Columns.Contains(pk)) { drDetail[pk] = _drCurrentMaster[pk]; } } tmp = _vInsertDetail; sql = _sInsertDetail; break; case DataRowState.Modified: tmp = _vUpdateDetail; sql = _sUpdateDetail; break; case DataRowState.Deleted: tmp = _vDeleteDetail; sql = _sDeleteDetail; if (_drCurrentMaster.RowState == DataRowState.Deleted) { isDelete = true; _drCurrentMaster.RejectChanges(); } drDetail.RejectChanges(); isDeleteDt = true; break; } if (sql != string.Empty) { foreach (SqlField sqlField in tmp) { string fieldName = sqlField.FieldName; paraNames.Add(fieldName); if (drDetail[fieldName].ToString() != string.Empty) { paraValues.Add(drDetail[fieldName]); } else { paraValues.Add(DBNull.Value); } paraTypes.Add(sqlField.DbType); } if (isDelete) { _drCurrentMaster.Delete(); } if (isDeleteDt) { drDetail.Delete(); } success = DbData.UpdateData(sql, paraNames.ToArray(), paraValues.ToArray(), paraTypes.ToArray()); if (success && updateIdentity) { string pk = _drTable["Pk"].ToString(); object o = DbData.GetValue("select @@identity"); if (o != null) { drDetail[pk] = o; } } if (!success) { break; } } else { success = true; } } return(success); }