function RecordsetToMS(const Recordset: _Recordset; Stream: TMemoryStream): boolean; var RS: Variant; begin Result := false; if Recordset = nil then Exit; try RS := CreateOleObject('ADODB.Recordset'); RS := Recordset; RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistADTG); Stream.Position := 0; Result := true; finally ; end; end; function RecordsetFromMS(Stream: TMemoryStream): _Recordset; var RS: Variant; begin Result := nil; if Stream.Size < 1 then Exit; try Stream.Position := 0; RS := CreateOleObject('ADODB.Recordset'); RS.Open(TStreamAdapter.Create(Stream) as IUnknown); Result := IUnknown(RS) as _Recordset; finally ; end; end;
我自己 修改过adodb 使 以前的 两层的 程序 不改 代码的 情况下 升级 为 客户端exe > http > IIS >自己写的 dll > sql server 的模式 在 web上运行 核心就是 procedure makeUpstream(s: TMemoryStream; action, sql, memo1, memo2: string); procedure getRS_stream(ms_Down: TMemoryStream; var errmsg: string; ms_rs: TMemoryStream); function HttpPutStram(url: string; s_up, s_down: TMemoryStream): Boolean; function RecordsetFromMS(Stream: TMemoryStream): _Recordset; function RecordsetFromHttp(Host, sql: string): _Recordset; function ExecFromHttp(Host, sql: string; NoRecords: boolean; var c: integer): _Recordset; function HttpConnect(host: string): boolean;
扩展ADODataSet,增加方法LoadFromStream/SaveToStream/LoadFromString/SaveToString: unit MyADODataSet;interfaceuses Classes, ADODB, ADOInt, Variants;type TMyADODataSet = class(TADODataSet) public function LoadFromStream(Stream: TStream): Boolean; function SaveToStream(Stream: TStream): Boolean; function LoadFromString(const Value: string): Boolean; function SaveToString(var Value: string): Boolean; end;procedure Register;implementationtype Recordset25 = interface(_Recordset) ['{00000556-0000-0010-8000-00AA006D2EA4}'] procedure Save(Destination: OleVariant; PersistFormat: PersistFormatEnum); safecall; end;function TMyADODataSet.LoadFromStream(Stream: TStream): Boolean; var mRecordSet: _Recordset; begin Result := False; Close; DestroyFields; mRecordSet := CoRecordset.Create; try if mRecordSet.State = adStateOpen then mRecordset.Close; Stream.Position := 0; mRecordset.Open(TStreamAdapter.Create(Stream) as IUnknown, EmptyParam, adOpenStatic, adLockBatchOptimistic, adAsyncExecute); Stream.Position := 0; if not mRecordSet.BOF then mRecordset.MoveFirst; RecordSet := mRecordSet; inherited OpenCursor(False); Resync([]); Result := True; except // end; end;function TMyADODataSet.SaveToStream(Stream: TStream): Boolean; var mRecordSet: Recordset25; begin Result := False; if Recordset = nil then Exit; if Recordset.QueryInterface(Recordset25, mRecordSet) = 0 then try Stream.Position := 0; mRecordSet.Save(TStreamAdapter.Create(Stream) as IUnknown, adPersistXML); Stream.Position := 0; Result := True; except // end; end;function TMyADODataSet.LoadFromString(const Value: string): Boolean; var mStream: TStringStream; begin Result := False; if Value = '' then Exit; mStream := TStringStream.Create(UTF8Encode(Value)); try LoadFromStream(mStream); Result := True; finally mStream.Free; end; end;function TMyADODataSet.SaveToString(var Value: string): Boolean; var mStream: TStringStream; begin Result := False; mStream := TStringStream.Create(''); try SaveToStream(mStream); mStream.Position := 0; Value := Utf8ToAnsi(mStream.ReadString(mStream.Size)); Result := True; finally mStream.Free; end; end;procedure Register; begin RegisterComponents('Standard', [TMyADODataSet]); end;end.
var
RS: Variant;
begin
Result := false;
if Recordset = nil then Exit; try
RS := CreateOleObject('ADODB.Recordset');
RS := Recordset;
RS.Save(TStreamAdapter.Create(stream) as IUnknown, adPersistADTG);
Stream.Position := 0;
Result := true;
finally
;
end;
end;
function RecordsetFromMS(Stream: TMemoryStream): _Recordset;
var
RS: Variant;
begin
Result := nil;
if Stream.Size < 1 then Exit;
try
Stream.Position := 0;
RS := CreateOleObject('ADODB.Recordset');
RS.Open(TStreamAdapter.Create(Stream) as IUnknown);
Result := IUnknown(RS) as _Recordset;
finally
;
end;
end;
使 以前的 两层的 程序 不改 代码的 情况下
升级 为
客户端exe > http > IIS >自己写的 dll > sql server
的模式 在 web上运行 核心就是
procedure makeUpstream(s: TMemoryStream; action, sql, memo1, memo2: string);
procedure getRS_stream(ms_Down: TMemoryStream; var errmsg: string; ms_rs: TMemoryStream);
function HttpPutStram(url: string; s_up, s_down: TMemoryStream): Boolean;
function RecordsetFromMS(Stream: TMemoryStream): _Recordset;
function RecordsetFromHttp(Host, sql: string): _Recordset;
function ExecFromHttp(Host, sql: string; NoRecords: boolean; var c: integer): _Recordset;
function HttpConnect(host: string): boolean;
unit MyADODataSet;interfaceuses
Classes, ADODB, ADOInt, Variants;type
TMyADODataSet = class(TADODataSet)
public
function LoadFromStream(Stream: TStream): Boolean;
function SaveToStream(Stream: TStream): Boolean;
function LoadFromString(const Value: string): Boolean;
function SaveToString(var Value: string): Boolean;
end;procedure Register;implementationtype
Recordset25 = interface(_Recordset)
['{00000556-0000-0010-8000-00AA006D2EA4}']
procedure Save(Destination: OleVariant; PersistFormat: PersistFormatEnum); safecall;
end;function TMyADODataSet.LoadFromStream(Stream: TStream): Boolean;
var
mRecordSet: _Recordset;
begin
Result := False;
Close;
DestroyFields;
mRecordSet := CoRecordset.Create;
try
if mRecordSet.State = adStateOpen then mRecordset.Close;
Stream.Position := 0;
mRecordset.Open(TStreamAdapter.Create(Stream) as IUnknown, EmptyParam, adOpenStatic, adLockBatchOptimistic, adAsyncExecute);
Stream.Position := 0;
if not mRecordSet.BOF then mRecordset.MoveFirst;
RecordSet := mRecordSet;
inherited OpenCursor(False);
Resync([]);
Result := True;
except
//
end;
end;function TMyADODataSet.SaveToStream(Stream: TStream): Boolean;
var
mRecordSet: Recordset25;
begin
Result := False;
if Recordset = nil then Exit;
if Recordset.QueryInterface(Recordset25, mRecordSet) = 0 then
try
Stream.Position := 0;
mRecordSet.Save(TStreamAdapter.Create(Stream) as IUnknown, adPersistXML);
Stream.Position := 0;
Result := True;
except
//
end;
end;function TMyADODataSet.LoadFromString(const Value: string): Boolean;
var
mStream: TStringStream;
begin
Result := False;
if Value = '' then Exit;
mStream := TStringStream.Create(UTF8Encode(Value));
try
LoadFromStream(mStream);
Result := True;
finally
mStream.Free;
end;
end;function TMyADODataSet.SaveToString(var Value: string): Boolean;
var
mStream: TStringStream;
begin
Result := False;
mStream := TStringStream.Create('');
try
SaveToStream(mStream);
mStream.Position := 0;
Value := Utf8ToAnsi(mStream.ReadString(mStream.Size));
Result := True;
finally
mStream.Free;
end;
end;procedure Register;
begin
RegisterComponents('Standard', [TMyADODataSet]);
end;end.