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); 終わり;