/// <summary> /// This method is used by SetValue or by outside /// </summary> /// <param name="fieldName"></param> /// <param name="value"></param> /// <param name="clean"></param> internal void SetValueWithFlag(string fieldName, object value, bool clean) { if (!_metadata.ContainsField(fieldName)) { throw new ArgumentException("The field name does not exist", "fieldName"); } string lowerName = fieldName.ToLower(); Type destType = DataTypeConvert.ToSysType(_metadata[fieldName].DataType, _metadata[fieldName].Nullable); value = TypeConvert.ChangeType(value, destType); object oldValue = null; _fieldValues.TryGetValue(lowerName, out oldValue); bool changed = oldValue != value; if (changed) { if (clean) { _fieldValues[lowerName] = value; } else { _dirtyValues[lowerName] = value; ReportFieldChanged(fieldName, value); } } }
protected IEnumerable <string> GenerateUpdateScripts(IExtDataRecord dataRow, EntityMetadata rowMetaData, IEnumerable <string> dirtyFields) { List <string> scripts = new List <string>(); List <string> preDefDirtyFields = new List <string>(); List <string> extDirtyFields = new List <string>(); foreach (string dirtyField in dirtyFields) { if (!rowMetaData.ContainsField(dirtyField)) { continue; } if (!rowMetaData[dirtyField].IsExtension) { preDefDirtyFields.Add(dirtyField); } else { extDirtyFields.Add(dirtyField); } } //update predefined fields if (preDefDirtyFields.Count > 0) { StringBuilder sb = new StringBuilder(); sb.Append("UPDATE ").Append(rowMetaData.SourceName).Append(" SET "); for (int i = 0; i < preDefDirtyFields.Count; i++) { sb.Append(preDefDirtyFields[i]).Append(" = "). Append(SqlFormat.ToSqlValueString(dataRow.GetValue(preDefDirtyFields[i]))); if (i != preDefDirtyFields.Count - 1) { sb.Append(", "); } } sb.Append(" WHERE ").Append(GetConditionClause(dataRow, rowMetaData.KeyFieldNames)); scripts.Add(sb.ToString()); } //uppdate extension values if (extDirtyFields.Count > 0) { string recordIdStringValue = SqlFormat.ToSqlValueString(dataRow.GetValue(rowMetaData.Key)); string extensionTable = string.IsNullOrEmpty(rowMetaData.ExtensionTable) ? Consts.DefExtensionTable : rowMetaData.ExtensionTable; foreach (string extFieldName in extDirtyFields) { object value = dataRow.GetValue(extFieldName); value = TypeConvert.ChangeType <string>(value); StringBuilder sb = new StringBuilder(); sb.Append("DELETE FROM ").Append(extensionTable). Append(" WHERE RecordId=").Append(recordIdStringValue). Append(" AND FieldId=").Append(SqlFormat.ToSqlValueString(rowMetaData[extFieldName].Id)); scripts.Add(sb.ToString()); sb = new StringBuilder(); sb.Append("INSERT INTO ").Append(extensionTable). Append("(RecordId, FieldId, Value ) VALUES (").Append(recordIdStringValue). Append(",").Append(SqlFormat.ToSqlValueString(rowMetaData[extFieldName].Id)). Append(",").Append(SqlFormat.ToSqlValueString(value)).Append(")"); scripts.Add(sb.ToString()); } } //updates extension fields return(scripts); }