用ADO访问Oracle9i,才有Oracle公司的OLE DB驱动程序,
Delphi写的Midas中间层,中间层服务器是Dell 4600
现在用客户端把大量文件传到中间层,在由中间层把这个文件保存到数据库的
BLOB字段中,客户端把文件传递到中间层的方法是把文件流转换成OleVariant,到中间层再把OleVariant转换成流存到数据库中
问题是前几个文件是没问题的,当存了十几个文件后就再存不进去了
而用普通PC机做中间层服务器是没有问题的,问题只出在用Dell服务器做中间层的机器上
中间层存文件的代码如下
procedure TEGov.PutFile(FileBody: OleVariant; const File_ID: WideString;
  FileOrder: Integer);
var
  MS: TMemoryStream;
  AQuery: TADOQuery;
begin
  MS := TMemoryStream.Create;
  AQuery := TADOQuery.Create(Self);
  AQuery.Connection := Connection;
  try
    VariantToStream(FileBody, MS);
    with AQuery do
    begin
      SQL.Text := 'Select * from file_table where 1=2';      
      Open;
      Insert;
      FieldByName('file_id').AsString := File_ID;
      FieldByName('file_order').AsInteger := FileOrder;
      TBlobField(FieldByName('file_body')).LoadFromStream(MS);
      Post;
    end;
  finally
    MS.Free;
    AQuery.Free;
  end;
end;
多个文件就是通过不断的调用这个中间层方法存入数据库的。
每个文件的大小都不超过1M
希望各位大侠帮忙,谢谢大家

解决方案 »

  1.   

    有两个函数忘贴了
    procedure VariantToStream(const v: olevariant;
      Stream: TMemoryStream);
    var
      p: pointer;
    begin
      Stream.Position := 0;
      Stream.Size := VarArrayHighBound(v, 1) - VarArrayLowBound(v, 1) + 1;
      p := VarArrayLock(v);
      Stream.Write(p^, Stream.Size);
      VarArrayUnlock(v);
      Stream.Position := 0;
    end;procedure StreamToVariant(Stream: TMemoryStream; var v: OleVariant);
    var
      p: pointer;
    begin
      v := VarArrayCreate([0, Stream.Size - 1], varByte);
      p := VarArrayLock(v);
      Stream.Position := 0;
      Stream.Read(p^, Stream.Size);
      VarArrayUnlock(v);
    end;