如何调试Array DML FireDAC查询



我正试图使用Array DML将逗号分隔文件中的值插入Interbase SQL DB中。问题是,我在方面遇到了很多问题

算术、数字溢出或字符串截断

在尝试执行DML查询时出错,这很可能是由于循环进行得太远。

虽然DML比使用传统循环并为文件的每一行推送查询更快,但我很难调试,因为我看不到在最后或逐步调试期间推送查询。

是否有查看推送查询的方法?到目前为止,FDQuery似乎还没有提供这种可能性,所以我很难判断运行时出现了什么问题。

使用的csv文件可以在这里找到,代码是:

if FileExists(OpenDialog1.FileName) then
begin
Strings := TStringList.Create;
CurrentLine := TStringList.Create;
try
Strings.Clear;
Strings.LoadFromFile(OpenDialog1.FileName);
iArraySize := Strings.Count;
FDQuery1.SQL.Text := 'INSERT INTO tbl_post4 (lngpostid, strname, strdesc, ysnisdefault, memLabelList, memNotesText, lnggroupid, ysnisgroup, dtiCreated, dtiModified) VALUES(:p1, :p2, :p3, :p4, :p5, :p6, :p7, :p8, :p9, :p10);';
FDQuery1.Params.ArraySize := iArraySize;
for m := 1 to Strings.Count - 1 do   //starting at second line of file since first is used for column names
begin
CurrentLine.Clear;
Split(',', Strings[m], CurrentLine);
for n := 0 to CurrentLine.Count - 1 do
begin //  replace empty with space && escape single quotes if found
if CurrentLine[n].IsEmpty then
begin
CurrentLine[n] := ' ';
end;
if CurrentLine[n].Contains('''') then
begin
CurrentLine[n] := StringReplace(CurrentLine[n], '''', '''''', [rfReplaceAll, rfIgnoreCase]);
end;
end;
FDQuery1.Params[0].AsIntegers[m] := CurrentLine[0].ToInteger;
FDQuery1.Params[1].AsStrings[m] := CurrentLine[1];
FDQuery1.Params[2].AsStrings[m] := CurrentLine[2];
FDQuery1.Params[3].AsBooleans[m] := CurrentLine[3].ToBoolean;
FDQuery1.Params[4].AsStrings[m] := CurrentLine[4];
FDQuery1.Params[5].AsStrings[m] := CurrentLine[5];
FDQuery1.Params[6].AsIntegers[m] := CurrentLine[6].ToInteger;
FDQuery1.Params[7].AsBooleans[m] := CurrentLine[7].ToBoolean;
FDQuery1.Params[8].Values[m] := CurrentLine[8];
FDQuery1.Params[9].Values[m] := CurrentLine[9];

end; //end for m
FDConnection1.StartTransaction;
FDQuery1.Execute(FDQuery1.Params.ArraySize);
FDConnection1.CommitRetaining;

ShowMessage('Data imported');
CurrentLine.Free;
Strings.Free;
except
on E : Exception do
begin
ShowMessage(E.Message);
FDConnection1.RollbackRetaining;
FDConnection1.Commit;
CurrentLine.Free;
Strings.Free;
end;
end;
FDConnection1.Commit;
end
else
begin
raise Exception.Create('File does not exist.');
end;

// split function for reference
procedure Split(Delimiter: Char; Str: string; ListOfStrings: TStrings) ;
begin
ListOfStrings.Clear;
ListOfStrings.Delimiter       := Delimiter;
ListOfStrings.StrictDelimiter := True; // Requires D2006 or newer.
ListOfStrings.DelimitedText   := Str;
end;

在我的案例中,问题是我将FDQuery1.Exec(FDQuery1.Params.Size, 0)的范围设置得太低。这插入了null记录。简单地将0增加到1就解决了我的问题。

然而,我没有找到一种有用的方法来监视SQL错误并提取TMonitor上发送的Array DML查询。

相关内容

  • 没有找到相关文章

最新更新