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