- Код: Выделить всё
- // Задаем текст запроса
 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 тянет за собой.




