sqldb + firebird 1.5 CS

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Ответить
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

Работаю под linux + firebird ClassicServer + fpc 2.0. Пытаюсь использовать sqldb. Написал приложение, которое импортирует лист Excel в таблицу БД. Ниже часть кода, которая непосредственно занимается импортом.

Код: Выделить всё

  // Задаем текст запроса
  Query.SQL.Add('INSERT INTO PRICE_ (');
  Query.SQL.Add('  GRP,');
  Query.SQL.Add('  CODE,');
  Query.SQL.Add('  NAME,');
  Query.SQL.Add('  WARRANTY,');
  Query.SQL.Add('  PRESENT,');
  Query.SQL.Add('  PRICE_UE,');
  Query.SQL.Add('  PRICE');
  Query.SQL.Add('  )');
  Query.SQL.Add('VALUES (');
  Query.SQL.Add('  :GRP,');
  Query.SQL.Add('  :CODE,');
  Query.SQL.Add('  :NAME,');
  Query.SQL.Add('  :WARRANTY,');
  Query.SQL.Add('  :PRESENT,');
  Query.SQL.Add('  :PRICE_UE,');
  Query.SQL.Add('  :PRICE');
  Query.SQL.Add('  )');

  // Бежим по всему прайсу
  for i := 19 to PL.Count-1 do
    begin
      // Если это запись прайса
      if (ValuesCount(PL.Strings[i],CSVSep) = 7) then
        begin
          S1 := '0';

          // Задаем параметры запроса
          Query.Params.ParamByName('GRP').AsString := S1;

          S2 := DeleteQuotes(GetNValue(PL.Strings[i],CSVSep,2));

          Query.Params.ParamByName('CODE').AsString := S2;

          S3 := DeleteQuotes(GetNValue(PL.Strings[i],CSVSep,3));

          Query.Params.ParamByName('NAME').AsString := S3;
          try

            S4 := DeleteQuotes(GetNValue(PL.Strings[i],CSVSep,4));

            Query.Params.ParamByName('WARRANTY').AsString := S4;
          except
            Query.Params.ParamByName('WARRANTY').AsString := '0';
          end;

          S5 := DeleteQuotes(GetNValue(PL.Strings[i],CSVSep,5));

          Query.Params.ParamByName('PRESENT').AsString := S5;

          S6 := DeleteQuotes(GetNValue(PL.Strings[i],CSVSep,6));

          Query.Params.ParamByName('PRICE_UE').AsString := S6;

          S7 := DeleteQuotes(GetNValue(PL.Strings[i],CSVSep,7));

          Query.Params.ParamByName('PRICE').AsString := S7;
          try
            // Старт транзакции
            Transaction.StartTransaction;
            // Выполняем запрос
            Query.ExecSQL;
            // Подтверждаем изменения
            Transaction.Commit;
          except
            on E: Exception do
             begin
               // Откат изменений
               Transaction.Rollback;
               // Выводим сообщение об ошибке
               writeln('Ошибка: ',E.Message);
               // Выводим значения добавляемого поля
               writeln('CSV-record: ',PL.Strings[i]);
               writeln('GRP = ',S1);
               writeln('CODE = ',S2);
               writeln('NAME = ',S3);
               writeln('WARRANTY = ',S4);
               writeln('PRESENT = ',S5);
               writeln('PRICE_UE = ',S6);
               writeln('PRICE = ',S7);
             end;
          end; // try
      end; // if
    end; // for


Первое что не понравилось, что ко всем параметрам нужно обращаться как к AsString (например, AsFloat вызывает Exception).

При тестировании на 1500 записях выдается 56 раз exception:

Execute:
-attempt to store duplicate value (visible to active transactions) in unique index "PK_PRICE_"


Проверял Excel'евский файл - нет там дубликатов! Никто не сталкивался с подобными проблемами?

PS: FreeIBComponents не годятся - необходимо стандартными средствами fpc 2.0, а он модули из Lazarus тянет за собой.
Аватара пользователя
Сергей Смирнов
энтузиаст
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва
Контактная информация:

Сообщение Сергей Смирнов »

PS: FreeIBComponents не годятся - необходимо стандартными средствами fpc 2.0, а он модули из Lazarus тянет за собой.
Вообще-то не должен тянуть... проверю как нибудь на досуге.
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

Сергей Смирнов писал(а):
PS: FreeIBComponents не годятся - необходимо стандартными средствами fpc 2.0, а он модули из Lazarus тянет за собой.
Вообще-то не должен тянуть... проверю как нибудь на досуге.

На вскидку сразу: Forms, Controls, Dialogs.
Аватара пользователя
Сергей Смирнов
энтузиаст
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва
Контактная информация:

Сообщение Сергей Смирнов »

На вскидку сразу: Forms, Controls, Dialogs.
Это, наверное, остатки от окна логина, которое в общем-то и не используется. Плюс отладочные ShowMessage. Виноват, проглядел.
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

А есть где чистые исходники fibl - времени чистить нет. А то уже начинаю софтину на C++ с использовнанием ibpp переписывать.
Аватара пользователя
Сергей Смирнов
энтузиаст
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва
Контактная информация:

Сообщение Сергей Смирнов »

А есть где чистые исходники fibl - времени чистить нет.
Эээ... в каком смысле чистые? FIBL - это мой порт FreeIBComponents под фрипаскаль. В самой исходной, т.е. в этом смысле "чистой", FreeIBComponents есть ссылки на модули визуальных компонент, которые я как раз и не подчистил. Прямо вот сию секунду сделать это не могу. Если очень надо, вечером попробую.
ushakov
новенький
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение ushakov »

Спасибо, но видимо таки перепишу на C++, будь он неладен.

В некоторых местах используются возможности Lazarus:
1) fibdatabase.pas - используется компонент TTimer
2) fibdatabase.pas - успользуются компоненты TApplication & TScreen

и т.п.

Просто приложение надо написать на вчера, и нет больше времени играться с sqldb/fibl
Аватара пользователя
Сергей Смирнов
энтузиаст
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва
Контактная информация:

Сообщение Сергей Смирнов »

Мда, не так всё просто оказалось... "в лоб" не решишь :(
Ответить