本帖最后由 gzyzljk 于 2010-12-13 16:56:23 编辑

解决方案 »

  1.   

    自己解决了,原来是RO的UniDAC驱动问题,官方修改了ADO的驱动,没有修正UniDac的,解决:
      打开source目录下的DataAbstract_UniDACDriver_D14包,
      打开uDAUniDACDriver.pas
      定位到1101行:
    procedure TDAEUniDACQuery.SetParamValues(AParams: TDAParamCollection);
    begin
      WriteCrLabsParamValues(AParams, TUniQuery(Dataset).Params, true);
    end;按住Ctrl并点击WriteCrLabsParamValues,定位到uDACRLabsUtils.inc
    修正以下代码:
    var i : integer;
        par : uDAInterfaces.TDAParam;
        outpar : DBAccess.TDAParam;
        blobtype : TFieldType;
        //修正UniDac驱动的流问题 龚正元 2010.12
        {$IFDEF DELPHI2009UP}
        st: TROBinaryMemoryStream;
        {$ENDIF}
    begin
      for i := 0 to (InputParams.Count-1) do begin
        par := InputParams[i];
        outpar := OutputParams.ParamByName(par.Name);    // If no blob type is specified, then gets the default field type.
        // BlobType is only meaningful to Oracle. MSSQL works fine just setting the DataType
        blobtype := BlobTypeMappings[par.BlobType];
        if (blobtype=ftUnknown)
          then blobtype := DADataTypesMappings[par.DataType];    case par.DataType of
          datWideMemo,
          datBlob : begin
              outpar.ParamType := TParamType(par.ParamType);
              outpar.DataType := DADataTypesMappings[par.DataType];
              if VarIsNull(par.Value) then 
                outpar.Clear
              else begin
                {$IFDEF DELPHI2009UP}
                // 修正Bug TParameter.SetValue at settings AnsiString+ftBlob
                st := TROBinaryMemoryStream.Create(VariantToAnsiString(par.Value));
                try
                  outpar.LoadFromStream(st, outpar.DataType);
                finally
                  st.Free;
                end;
                {$ELSE}
                  if VarIsArray(par.Value) then
                    outpar.Value := VariantToAnsiString(par.Value)
                  else
                    outpar.Value := par.Value;
                {$ENDIF}            // 以下为原代码
                {if VarIsArray(par.Value) then
                  outpar.Value := VariantToAnsiString(par.Value)
                else
                  outpar.Value := par.Value;}
              end;
            end;
      ......重新编译这个包和你的程序即可!!!
      

  2.   

    来个人来接分吧,这年头搞delphi真少多了,唉~~~