ADOシーケンス

ADOシーケンス

ユニットncSerializeADO; 

インターフェイス

はSysUtils、クラス、バリアント、DB、ADODB、ADOInt、ComObj、ActiveX、OleCtrlsを使用します。

// SysUtils:Need TBytes 
//クラス:Need TBytesStream 
// ADODB:Need TPersistFormat 
// ADOInt:Need function PersistFormatEnum 
// ActiveX:Need IStream 

function RecordsetToStream(const aRecordset:_Recordset; aFormat:TPersistFormat):TBytesStream; 
function RecordsetToBytes(const aRecordset:_Recordset; aFormat:TPersistFormat = pfADTG):TBytes; 

function StreamToRecordset(const aStream:TBytesStream; aConnection:TADOConnection = nil):_Recordset; 
function BytesToRecordset(const aBytes:TBytes; aConnection:TADOConnection = nil):_Recordset;

function VariantToBytes(aVar:Variant):TBytes; 
function BytesToVariant(aBytes:TBytes):Variant; 

function ParametersToBytes(aParameters:TParameters):TBytes; 
プロシージャBytesToParameters(aBytes:TBytes; aParameters:TParameters); 

実装

はncSourcesを使用します。

function VariantToBytes(aVar:Variant):TBytes; 
var 
  VariantType:TVarType; 
  BufLen:整数。
開始
  VariantType:= FindVarData(アヴァール)^ VTypeの;。
  SetLength(Result、SizeOf(VariantType)); 
  move(VariantType、Result [0]、SizeOf(VariantType)); 
  BufLen:= Length(Result); 
  そうでない場合([VariantType in [varEmpty、varNull]))次に
  開始します 
    ケースVariantTypeの
      varByte、varSmallint、varShortInt、varInteger、varWord、varLongWord:
        WriteInteger(aVar、Result、BufLen); 
      varSingle、varDouble:
        WriteDouble(aVar、Result、BufLen); 
      varCurrency:
        WriteCurrency(aVar、Result、BufLen); 
      varDate:
        WriteDate(aVar、Result、BufLen); 
      varBoolean:
        WriteBool(aVar、Result、BufLen); 
      varInt64、varUInt64:
        WriteInt64(aVar、Result、BufLen); 
      varOleStr、varStrArg、varString、varUString:
        WriteString(aVar、Result、BufLen); 
    それ以外の場合は
      、Exception.Create( 'Cannot pack specified parameter');を発生させます。
    終わり; 
  終わり;

終わり; 

function BytesToVariant(aBytes:TBytes):Variant; 
var 
  VariantType:TVarType; 
  Ofs:整数; 
開始
  移動(aBytes [0]、VariantType、にSizeOf(VariantType))。
  Ofs:= SizeOf(VariantType); 

  そうでない場合(VariantType in [varEmpty、varNull])次に、varEmptyの
    ケースVariantTypeを
  開始します
        結果:= Variants.Unassigned; 
      varNull:
        結果:= Variants.Null; 
      varByte、varSmallint、varShortInt、varInteger、varWord、varLongWord:
        結果:= ReadInteger(aBytes、Ofs); 
      varSingle、varDouble:
        結果:= ReadDouble(aBytes、Ofs);
      varCurrency:
        結果:= ReadCurrency(aBytes、Ofs); 
      varDate:
        結果:= ReadDate(aBytes、Ofs); 
      varBoolean:
        結果:= ReadBool(aBytes、Ofs); 
      varInt64、varUInt64:
        結果:= ReadInt64(aBytes、Ofs); 
      varOleStr、varStrArg、varString、varUString:
        結果:= ReadString(aBytes、Ofs); 
    それ以外の場合は
      、Exception.Create( 'Cannot pack specified parameter');を発生させます。
    終わり; 
  終わり; 

終わり; 

function ParametersToBytes(aParameters:TParameters):TBytes; 
var 
  BufLen:整数。
  i:整数。
  WriteInteger(aParameters.Count、Result、BufLen);を
開始し
  BufLen:= 0をます。ます。
  for i:= 0 to aParameters.Count-1 do 
    WriteBytes(VariantToBytes(aParameters.Items [i] .Value)、Result、BufLen); 
終わり; 

プロシージャBytesToParameters(aBytes:TBytes; aParameters:TParameters); 
var 
  ParameterCount:整数。
  Ofs:整数; 
  i:整数。
