示例#1
0
        private void Execute(Action<FbReader> setParamsAction)
        {
            // добавляем таблицу в набор данных
            _writer.AppendTable(_mapper.DatasetName);
            
            using (var reader = new FbReader())
            {
                // формируем текст команды по параметрам отображения
                reader.Text = GetCommandText();

                // устанавливаем значения параметров
                if (setParamsAction != null)
                    setParamsAction(reader);

                // выполняем команду
                _eventLink.Post(ConstHelper.EventSource, 
                    String.Format(_executingQuery, _mapper.DisplayName));

                using (var dataReader = reader.ReadMany())
                {
                    var readerHelper = new FbReaderHelper(dataReader);
                    var recordCount = 0;

                    while (dataReader.Read())
                    {
                        // добавляем очередную запись
                        _writer.AppendRecord();
                        recordCount++;

                        for (var index = 0; index < dataReader.FieldCount; index++)
                        {
                            // добавляем очередное поле к записи
                            AppendField(dataReader, readerHelper, index);
                        }
                    }

                    _eventLink.Post(ConstHelper.EventSource,
                        String.Format(_queryComplete, _mapper.DisplayName, recordCount));
                }
            }
        }
示例#2
0
        private void AppendField(IDataReader reader, FbReaderHelper helper, Int32 index)
        {
            // ищем параметры отображения поля по имени поля в базе
            var mapper = _mapper.FieldMappers.FirstOrDefault(
                m => String.Compare(m.ShortDatabaseName, reader.GetName(index), true) == 0);

            if (mapper == null)
                return;

            // в зависимости от типа поля
            switch (mapper.FieldType)
            {
                case FieldType.Binary:
                    // для записи в выходной набор данных используется последний элемент
                    // в коллекции псевдонимов свойства (т. е. последнее значение всегда 
                    // является актуальным, а предыдущие - псевдонимы, оставленные для
                    // обратной совместимости)
                    _writer.AppendField(mapper.DatasetNames.Last(), helper.GetBytes(index));
                    break;
                case FieldType.Boolean:
                    _writer.AppendField(mapper.DatasetNames.Last(), helper.GetBoolean(index));
                    break;
                case FieldType.DateTime:
                    _writer.AppendField(mapper.DatasetNames.Last(), helper.GetDateTime(index));
                    break;
                case FieldType.Decimal:
                    _writer.AppendField(mapper.DatasetNames.Last(), helper.GetDecimal(index));
                    break;
                case FieldType.Int32:
                    _writer.AppendField(mapper.DatasetNames.Last(), helper.GetInt32(index));
                    break;
                default:
                    _writer.AppendField(mapper.DatasetNames.Last(), 
                        helper.GetString(index).TrimEnd((Char)0x20));
                    break;
            }
        }
示例#3
0
 private void WatchForPriceLists(Object data)
 {
     try
     {
         using (var fbReader = new FbReader())
         {
             fbReader.Text = _sqlGetActualPrices;
             fbReader.NewParameter(@"effective_date", DateTime.Now);
             using (var reader = fbReader.ReadMany())
             {
                 var readerHelper = new FbReaderHelper(reader);
                 while (reader.Read())
                 {
                     ProcessPrice(readerHelper.GetString(0));
                 }
             }
         }
     }
     catch (Exception ex)
     {
         _eventLink.Post(ConstHelper.EventSource, _priceProcessingId, ex);
     }
 }
示例#4
0
        private void ProcessPrice(String priceListId)
        {
            using (var fbExecutor = new FbExecutor())
            {
                fbExecutor.Executor = (connection, transaction) => 
                {
                    // создаем команду для обновления цен
                    using (var updateCommand = connection.CreateCommand())
                    {
                        updateCommand.Transaction = transaction;
                        updateCommand.CommandText = _sqlInsPrices;

                        // создаем параметры команды
                        updateCommand.AddParameter("@price_category");
                        updateCommand.AddParameter("@articul");
                        updateCommand.AddParameter("@series_id");
                        updateCommand.AddParameter("@price");
                        updateCommand.AddParameter("@update_mode", (Int32)Mode.Update);

                        updateCommand.Prepare();

                        // читаем содержимое прайс-листа
                        using (var fbReader = new FbReader())
                        {
                            fbReader.Text = _sqlGetPriceBody;
                            fbReader.NewParameter("@price_list_id", priceListId);

                            using (var reader = fbReader.ReadMany())
                            {
                                var readerHelper = new FbReaderHelper(reader);
                                var recordCount = 0;

                                while (reader.Read())
                                {
                                    // устанавливаем значения параметров команды
                                    updateCommand.SetParameter("@price_category", 
                                        readerHelper.GetString(1));
                                    updateCommand.SetParameter("@articul", 
                                        readerHelper.GetString(2));
                                    updateCommand.SetParameter("@series_id",
                                        reader.GetValue(3));
                                    updateCommand.SetParameter("@price",
                                        readerHelper.GetDecimal(4));

                                    // выполняем команду
                                    updateCommand.ExecuteNonQuery();
                                    recordCount++;
                                }

                                _eventLink.Post(ConstHelper.EventSource,
                                    String.Format(_priceProcessed, priceListId, recordCount));
                            }
                        }
                    }

                    // помечаем прайс, как обработанный
                    MarkPriceAsHandled(connection, transaction, priceListId);
                };
                fbExecutor.Execute();
            }
        }
示例#5
0
 private void WatchForDelayedUpdates(Object data)
 {
     try
     {
         using (var fbReader = new FbReader())
         {
             fbReader.Text = _sqlGetActualUpdates;
             fbReader.NewParameter("@apply_at", DateTime.Now);
             using (var reader = fbReader.ReadMany())
             {
                 var readerHelper = new FbReaderHelper(reader);
                 while (reader.Read())
                 {
                     EnqueueDelayedUpdate(readerHelper.GetInt64(0), (Mode)readerHelper.GetInt32(1));
                 }
             }
         }
     }
     catch (Exception ex)
     {
         _eventLink.Post(ConstHelper.EventSource, _delayedQueueId, ex);
     }
 }