RE: 怎样在客户端对三层中的文件进行读写操作 ID=2296087, 发贴富翁: Jiams, 发贴时间:2003-11-15 11:42:00type TByteArray = array of byte; //******************************************************************// // OleVariantToStream * // * // Inserts an OleVariant to a TStream (COM Compatible) * //****************************************************************** procedure OleVariantToStream(var Input: OleVariant; Stream: TStream); var pBuf: Pointer; begin pBuf := VarArrayLock(Input); Stream.Write(TByteArray(pBuf^), Length(TByteArray(Input))); VarArrayUnlock(Input); end; //****************************************************************** // StreamToOleVariant * // * // Copies a TStream contents of Count bytes based on the current Position * // to an OleVariant (COM Compatible) * //****************************************************************** function StreamToOleVariant(Stream: TStream; Count: Integer): OleVariant; var pBuf: Pointer; begin Result := VarArrayCreate([0, Count-1], varByte); pBuf := VarArrayLock(Result); Stream.Read(TByteArray(pBuf^), Length(TByteArray(Result))); VarArrayUnlock(Result); end; procedure StoreFile(FileContents: OleVariant); var FS: TFileStream; begin FS := TFileStream.Create('some file name', fmCreate or fmOpenWrite or fmShareExclusive); OleVariantToStream(FileContents, FS); FS.Free; end; procedure SendFileToServer(FileName: string); var FS: TFileStream; begin FS := TFileStream.Create(FileName, fmOpenRead or fmShareCompatible); MyServer.StoreFile(StreamToOleVariant(FS, FS.Size)); FS.Free; end;
做三层时;将数据类型定义为Olevariant可以直接将记录集返回; var OleVariant1 : OleVariant; OleVariant2 : Olevariant; I : integer; begin DataSetProvider1.DataSet := Query1; Query1.Close; Query1.SQL.Clear; Query1.SQL.Text := 'SELECT ...'; Query1.Open; OleVariant1 := DataSetProvider1.Data; //将OleVariant1作为参数返回
//返回参数数组 OleVariant2 := VarArrayCreate([0,Query1.recordCount - 1],VarOleStr); while not Query1.eof do begin OleVariant[I] := Query1.fields[0].asstring; Inc(I) end; end;
ID=2296087, 发贴富翁: Jiams, 发贴时间:2003-11-15 11:42:00type
TByteArray = array of byte; //******************************************************************//
// OleVariantToStream *
// *
// Inserts an OleVariant to a TStream (COM Compatible) *
//******************************************************************
procedure OleVariantToStream(var Input: OleVariant; Stream: TStream);
var
pBuf: Pointer;
begin
pBuf := VarArrayLock(Input);
Stream.Write(TByteArray(pBuf^), Length(TByteArray(Input)));
VarArrayUnlock(Input);
end;
//******************************************************************
// StreamToOleVariant *
// *
// Copies a TStream contents of Count bytes based on the
current Position *
// to an OleVariant (COM Compatible) *
//****************************************************************** function StreamToOleVariant(Stream: TStream; Count: Integer): OleVariant;
var
pBuf: Pointer;
begin
Result := VarArrayCreate([0, Count-1], varByte);
pBuf := VarArrayLock(Result);
Stream.Read(TByteArray(pBuf^), Length(TByteArray(Result)));
VarArrayUnlock(Result);
end; procedure StoreFile(FileContents: OleVariant);
var
FS: TFileStream;
begin
FS := TFileStream.Create('some file name', fmCreate or fmOpenWrite or fmShareExclusive);
OleVariantToStream(FileContents, FS);
FS.Free;
end; procedure SendFileToServer(FileName: string);
var
FS: TFileStream;
begin
FS := TFileStream.Create(FileName, fmOpenRead or fmShareCompatible);
MyServer.StoreFile(StreamToOleVariant(FS, FS.Size));
FS.Free;
end;
var
OleVariant1 : OleVariant;
OleVariant2 : Olevariant;
I : integer;
begin
DataSetProvider1.DataSet := Query1;
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Text := 'SELECT ...';
Query1.Open;
OleVariant1 := DataSetProvider1.Data; //将OleVariant1作为参数返回
//返回参数数组
OleVariant2 := VarArrayCreate([0,Query1.recordCount - 1],VarOleStr);
while not Query1.eof do
begin
OleVariant[I] := Query1.fields[0].asstring;
Inc(I)
end;
end;
http://www.delphibbs.com/delphibbs/dispq.asp?lid=430771
http://www.delphibbs.com/delphibbs/dispq.asp?lid=270559
//
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1621372