開始
  長さ(aBytes)場合、次いで0> 
  始める
    Ofsのみに依存:= 0; 
    Assigned(aParameters)でない場合は、
      Exception.Create( 'Parameters object not assigned');を発生させます。
    ParameterCount:= ReadInteger(aBytes、Ofs); 
    ParameterCount <> aParameters.Countの場合
      Exception.Create( 'BytesストリームパラメータがSQLパラメータと異なります');  
      //レコードセットのコンテンツをストリームに保存します

    for i:= 0からParameterCount-1まで
      aParameters.Items [i] .Value:= BytesToVariant(ReadBytes(aBytes、Ofs)); 
  終わり; 
終わり; 

function RecordsetToStream(const aRecordset:_Recordset; aFormat:TPersistFormat):TBytesStream; 
var 
  ADOStream:IStream; 
begin 
  //データを保持するストリームを作成します
  Result:= TBytesStream.Create; 
  try 
    // ADOはDelphiストリームに直接書き込むことができないため、Delphiストリーム
    ADOStream:= TStreamAdapter.Create(Result、soReference)をIStreamとしてラップする必要があります。 
    試してください
    //ストリームにデータが含まれるようになりました
      aRecordset.Save(ADOStream、PersistFormatEnum(aFormat)); 
    最後に
      ADOStream:= nil; 
    終わり; 

    //ストリームを開始位置に配置します
    Result.Position:= 0; 
    Result.Free 
  を除く
    上げる; 
  終わり; 
終わり; 

function RecordsetToBytes(const aRecordset:_Recordset; aFormat:TPersistFormat = pfADTG):TBytes; 
var 
  tmpSS:TBytesStream; 
  tmpSSを
開始します:= RecordsetToStream(aRecordset、aFormat); 
    結果を
  試してください:= tmpSS.Bytes; 
  最後に
    tmpSS.Free; 
  終わり; 
終わり;


function StreamToRecordset(const aStream:TBytesStream; aConnection:TADOConnection = nil):_Recordset; 
var 
  ADOStream:IStream; 
begin 
  Result:= CoRecordset.Create; 
  試す 
    // ADOはDelphiストリームに直接書き込むことができないため、Delphiストリーム
    ADOStream:= TStreamAdapter.Create(aStream、soReference)をIStreamとしてラップする必要があります。
    try 
      //ストリームのコンテンツをレコードセットに
      保存しますResult.Open(ADOStream、EmptyParam、adOpenKeyset、adLockBatchOptimistic、adCmdFile); 

      //レコードセットを更新できるようにするには、Set_ActiveConnectionが必要です。
      Assigned(aConnection)の場合、
          Result.Set_ActiveConnection(aConnection.ConnectionObject); 
    最後に
      ADOStream:= nil; 
    終わり; 
    Result 
  以外:= nil; 
    上げる; 
  終わり; 
終わり;

function BytesToRecordset(const aBytes:TBytes; aConnection:TADOConnection = nil):_Recordset; 
var 
  Stream:TBytesStream; 
開始
  ストリーム:= TBytesStream.Create(aBytes)。
    Stream.Position:= 0を
  試してください
    結果:= StreamToRecordset(Stream、aConnection); 
  最後に
    Stream.Free; 
  終わり; 
終わり; 


終わり。

  

function TReadyQueryItem.Update(aUpdates:_recordset):TBytes; 
var 
  tmpDS:TADODataSet; 
  FSerialiser.Acquireを
開始します。
    tmpDS:= TADODataSet.Create(nil);を
  試してください
      tmpDS.Recordset:= aUpdates;を
    試してください
      tmpDS.Recordset.Set_ActiveConnection(ADOQuery.Connection.ConnectionObject); 
      tmpDS.Recordset.UpdateBatch(adAffectAll); 
      // tmpDS.Recordset.Filter:= adFilterAffectedRecords; 
      結果:= RecordsetToBytes(tmpDS.Recordset、pfADTG); 
    最後に
      tmpDS.Free; 
    終わり; 
  最後に
    FSerialiser.Release; 
  終わり; 
終わり; 

プロシージャTReadyQueryItem.GetTablesForSQL;
var 
  i:整数。 
begin 
  Tables.Clear; 
  //すべてのフィールドについて、そのテーブルの
  i:= 0からADOQuery.Recordset.Fields.Count-1を取得し
    ます。VarIsStr(ADOQuery.Recordset.Fields.Item [i] .Properties.Item ['BASETABLENAME']。値)次に
      Tables.Add(ADOQuery.Recordset.Fields.Item [i] .Properties.Item ['BASETABLENAME']。Value); 
終わり;

  

おすすめ

転載: www.cnblogs.com/hnxxcxg/p/12710175.html