Исключение "неверная строка" при вставке в Firebird (Delphi, UniDAC, UniSQL, INSERT, параметры)

Используя Delphi 2010, компоненты UniDAC, Firebird 2.5 SuperServer. Набор символов базы данных - ISO_8559_1 (мой Windows по умолчанию).

Я пишу приложение для передачи данных для передачи данных из базы данных Access в базу данных Firebird с идентичной структурой таблиц. Я использую компонент ADOQuery для выбора всех строк из исходной таблицы, а затем перебираю этот набор записей и использую компонент UniSQL с оператором 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