RO保存文件到Oracle的Blob字段问题(来人接分)~

gzyzljk 2010-12-08 10:56:49
环境:oralce 9i,RO 60.43.801,UniDAC 3.0.9
在客户端是通过StreamToVariant后传给服务端,服务端保存到数据库的代码
如下:

// 压入更新参数
for i := 0 to FDataTransferParams.Count - 1 do
begin
if FDataTransferParams.GetItems(i)^.isBlob then
begin
if (not VarIsNull(FDataTransferParams.GetItems(i).fValue)) and
(not VarIsEmpty(FDataTransferParams.GetItems(i).fValue)) then
begin
VariantToStream(FDataTransferParams.GetItems(i).fValue,
_IROStream.Stream);
_IROStream.Stream.Position := 0;
_IDASQLCommand.Params[i].DataType := datBlob;
_IDASQLCommand.Params[i].ParamType := daptInput;
_IDASQLCommand.Params[i].LoadFromStream(_IROStream);
end
else
_IDASQLCommand.Params[i].Value := NULL;
end
else
_IDASQLCommand.Params[i].Value := FDataTransferParams.GetItems(i)
.fValue;

end;

现在的问题是如果存的是文本文件,存取都正常,但如果是图片或其它二进制的文件,取出来就会少字节数据,奇怪了~~~~

-----------
好几天,居然没一个来接分的,唉,彻底的悲剧~~~
...全文
130 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
haitao 2010-12-13
  • 打赏
  • 举报
回复
没使用ro,自己搞了一个简陋一点的
gzyzljk 2010-12-13
  • 打赏
  • 举报
回复
杯具,真的很杯具~~
gzyzljk 2010-12-08
  • 打赏
  • 举报
回复
来个人来接分吧,这年头搞delphi真少多了,唉~~~
gzyzljk 2010-12-08
  • 打赏
  • 举报
回复
自己解决了,原来是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,495

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