protected virtual void ReadRecordField(DictionaryState state, TableDescriber table, FieldDefinition fieldDefinition, string[] fields) { if (fieldDefinition.StartPosition >= fields.Length) { if (fieldDefinition.IsOptional) return; throw new MessagingException("Message does not match definition. Too few fields in current record."); } if (fields[fieldDefinition.StartPosition].StartsWith("\"") && fields[fieldDefinition.StartPosition].EndsWith("\"")) // Remove quotes { fields[fieldDefinition.StartPosition] = fields[fieldDefinition.StartPosition].Substring(1, fields[fieldDefinition.StartPosition].Length - 2); } var describer = new ColumnDescriber(fieldDefinition.Name, table); if (fieldDefinition.Type.IsIn(FieldDefinitionType.DateTime)) { state[describer] = DateTime.ParseExact(fields[fieldDefinition.StartPosition].Trim('"'), fieldDefinition.Format, CultureInfo.InvariantCulture); } else if (fieldDefinition.Type.IsIn(FieldDefinitionType.Amount, FieldDefinitionType.InvertedAmount, FieldDefinitionType.Decimal)) { object oldvalue; decimal oldAmount = state.TryGetValue(describer, out oldvalue) && oldvalue is decimal ? (decimal) oldvalue : 0; decimal amount = !string.IsNullOrWhiteSpace(fields[fieldDefinition.StartPosition].Trim('"')) ? Decimal.Parse(fields[fieldDefinition.StartPosition].Trim('"'), fieldDefinition.Format.IsNullOrEmpty() ? CultureInfo.InvariantCulture : new CultureInfo(fieldDefinition.Format)) : 0; if (fieldDefinition.Type == FieldDefinitionType.InvertedAmount) amount *= -1; state[describer] = oldAmount + amount; } else if (fieldDefinition.Type == FieldDefinitionType.AmountSign) { if (IsNegativeAmountSign(fields[fieldDefinition.StartPosition], fieldDefinition)) { state[describer] = Decimal.Negate(((decimal)state[describer])); } } else { object oldvalue; state[describer] = state.TryGetValue(describer, out oldvalue) ? oldvalue + " " + fields[fieldDefinition.StartPosition] : fields[fieldDefinition.StartPosition]; } }
private IInternalState CreateState(IAdfQuery query, SqlDataReader reader = null) { var state = new DictionaryState { IsNew = true }; if (reader != null) { var schema = reader.GetSchemaTable(); if (schema == null) throw new InvalidOperationException("could not load schema"); var table = new TableDescriber(query.Tables[0].Name, DataSource); for (int i = 0; i < reader.VisibleFieldCount; i++) { var column = new ColumnDescriber(reader.GetName(i), table, isIdentity: (bool) schema.Rows[i]["IsKey"], isAutoIncrement: (bool) schema.Rows[i]["IsAutoIncrement"], isTimestamp: (bool) schema.Rows[i]["IsRowVersion"]); if (reader.HasRows) { var value = reader[i]; if (value == DBNull.Value) value = null; state[column] = value; state.IsNew = false; } else { state[column] = null; // just add column info } } } // if (reader != null && reader.HasRows && state.Timestamp == null) throw new InvalidOperationException("Row has no Timestamp field"); return state; }
private static string GetValueForField(FieldDefinition fieldDefinition, IInternalState state) { string format = fieldDefinition.Format; var columnDescriber = new ColumnDescriber(fieldDefinition.Name, fieldDefinition.Table); if(fieldDefinition.Type.IsIn(FieldDefinitionType.DateTime)) { var dateTime = state.Get<DateTime?>(columnDescriber); if (!dateTime.HasValue) return fieldDefinition.Default; // DateTime needs a format specifier return !format.IsNullOrEmpty() ? dateTime.Value.ToString(format, CultureInfo.InvariantCulture) : dateTime.Value.ToShortDateString(); } if(fieldDefinition.Type.IsIn(FieldDefinitionType.Amount, FieldDefinitionType.InvertedAmount, FieldDefinitionType.Decimal)) { var money = state.Get<Money>(columnDescriber); if (money.IsEmpty) return fieldDefinition.Default; if (fieldDefinition.Type == FieldDefinitionType.InvertedAmount) money *= -1; return ToString(money, format); } if(fieldDefinition.Type.IsIn(FieldDefinitionType.Int16, FieldDefinitionType.Int32, FieldDefinitionType.Int64)) { var value = state.Get<long?>(columnDescriber); return !value.HasValue ? fieldDefinition.Default : ToString(value, format); } return !state.Get<string>(columnDescriber).IsNullOrEmpty() ? state.Get<string>(columnDescriber) : fieldDefinition.Default; }
private Dictionary<string, ColumnDescriber> GetSchema(IAdfQuery query, SqlDataReader reader = null) { Dictionary<string, ColumnDescriber> describers; var table = query.Tables[0]; if (query.Selects.Count == 0 && query.Tables.Count == 1 && query.QueryType != QueryType.StoredProcedure) { Dictionary<ITable, Dictionary<string, ColumnDescriber>> datasource; if (_cachedDescribers.TryGetValue(table.DataSource, out datasource)) { if (datasource.TryGetValue(table, out describers)) { return describers; } } else { lock(_lock) _cachedDescribers.Add(table.DataSource, new Dictionary<ITable, Dictionary<string, ColumnDescriber>>()); } } if (reader == null) return null; describers = new Dictionary<string, ColumnDescriber>(); var schema = reader.GetSchemaTable(); if (schema == null) return describers; //throw new InvalidOperationException("could not load schema"); for (int i = 0; i < reader.VisibleFieldCount; i++) { var columnName = reader.GetName(i); var column = new ColumnDescriber(columnName, table, isIdentity: (bool) schema.Rows[i]["IsKey"], isAutoIncrement: (bool) schema.Rows[i]["IsAutoIncrement"], isTimestamp: (bool) schema.Rows[i]["IsRowVersion"]); describers.Add(columnName, column); } if (query.Selects.Count == 0 && query.Tables.Count == 1) { lock (_lock) _cachedDescribers[table.DataSource][table] = describers; } return describers; }