internal static DataItem GetDataItemFromSource(DataRow dr, DataSchema schema) { DataItem item = new DataItem(schema); for (int i = 0; i < schema.Fields.Length; i++) { if (!schema.Fields[i].Skip) { object v; string replaced = schema.Fields[i].GetAnyAttributeValue("replaced"); string defaultvalue = schema.Fields[i].GetAnyAttributeValue("default"); try { v = dr[schema.Fields[i].Source]; } catch (ArgumentException) { // 该列不存在 if (defaultvalue != null) { v = defaultvalue; } else { throw new Exception(string.Format("没有找到数据列'{0}'.", schema.Fields[i].Source)); } } // 如果存在被替换值和默认值,则将被替换值替换为默认值 if (!string.IsNullOrEmpty(v as string) && v != DBNull.Value && !string.IsNullOrEmpty(replaced) && replaced.IndexOf(v.ToString()) != -1 && defaultvalue != null) { v = defaultvalue; } DataItemField f = item.GetSourceField(schema.Fields[i].Source); f.Value = v; // 如果该项验证失败, 且为DataFixMode.Fix, 且有默认值, 则以默认值代替 if (!string.IsNullOrEmpty(schema.TransferMode) && schema.TransferMode.Equals("fix", StringComparison.InvariantCultureIgnoreCase) && defaultvalue != null) { ValidationResults vr = new ValidationResults(); f.DoValidate(vr); if (!vr.IsValid && f.Value as string != v) { f.Value = v; } } } } return(item); }
public virtual DataItem GetDataItem(string row, DataSchema dataSchema, bool isSource) { string[] items = GetLineColumns(row, dataSchema.GetAnyAttributeValue("delimiter")[0]); DataItem dataItem = new DataItem(dataSchema); for (int i = 0; i < dataSchema.Fields.Length; i++) { DataSchemaField schemaField = dataSchema.Fields[i]; DataItemField itemfield; if (isSource) { itemfield = dataItem.GetSourceField(schemaField.Source); } else { itemfield = dataItem.GetDestinationField(schemaField.Destination); } string replaced = schemaField.GetAnyAttributeValue("replaced"); string defaultvalue = schemaField.GetAnyAttributeValue("default"); if (schemaField.Index >= items.Length) { // bad row if (defaultvalue == null) { switch (dataSchema.TransferMode) { case DataFixMode.Skip: StringBuilder sb = new StringBuilder(); sb.AppendLine("skipped transfering data row:"); Array.ForEach(items, delegate(string item) { sb.AppendFormat("{0}\t", item); }); // TODO: //LogEntry log = new LogEntry(); //log.Message = sb.ToString(); //log.Categories.Add(LogCategory.Trace); //log.Priority = LogPriority.Normal; Logger.Instance.Info(this, sb.ToString()); return(null); case DataFixMode.Fix: itemfield.Value = string.Empty; break; case DataFixMode.RaiseError: throw new ArgumentException( string.Format("row has [{0}] columns while schema require [{1}] fields.{2}row:[{3}]", items.Length, dataSchema.Fields.Length, Environment.NewLine, row)); default: throw new ArgumentOutOfRangeException( string.Format("Invalid transfer mode [{0}] in schema, requires one of 'skip,fix,raiseerror'", dataSchema.TransferMode)); } } else { itemfield.Value = defaultvalue; } } else { itemfield.Value = items[schemaField.Index].Trim(); } // for the value start with 0, in excel which will be escaped with ' starting. if (itemfield.Value != null && itemfield.Value.ToString().StartsWith("'0")) { itemfield.Value = itemfield.Value.ToString().TrimStart('\''); } // 如果存在被替换值和默认值,则将被替换值替换为默认值 if (!string.IsNullOrEmpty(itemfield.Value as string) && !string.IsNullOrEmpty(replaced) && replaced.IndexOf(itemfield.Value.ToString()) != -1 && defaultvalue != null) { itemfield.Value = defaultvalue; } // 如果该项验证失败, 且为DataFixMode.Fix, 且有默认值, 则以默认值代替 if (!string.IsNullOrEmpty(dataSchema.TransferMode) && dataSchema.TransferMode.Equals("fix", StringComparison.InvariantCultureIgnoreCase) && defaultvalue != null) { ValidationResults vr = new ValidationResults(); itemfield.DoValidate(vr); if (!vr.IsValid && itemfield.Value as string != defaultvalue) { itemfield.Value = defaultvalue; } } try { Utilities.AdjustDataItemFieldValue(itemfield); } catch (Exception ex) { Logger.Instance.Error(this, ex); return(null); } } return(dataItem); }