通过第一部分的介绍,我们对这个Audit Logging解决方案的原理有了较为全面的了解,接下来我们将通过一个简单的Sample来进一步介绍如何在一个具体的应用中如何实现这样一个Audit Logging。
我们沿用在Part I提出的Order management 场景,为了简单起见,我们通过一个Console application来模拟。在这个Application中,你将会看到如何以一种离线的模式操作数据库,如何Log这些操作。
我们首先来介绍Sample程序的结构(如下图)。整个Solution 一共包括两个Project,一个Console application,另一个是用以管理和定义Stored Procedure和Trigger的Database project。我们现在就来一步步实现这样一个Order management的简单的应用。Source Code从Artech.WCFService.zip下载。
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg0NS8yZmVjOWY5NWNjMjk0M2RlOTdhNzIwODVlMTZmZTNiZC5KUEVH)
一.定义一个轻型的Data access 的Helper class。
在Part I中我提到过这样一个Helper class,虽然这不是本篇所要介绍的重点,但是为了让读者能够较为全面地了解整个处理流程,在这里我对她作一个简单的介绍。
我在前一阵子,写过一篇叫做[原创]我的ORM: 开发自己的Data Access Application Block 的文章,在这片文章中我开发了一个自定义的DAB。我这个Data access helper便是采用里面提出的思想,实现了其中一小部分功能:Data retrieval, Update Dataset和Transaction。力求简洁,我剔出掉其中可配置的data mapping部分采用hard coding的方式实现Dataset和Stored procedure的Mapping。
通过这个Helper class,你可以调用UpdateData方法把对一个Table作的修改向数据库提交。这个方法的思路是这样的:我们对该Table的增加、修改和删除均定义了一个Stored procedure,我们假设Table name和Stored procedure name之间,Stored procedure的每个Parameter 的名称和Table中的Field name和DataRowVersion存在一个Mapping。比如T_ORDER对应的增加、修改和删除stored procedure分别为sp_order_i,sp_order_u和sp_order_d;stored procedure的参数@p_order_id对应的Source column为ORDER_ID, SourceVersion为DataRowVersion.Current,而参数@o_order_id对应的SourceVersion为DataRowVersion.Original。有了这样一个Mapping为前提,相信大家对Helper class的实现原理应该想象得到。当然要使我们的Stored procedure满足这样一个Mapping,靠我们手工的方式来定义每个stored procedure在一个真正的application是不现实的,一般地这些都是通过我们根据具体的Mapping关系开发的生成器生成的。像本Sample的所有stored procedure和trigger也都是通过Generator生成的。
下面是整个Helper class的实现,不算太复杂,有兴趣的话可以看看。否则敬请略过。
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Configuration;
usingSystem.Data;
usingSystem.Data.Common;
usingSystem.Data.SqlClient;
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzYwOC9mMGNkNmM3ZjllN2FlOTZmZWFlMDYyY2I0OGY2NzBmMC5naWY=)
namespaceArtech.AuditLogging.ConsoleApp
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ1MC8zNDAzMWM3MDhiZmU3MDJmZTgyZDAxZmY1YzY1OTNhYS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI0OC8wYmUxMjFmYTViODk4OGZiYWJiYmM1MjZhZjNiMGZjMC5naWY=)
{
publicclassDataAccessHelper:IDisposable
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
PrivateFields#regionPrivateFields
privatebool_isDisposed;
privatestring_connectionString;
privateDbConnection_connection;
privateDbTransaction_transaction;
privateDbProviderFactory_dbProviderFactory;
privateDbDataAdapter_dbDataAdapter;
#endregion
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
PublicProperties#regionPublicProperties
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
publicDbDataAdapterDbDataAdapter
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
get
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
if(this._dbDataAdapter==null)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
this._dbDataAdapter=this.DbProviderFactory.CreateDataAdapter();
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
returnthis._dbDataAdapter;
}
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
publicDataAccessHelper()
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
this._dbProviderFactory=DbProviderFactories.GetFactory(ConfigurationManager.ConnectionStrings[0].ProviderName);
this._connectionString=ConfigurationManager.ConnectionStrings[0].ConnectionString;
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
//DataAccessProviderFactorywhichisresponsibleforcreatingproviderbasedADO.NETconponent.
publicDbProviderFactoryDbProviderFactory
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
get
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
returnthis._dbProviderFactory;
}
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
publicDbConnectionConnection
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
get
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
if(this._connection==null)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
this._connection=this.DbProviderFactory.CreateConnection();
this._connection.ConnectionString=this._connectionString;
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
if(this._connection.State!=ConnectionState.Open)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
this._connection.Open();
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
returnthis._connection;
}
}
#endregion
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
TransactionOperations#regionTransactionOperations
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
publicvoidBeginTransaction()
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
this._transaction=this.Connection.BeginTransaction();
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
publicvoidRollback()
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
if(this._transaction!=null)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
this._transaction.Rollback();
}
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
publicvoidCommit()
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
if(this._transaction!=null)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
this._transaction.Commit();
}
}
#endregion
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
DataMapping#regionDataMapping
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
privatestringGetSourceCoulmnName(stringpatameterName)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
//@p_abc_def|o_abc_def=>ABC_DEF
returnpatameterName.Substring(3,patameterName.Length-3).ToUpper();
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
publicDataRowVersionGetSourceVersion(stringparameterName)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
//p_abc_def=>DataRowVersion.Current
//o_abc_default=>DataRowVersion.Original
if(parameterName.StartsWith("@o"))
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
returnDataRowVersion.Original;
}
returnDataRowVersion.Current;
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
privatestringGetSelectStoredProcedureName(stringtableName)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
//T_ABC_DEF=>sp_abc_def_s
returnstring.Format("sp_{0}_s",tableName.Substring(2,tableName.Length-2).ToLower());
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
privatestringGetInsertStoredProcedureName(stringtableName)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
//T_ABC_DEF=>sp_abc_def_i
returnstring.Format("sp_{0}_i",tableName.Substring(2,tableName.Length-2).ToLower());
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
privatestringGetModifyStoredProcedureName(stringtableName)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
//T_ABC_DEF=>sp_abc_def_u
returnstring.Format("sp_{0}_u",tableName.Substring(2,tableName.Length-2).ToLower());
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
privatestringGetDeleteStoredProcedureName(stringtableName)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
//T_ABC_DEF=>sp_abc_def_d
returnstring.Format("sp_{0}_d",tableName.Substring(2,tableName.Length-2).ToLower());
}
#endregion
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
DiscoveryParameter#regionDiscoveryParameter
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
privatevoidDiscoverParameters(DbCommandcommand)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
if(command.Connection.State!=ConnectionState.Open)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
command.Connection.Open();
}
SqlCommandBuilder.DeriveParameters(commandasSqlCommand);
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
#endregion
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
PublicMethods#regionPublicMethods
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
publicvoidUpdateData(DataTabletable)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
//Createthethreecommandsofthedatabasedataadapter.
DbCommandinsertCommand=this.Connection.CreateCommand();
DbCommandupdateCommand=this.Connection.CreateCommand();
DbCommanddeleteCommand=this.Connection.CreateCommand();
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
//Specifythecommandtype.
insertCommand.CommandType=CommandType.StoredProcedure;
updateCommand.CommandType=CommandType.StoredProcedure;
deleteCommand.CommandType=CommandType.StoredProcedure;
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
insertCommand.UpdatedRowSource=UpdateRowSource.OutputParameters;
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
//Specifythecommandtext.
insertCommand.CommandText=this.GetInsertStoredProcedureName(table.TableName);
updateCommand.CommandText=this.GetModifyStoredProcedureName(table.TableName);
deleteCommand.CommandText=this.GetDeleteStoredProcedureName(table.TableName);
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
//Settheparametersoftheinsertcommand.
if(table.GetChanges(DataRowState.Added)!=null)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
if(this._transaction!=null)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
insertCommand.Transaction=this._transaction;
}
this.DiscoverParameters(insertCommand);
//SpecifytheSourcecolumnandsourceversionforinsertcommandbasedparamemters.
foreach(DbParameterparameterininsertCommand.Parameters)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
if(parameter.Direction==ParameterDirection.ReturnValue)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
continue;
}
parameter.SourceColumn=this.GetSourceCoulmnName(parameter.ParameterName);
parameter.SourceVersion=this.GetSourceVersion(parameter.ParameterName);
}
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
//Settheparametersoftheupdatecommand.
if(table.GetChanges(DataRowState.Modified)!=null)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
if(this._transaction!=null)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI2MS8zMTEyYjdiNjUyNmRiNWJjODNlMjc1MjYwYWU2MDUyNS5naWY=)
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzMvZjI2NzFiN2Y0MmNlNTA1ZDliZjU1YTdhMGNhMjU3ZmIuZ2lm)
{
updateCommand.Transaction=this._transaction;
}
![[原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II... [原创] 如何追踪每一笔记录的来龙去脉:一个完整的Audit Logging解决方案—Part II...](/default/index/img?u=aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ5MS81ODdlMzRiMTBkY2Y1ZWZiYzA4NTliNTM0NzBhMmRiMy5naWY=)
this.DiscoverParameters(updateCommand);
//SpecifytheSourcecolumnandsourceversionforupdatecommandbasedparamemters.
foreach(DbParameterparameterinupdateCommand.Parameters)