ข้อยกเว้น 'สตริงที่มีรูปแบบไม่ถูกต้อง' เมื่อแทรกลงใน Firebird (Delphi, UniDAC, UniSQL, INSERT, พารามิเตอร์)

การใช้ Delphi 2010, ส่วนประกอบ UniDAC, Firebird 2.5 SuperServer ชุดอักขระฐานข้อมูลคือ ISO_8559_1 (ค่าเริ่มต้น Windows ของฉัน)

ฉันกำลังเขียนแอปพลิเคชันถ่ายโอนข้อมูลเพื่อถ่ายโอนข้อมูลจากฐานข้อมูล Access ไปยังฐานข้อมูล Firebird ที่มีโครงสร้างตารางเหมือนกัน ฉันใช้ส่วนประกอบ ADOQuery เพื่อเลือกแถวทั้งหมดจากตารางต้นฉบับ จากนั้นวนซ้ำผ่านชุดระเบียนนั้น และใช้ส่วนประกอบ UniSQL กับคำสั่ง INSERT พร้อมพารามิเตอร์ กำหนดค่าพารามิเตอร์จากค่าฟิลด์ชุดข้อมูลต้นทางที่สอดคล้องกัน

เมื่อรันคำสั่ง insert จะแสดงข้อยกเว้น 'สตริงที่มีรูปแบบไม่ถูกต้อง' ฉันติดอยู่และต้องการความช่วยเหลือในการแก้ไขปัญหา

รหัสดังต่อไปนี้:

function TDataTransfer.BeginTransfer(AProgressCallback: TProgressCallback): Boolean;
var
  slSQLSelect, slSQLInsert: TStringList;
  i, f, z: Integer;
  cmdS, cmdI: String;
  adods: TADODataSet;
  fbcmd: TUniSQL;
  fbscript: TUniscript;
  q: String;
  s : WideString;
begin
  FProgressCallback := AProgressCallback;

  fbscript := TUniscript.Create(nil);
  try
    fbscript.Connection := FirebirdConnection;
    FirebirdConnection.StartTransaction;
    try
      fbscript.Delimiter := ';';
      fbscript.ExecuteFile(ExtractFilePath(ParamStr(0)) + 'Firebird_Script_0.txt');
      FirebirdConnection.CommitRetaining;

      slSQLSelect := TStringList.Create;
      slSQLInsert := TStringList.Create;
      adods := TADODataSet.Create(nil);
      fbcmd := TUniSQL.Create(nil);
      try
        adods.Connection := AccessConnection;
        fbcmd.Connection := FirebirdConnection;

        slSQLSelect.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Access_Select.txt');
        slSQLInsert.LoadFromFile(ExtractFilePath(ParamStr(0)) + 'Firebird_Insert.txt');

        z := slSQLSelect.Count - 1;
        for i := 0 to z do begin
          cmdS := slSQLSelect[i];
          cmdI := slSQLInsert[i];

          adods.CommandText := cmdS;
          fbcmd.SQL.Text := cmdI;

          adods.Open;

          while not adods.Eof do begin
            for f := 0 to adods.FieldCount - 1 do
              try
                if adods.FieldDefs[f].DataType = ftWideString then begin
                  s := adods.Fields[f].AsAnsiString ;
                  q := '"';
//                  if AnsiStrPos(PAnsiChar(@s), PAnsiChar(q)) <> nil then
//                    s := StringReplace(s, '"', '""', [rfReplaceAll]);
                  fbcmd.Params[f].Value := s;
                end
                else
                if adods.FieldDefs[f].DataType = ftWideMemo then
                  fbcmd.Params[f].SetBlobData(adods.CreateBlobStream(adods.Fields[f], bmRead))
                else
                  fbcmd.Params[f].Value := adods.Fields[f].Value;
              except
                raise;
              end;

            try
              fbcmd.Execute;
              //  FirebirdConnection.CommitRetaining;
            except
              raise;
            end;
            adods.Next;
          end;
          adods.Close;

          FProgressCallback((i + 1) * 100 div (z + 1), 10);
        end;
      finally
        slSQLSelect.Free;
        slSQLInsert.Free;
        adods.Free;
        fbcmd.Free;
      end;

      fbscript.ExecuteFile(ExtractFilePath(ParamStr(0)) + 'Firebird_Script_1.txt');

      FirebirdConnection.Commit;

      Result := True;
    except
      FirebirdConnection.Rollback;
      Result := False;
    end;
  finally
    fbscript.Free;
  end;


end; 

ทีไอเอ, สตีฟแอล


person SteveL    schedule 06.11.2010    source แหล่งที่มา
comment
คุณสามารถบันทึกคำสั่งลงไฟล์ก่อน fbcmd.Execute ได้ เมื่อเกิดข้อยกเว้น สิ่งที่อยู่ในไฟล์ของคุณ (หรือคำสั่งสุดท้ายหากคุณต่อท้าย) คือผู้กระทำผิด   -  person Lieven Keersmaekers    schedule 06.11.2010
comment
ลองแทนที่ s : WideString; ด้วย s : AnsiString;   -  person oodesigner    schedule 06.11.2010
comment
เป็นฟิลด์ Blob ที่ทำให้เกิดข้อผิดพลาด ฉันต้องทำอย่างไรเพื่อแก้ไขข้อผิดพลาด?   -  person SteveL    schedule 06.11.2010


คำตอบ (1)


หากคุณพยายามแทนที่ s := StringReplace(s, '"', '""', [rfReplaceAll]); ด้วย s := StringReplace(s, '''''', '''', [rfReplaceAll]) ; และยกเลิกการใส่เครื่องหมายข้อคิดเห็นบรรทัด;

person razvanb1romania    schedule 11.11.2010