sqldb + firebird 1.5 CS

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

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

Сообщение ushakov » 03.10.2005 18:37:13

Работаю под 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 тянет за собой.
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение Сергей Смирнов » 03.10.2005 19:26:05

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

Сообщение ushakov » 04.10.2005 10:19:41

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

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

Сообщение Сергей Смирнов » 04.10.2005 12:21:40

На вскидку сразу: Forms, Controls, Dialogs.
Это, наверное, остатки от окна логина, которое в общем-то и не используется. Плюс отладочные ShowMessage. Виноват, проглядел.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение ushakov » 04.10.2005 13:56:21

А есть где чистые исходники fibl - времени чистить нет. А то уже начинаю софтину на C++ с использовнанием ibpp переписывать.
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение Сергей Смирнов » 04.10.2005 14:34:16

А есть где чистые исходники fibl - времени чистить нет.
Эээ... в каком смысле чистые? FIBL - это мой порт FreeIBComponents под фрипаскаль. В самой исходной, т.е. в этом смысле "чистой", FreeIBComponents есть ссылки на модули визуальных компонент, которые я как раз и не подчистил. Прямо вот сию секунду сделать это не могу. Если очень надо, вечером попробую.
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва

Сообщение ushakov » 04.10.2005 17:11:29

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

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

и т.п.

Просто приложение надо написать на вчера, и нет больше времени играться с sqldb/fibl
ushakov
новенький
 
Сообщения: 51
Зарегистрирован: 18.05.2005 11:15:48
Откуда: Украина, Киев

Сообщение Сергей Смирнов » 04.10.2005 21:48:37

Мда, не так всё просто оказалось... "в лоб" не решишь :(
Аватара пользователя
Сергей Смирнов
энтузиаст
 
Сообщения: 595
Зарегистрирован: 28.04.2005 13:23:25
Откуда: Москва


Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12

Рейтинг@Mail.ru