я использую что-то вроде этого, чтобы определить команду SQL вставки:Почему конкатенация строковых функций ставит результаты в неправильном порядке?
sql := 'insert into table(a, b, c) values (' + formatfunction(a) + ', ' +
formatfunction(b) + ', ' +
formatfunction(c) + ');';
после присваивания, переменная SQL содержит форматированные значения а, б, в в другом порядке, в результате чего-то например:
insert into (a, b, c) values ('value in c', 'value in a', 'value in b');
может возникнуть проблема с оптимизацией компилятора?
Сожалеем о плохой пример кода, полный исполняемый код ниже:
procedure Execute(var v : String);
function ExtractValue(var Content: String; Separator: Char = '|'): String;
var
vpHead,
vpTail,
vpContent: PChar;
vsValor: String;
begin
vpContent := PChar(Content);
Result := '';
if (vpContent = nil) or
(vpContent^=#0) then
Exit;
vpTail := vpContent;
vpHead := vpTail;
while not (CharInSet(vpTail^, [Separator]) or (vpTail^=#0)) do
vpTail := StrNextChar(vpTail);
if (vpHead^ <> #0) then
begin
if (vpHead <> vpTail) then
begin
SetString(vsValor, vpHead, vpTail - vpHead);
Result := vsValor;
end
else
Result := '';
end;
Content := Copy(Content, Length(vsValor) + 2, (Length(Content) - Length(vsValor)) + 1);
end;
function FormatAsDate(const s: String): TDate;
begin
Result := 0;
if Trim(s) <> '' then
Result := StrToDateDef(Copy(s, 1, 2) + '/' + Copy(s, 3, 2) + '/' + Copy(s, 5, 4), 0);
end;
function AsCurrency(const s: string): Double;
begin
Result := StrToFloatDef(s, 0);
end;
function AsDate(const s: string): string;
var
d: TDate;
begin
d := FormatAsDate(s);
if d = 0 then
Result := QuotedStr('null')
else
Result := QuotedStr(FormatDateTime('yyyy/mm/dd', d));
end;
function AsText(const s: string): string;
begin
Result := QuotedStr(s);
end;
begin
v :=
'INSERT INTO TABLE (A, B, C, D, E, F, G, H, I, J, K, L, M) VALUES (' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsText(ExtractValue(v)) + ', ' +
AsDate(ExtractValue(v)) + ', ' +
AsDate(ExtractValue(v)) + ', ' +
StringReplace(FloatToStr(AsCurrency(ExtractValue(v))), ',', '.', []) + ', ' +
StringReplace(FloatToStr(AsCurrency(ExtractValue(v))), ',', '.', []) + ', ' +
AsText(ExtractValue(v)) + ', ' +
StringReplace(FloatToStr(AsCurrency(ExtractValue(v))), ',', '.', []) + ', ' +
StringReplace(FloatToStr(AsCurrency(ExtractValue(v))), ',', '.', []) + ');';
end;
, используя строку ввода «04368898000106 | 06 | 00 ||| 3413572 | 26102011 | 31102011 | 1656,81 | 334,57 | | 0,00 | 0,00 ', значения команды вставки находятся в другом порядке, чем указано во входной строке.
@tetri: Мейсон прав. У вас есть ошибка в другом месте вашего кода. –
Я уверен, что, как и многие офисы по всему миру, мы используем эту точную конкатенацию строк в наших SQL-запросах и никогда не сталкивались с подобной проблемой. Мой опыт ограничен 2010 годом и XE2, но, глядя на ваш пример кода, я не вижу причины, по которой вы получите такое поведение. Более подробный код будет полезен. – JamesW
, если эта строка кода, которую вы отправили, является точно такой же строкой из вашего кода, установите точку останова и допросите значения до их отправки через функцию формата ... Я согласен с остальными комментариями, скорее всего, ваша ошибка находится в другом месте. – GDF