コード例 #1
0
ファイル: CsvMessageHandler.cs プロジェクト: NLADP/ADF
        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];
            }
        }
コード例 #2
0
        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;
        }
コード例 #3
0
ファイル: CsvMessageHandler.cs プロジェクト: NLADP/ADF
        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;
        }
コード例 #4
0
ファイル: DictionaryQueryHandler.cs プロジェクト: NLADP/ADF
        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;
        }