我正在嘗試使用 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;
uj5u.com熱心網友回復:
就我而言,問題在于我將范圍設定FDQuery1.Exec(FDQuery1.Params.Size, 0)得太低。這插入了null記錄。只需將 0 提高到 1 即可解決我的問題。
但是,我沒有找到一種有用的方法來監視 SQL 錯誤并提取在 TMonitor 上發送的 Array DML 查詢。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/519530.html
