自己解决了,原来是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; ......重新编译这个包和你的程序即可!!!
打开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;
......重新编译这个包和你的程序即可!!!