我正试图使用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查询。