Pengecualian 'String salah' saat memasukkan ke Firebird (Delphi, UniDAC, UniSQL, INSERT, parameter)

Menggunakan Delphi 2010, komponen UniDAC, Firebird 2.5 SuperServer. Kumpulan karakter basis data adalah ISO_8559_1 (default Windows saya).

Saya sedang menulis aplikasi transfer data untuk mentransfer data dari database Access ke database Firebird yang memiliki struktur tabel yang identik. Saya menggunakan komponen ADOQuery untuk memilih semua baris dari tabel sumber, dan kemudian mengulangi kumpulan data itu, dan menggunakan komponen UniSQL dengan pernyataan INSERT dengan parameter, menetapkan nilai parameter dari nilai bidang kumpulan data sumber yang sesuai.

Saat menjalankan perintah sisipkan, ia memunculkan pengecualian 'String salah'. Saya terjebak dan butuh bantuan untuk menyelesaikan masalah ini.

Kode berikut:

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; 

TIA, SteveL


person SteveL    schedule 06.11.2010    source sumber
comment
Anda dapat menyimpan pernyataan ke file tepat sebelum fbcmd.Execute. Saat pengecualian muncul, apa yang ada di file Anda (atau pernyataan terakhir jika Anda menambahkan) adalah pelakunya.   -  person Lieven Keersmaekers    schedule 06.11.2010
comment
Coba ganti s : WideString; dengan s : AnsiString;   -  person oodesigner    schedule 06.11.2010
comment
Ini adalah bidang Blob yang menyebabkan kesalahan. Apa yang harus saya lakukan untuk memperbaiki kesalahan tersebut?   -  person SteveL    schedule 06.11.2010


Jawaban (1)


Jika Anda mencoba mengganti s := StringReplace(s, '"', '""', [rfReplaceAll]); dengan s := StringReplace(s, '''''', '''', [rfReplaceAll]) ; dan batalkan komentar pada baris tersebut;

person razvanb1romania    schedule 11.11.2010