<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_玩转C科技.NET</title><subtitle type="text">从学会做人开始认识这个世界！http://tinyurl.com/volnethttp://bit.ly/KMzi2</subtitle><id>http://feed.cnblogs.com/blog/u/7280/rss</id><updated>2012-05-13T02:00:26Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/7280/rss"/><entry><id>http://www.cnblogs.com/volnet/archive/2012/03/16/2400381.html</id><title type="text">[FIM]invalid-dn,Multiple values were specified for an attribute that can have only one value.</title><summary type="text">FIM错误： Error：invalid-dn,Multiple values were specified for an attribute that can have only one value. 原以为是有多个值设置到同一个属性中（包括http://support.microsoft.com/kb/286760 的说法也是。） 但后来仔细观察发现出现这类问题的共性在于他们多了个空格。...</summary><published>2012-03-16T07:29:00Z</published><updated>2012-03-16T07:29:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2012/03/16/2400381.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2012/03/16/2400381.html"/><content type="html">&lt;p&gt;FIM错误：  &lt;p&gt;Error：invalid-dn,Multiple values were specified for an attribute that can have only one value.  &lt;p&gt;原以为是有多个值设置到同一个属性中（包括&lt;a href="http://support.microsoft.com/kb/286760"&gt;http://support.microsoft.com/kb/286760&lt;/a&gt; 的说法也是。）  &lt;p&gt;但后来仔细观察发现出现这类问题的共性在于他们多了个空格。  &lt;p&gt;原因是这样的，在设置cn的时候，末尾的空格，是不会被AD识别的。但是在userPricipalName的值的时候，我们是设置 &lt;a href="mailto:username%26lt;空格%26gt;@xxxx.com"&gt;username&amp;lt;空格&amp;gt;@xxxx.com&lt;/a&gt;  &lt;p&gt;因此用户登录名就存在两种不一致的情况。  &lt;p&gt;只需要在设置accountName的时候，做一下str.Trim()就可以了。  &lt;p&gt;修改之后，需要重新删除数据后再在AD的MA上FULL_IMPORT+FULL_SYNC在数据源上运行FULL_SYNC，以激活Provisioning操作。  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201205/201205131000251433.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="1" border="0" alt="1" src="http://images.cnblogs.com/cnblogs_com/volnet/201205/201205131000264157.png" width="699" height="539"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201203/201203161528574465.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="2" border="0" alt="2" src="http://images.cnblogs.com/cnblogs_com/volnet/201203/201203161528582348.png" width="700" height="540"&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/volnet/aggbug/2400381.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2012/03/16/2400381.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2012/02/02/2335764.html</id><title type="text">[FIM]如何从A导入数据，同步到B，在A系统中删除数据，在B系统中保留数据并修改状态</title><summary type="text">在FIM同步中，除了上次提到的，删除A库之后，同步删除B库的需求（点击这里）。还有一种比较常见的需求： 通常在应用系统中，并不会真实删除一条数据库记录，只是做一个标记而已。 操作思路： 1、数据源删除用户-&gt;删除对应Metaverse对象（此时应用系统对应的CS object与对应的Metaverse对象disconnected） 2、自定义Extension用于修改状态。 在进行具体设置之前，我...</summary><published>2012-02-02T06:47:00Z</published><updated>2012-02-02T06:47:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2012/02/02/2335764.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2012/02/02/2335764.html"/><content type="html">&lt;p&gt;在FIM同步中，除了上次提到的，删除A库之后，同步删除B库的需求（&lt;a href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310786.html"&gt;点击这里&lt;/a&gt;）。还有一种比较常见的需求：&lt;/p&gt; &lt;p&gt;通常在应用系统中，并不会真实删除一条数据库记录，只是做一个标记而已。&lt;/p&gt; &lt;p&gt;操作思路：&lt;/p&gt; &lt;p&gt;1、数据源删除用户-&amp;gt;删除对应Metaverse对象（此时应用系统对应的CS object与对应的Metaverse对象disconnected）&lt;/p&gt; &lt;p&gt;2、自定义Extension用于修改状态。&lt;/p&gt; &lt;p&gt;在进行具体设置之前，我们要先了解一下FIM的默认行为：&lt;/p&gt; &lt;p&gt;默认情况下，一个Metaverse对象只有当所有与之关联的CS对象都被删除之后，才会被删除。我们可以通过配置来实现，这个对象一旦在某个指定的CS中被删除后，该mv就被删除，比如某公司的HR系统，员工都离职了，我们自然可以认为与之对应的mv对象本不应存在了。&lt;/p&gt; &lt;p class="note"&gt;值得一提的是，无论如何设置，FIM都会保证在最后一个MA中的CS对象与MV失去联系之后，将对应的mv删除。原因很简单，因为任何mv对象都必须要有至少一个的数据源做支撑，既然已没有数据源了，自然它没有存在的可能。&lt;/p&gt; &lt;p&gt;回到本文，进入Metaverse设计界面。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201202/201202021446581899.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/volnet/201202/201202021447004605.png" width="1021" height="753"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;如图所示红色部分，就是“当被勾选的任何一个MA中的数据disconnect的时候，删除对应Metaverse对象”。&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201202/201202021447017246.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/volnet/201202/20120202144702725.png" width="1022" height="753"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;完成该设置后，当数据在MA中删除后（IMPORT），做一次SYNC，对应Metaverse就会被删除。&lt;/p&gt; &lt;p&gt;当Metaverse被删除后对应的MA会如何做呢？打开对应应用系统（需要修改状态值的）MA的配置界面，如下图所示：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201202/201202021447039952.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/volnet/201202/20120202144705956.png" width="1021" height="753"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p class="note"&gt;值得一提的是，选项1和选项2中的disconnectors和explicit disconnector的区别，两者的相同点是，在mv删除后，都会断开，并各自处于Connect = FALSE的状态，但是前者在下次SYNC的时候，还会新建Metaverse对象，但后者则不会再创建了。&lt;/p&gt; &lt;p&gt;在本文，我们应该选择最后一项，通过代码来实现。因为其他三个选项都无法表达我们要设置Status的值，为此我们要在对应的MAExtension中添加相应的代码，如果还没有使用扩展代码的，系统会提示填写一个。&lt;/p&gt; &lt;p&gt;代码如下：&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: #2b91af"&gt;DeprovisionAction IMASynchronization&lt;/span&gt;.Deprovision(&lt;span style="color: #2b91af"&gt;CSEntry &lt;/span&gt;csentry){    csentry[&lt;span style="color: #a31515"&gt;"Status"&lt;/span&gt;].Value = &lt;span style="color: #a31515"&gt;"Deleted"&lt;/span&gt;;    &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;DeprovisionAction&lt;/span&gt;.ExplicitDisconnect;}&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;推荐阅读：&lt;/p&gt;&lt;p&gt;1、Understanding Deprovisioning in FIM &lt;/p&gt;&lt;p&gt;&lt;a href="http://social.technet.microsoft.com/wiki/contents/articles/understanding-deprovisioning-in-fim.aspx"&gt;http://social.technet.microsoft.com/wiki/contents/articles/understanding-deprovisioning-in-fim.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2、[FIM]如何从A导入数据，同步到B，在A系统中删除数据，在B系统中删除数据 &lt;br&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310786.html"&gt;http://www.cnblogs.com/volnet/archive/2012/01/03/2310786.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;3、Account Deprovisioning Scenarios&lt;/p&gt;&lt;p&gt;&lt;a title="http://www.wapshere.com/missmiis/account-deprovisioning-scenarios" href="http://www.wapshere.com/missmiis/account-deprovisioning-scenarios"&gt;http://www.wapshere.com/missmiis/account-deprovisioning-scenarios&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/volnet/aggbug/2335764.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2012/02/02/2335764.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2012/01/15/2322701.html</id><title type="text">[SQL]如何使用MERGE方法有效地插入或更新数据</title><summary type="text">这是一个非常普遍的需求，当我们向一张表插入记录的时候，如果该记录已经存在（通常是主键相同/其他条件匹配），我们就不应当重复插入记录，而是更新该记录。 于是我们最原始的想法一般都是有这样一个存储过程/方法/SQL，先判断是否该记录是否存在，然后决定究竟是更新还是插入。 首先要避免的是用程序来回读取，它们起码要被原子性地处理在一起，否则先不说先判断再执行带来增加一次数据库访问给应用带来性能上的开销外，...</summary><published>2012-01-14T19:39:00Z</published><updated>2012-01-14T19:39:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2012/01/15/2322701.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2012/01/15/2322701.html"/><content type="html">&lt;p&gt;这是一个非常普遍的需求，当我们向一张表插入记录的时候，如果该记录已经存在（通常是主键相同/其他条件匹配），我们就不应当重复插入记录，而是更新该记录。&lt;/p&gt; &lt;p&gt;于是我们最原始的想法一般都是有这样一个存储过程/方法/SQL，先判断是否该记录是否存在，然后决定究竟是更新还是插入。&lt;/p&gt; &lt;p&gt;首先要避免的是用程序来回读取，它们起码要被原子性地处理在一起，否则先不说先判断再执行带来增加一次数据库访问给应用带来性能上的开销外，也无法保证在高并发的前提下的正确性。&lt;/p&gt; &lt;p&gt;在参考资料6中，提供了如下一种SELECT XXX, IF XXX IS NULL INSERT, ELSE, UPDATE，当然这也没有什么错，但从SQL Server 2008开始提供MERGE操作专门处理诸如此类的操作，当然也可以含有删除，但这里只提到INSERTorUPDATE。&lt;/p&gt; &lt;p&gt;借用MongoDB的一个方法名Update + Insert = Upsert，写了下面的方法。其实在Microsoft提供的示例也清晰地描述了这个问题，请大家参看参考资料1。&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: blue"&gt;USE &lt;/span&gt;&lt;span style="color: teal"&gt;[MyDB]&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: blue"&gt;GOIF  &lt;/span&gt;&lt;span style="color: gray"&gt;EXISTS (&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;&lt;span style="color: gray"&gt;* &lt;/span&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;&lt;span style="color: lime"&gt;sys&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: lime"&gt;objects &lt;/span&gt;&lt;span style="color: blue"&gt;WHERE &lt;/span&gt;&lt;span style="color: magenta"&gt;object_id &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: magenta"&gt;OBJECT_ID&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;N'[dbo].[UpsertUser]'&lt;/span&gt;&lt;span style="color: gray"&gt;) AND &lt;/span&gt;&lt;span style="color: blue"&gt;type &lt;/span&gt;&lt;span style="color: gray"&gt;in (&lt;/span&gt;&lt;span style="color: red"&gt;N'P'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: red"&gt;N'PC'&lt;/span&gt;&lt;span style="color: gray"&gt;))&lt;/span&gt;&lt;span style="color: blue"&gt;DROP PROCEDURE &lt;/span&gt;&lt;span style="color: teal"&gt;[dbo]&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;[UpsertUser]&lt;/span&gt;&lt;span style="color: blue"&gt;GOUSE &lt;/span&gt;&lt;span style="color: teal"&gt;[MyDB]&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: blue"&gt;GOIF  &lt;/span&gt;&lt;span style="color: gray"&gt;EXISTS (&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;&lt;span style="color: gray"&gt;* &lt;/span&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;&lt;span style="color: lime"&gt;sys&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: lime"&gt;objects &lt;/span&gt;&lt;span style="color: blue"&gt;WHERE &lt;/span&gt;&lt;span style="color: magenta"&gt;object_id &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: magenta"&gt;OBJECT_ID&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: red"&gt;N'[dbo].[#AnalysisForUpsertUser]'&lt;/span&gt;&lt;span style="color: gray"&gt;) AND &lt;/span&gt;&lt;span style="color: blue"&gt;type &lt;/span&gt;&lt;span style="color: gray"&gt;in (&lt;/span&gt;&lt;span style="color: red"&gt;N'U'&lt;/span&gt;&lt;span style="color: gray"&gt;))&lt;/span&gt;&lt;span style="color: blue"&gt;DROP TABLE &lt;/span&gt;&lt;span style="color: teal"&gt;[dbo]&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;[#AnalysisForUpsertUser]&lt;/span&gt;&lt;span style="color: blue"&gt;GOCREATE TABLE &lt;/span&gt;&lt;span style="color: teal"&gt;#AnalysisForUpsertUser&lt;/span&gt;&lt;span style="color: gray"&gt;(    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingUserID &lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingUserName &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingUserFullName &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingPassword &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingState &lt;/span&gt;&lt;span style="color: blue"&gt;bit&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingEmail &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingUpdateBy &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingUpdateTime &lt;/span&gt;&lt;span style="color: blue"&gt;datetime&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;ExistingRemark &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;ActionTaken &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;10&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;NewUserID &lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;NewUserName &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;NewUserFullName &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;NewPassword &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;NewState &lt;/span&gt;&lt;span style="color: blue"&gt;bit&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;NewEmail &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;NewUpdateBy &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;NewUpdateTime &lt;/span&gt;&lt;span style="color: blue"&gt;datetime&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;NewRemark &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),);&lt;/span&gt;&lt;span style="color: blue"&gt;GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE &lt;/span&gt;&lt;span style="color: teal"&gt;dbo&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;UpsertUser    @UserID &lt;/span&gt;&lt;span style="color: blue"&gt;int&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;@UserName &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;@UserFullName &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;@Password &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;@State &lt;/span&gt;&lt;span style="color: blue"&gt;bit&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;@Email &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: teal"&gt;@UpdateBy &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;),    &lt;/span&gt;&lt;span style="color: green"&gt;--@UpdateTime datetime,    &lt;/span&gt;&lt;span style="color: teal"&gt;@Remark &lt;/span&gt;&lt;span style="color: blue"&gt;nvarchar&lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;50&lt;span style="color: gray"&gt;)&lt;/span&gt;&lt;span style="color: blue"&gt;ASBEGIN    SET NOCOUNT ON&lt;/span&gt;&lt;span style="color: gray"&gt;;    &lt;/span&gt;&lt;span style="color: blue"&gt;MERGE &lt;/span&gt;&lt;span style="color: teal"&gt;tbUser &lt;/span&gt;&lt;span style="color: blue"&gt;AS target    USING &lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;&lt;span style="color: teal"&gt;@UserID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;@UserName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;@UserFullName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;@Password&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;@State&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;@Email&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;@UpdateBy&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;@Remark&lt;/span&gt;&lt;span style="color: gray"&gt;) &lt;/span&gt;&lt;span style="color: blue"&gt;AS &lt;/span&gt;&lt;span style="color: gray"&gt;source       (&lt;/span&gt;&lt;span style="color: teal"&gt;UserID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UserName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UserFullName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: blue"&gt;Password&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: blue"&gt;State&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;Email&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UpdateBy&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;Remark&lt;/span&gt;&lt;span style="color: gray"&gt;)    &lt;/span&gt;&lt;span style="color: blue"&gt;ON &lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: blue"&gt;target&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;UserID &lt;/span&gt;&lt;span style="color: gray"&gt;= source.&lt;/span&gt;&lt;span style="color: teal"&gt;UserID&lt;/span&gt;&lt;span style="color: gray"&gt;)    &lt;/span&gt;&lt;span style="color: blue"&gt;WHEN &lt;/span&gt;&lt;span style="color: gray"&gt;MATCHED &lt;/span&gt;&lt;span style="color: blue"&gt;THEN        UPDATE SET             &lt;/span&gt;&lt;span style="color: teal"&gt;UserName &lt;/span&gt;&lt;span style="color: gray"&gt;= source.&lt;/span&gt;&lt;span style="color: teal"&gt;UserName            &lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UserFullName &lt;/span&gt;&lt;span style="color: gray"&gt;= source.&lt;/span&gt;&lt;span style="color: teal"&gt;UserFullName            &lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: blue"&gt;Password &lt;/span&gt;&lt;span style="color: gray"&gt;= source.&lt;/span&gt;&lt;span style="color: blue"&gt;Password            &lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: blue"&gt;State &lt;/span&gt;&lt;span style="color: gray"&gt;= source.&lt;/span&gt;&lt;span style="color: blue"&gt;State            &lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;Email &lt;/span&gt;&lt;span style="color: gray"&gt;= source.&lt;/span&gt;&lt;span style="color: teal"&gt;Email            &lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UpdateBy &lt;/span&gt;&lt;span style="color: gray"&gt;= source.&lt;/span&gt;&lt;span style="color: teal"&gt;UpdateBy            &lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UpdateTime &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: magenta"&gt;GETDATE&lt;/span&gt;&lt;span style="color: gray"&gt;()            ,&lt;/span&gt;&lt;span style="color: teal"&gt;Remark &lt;/span&gt;&lt;span style="color: gray"&gt;= source.&lt;/span&gt;&lt;span style="color: teal"&gt;Remark        &lt;/span&gt;&lt;span style="color: blue"&gt;WHEN &lt;/span&gt;&lt;span style="color: gray"&gt;NOT MATCHED &lt;/span&gt;&lt;span style="color: blue"&gt;THEN            INSERT &lt;/span&gt;&lt;span style="color: gray"&gt;(&lt;/span&gt;&lt;span style="color: teal"&gt;UserID&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UserName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UserFullName&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: blue"&gt;Password&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: blue"&gt;State&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;Email&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UpdateBy&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;UpdateTime&lt;/span&gt;&lt;span style="color: gray"&gt;,&lt;/span&gt;&lt;span style="color: teal"&gt;Remark&lt;/span&gt;&lt;span style="color: gray"&gt;)             &lt;/span&gt;&lt;span style="color: blue"&gt;VALUES &lt;/span&gt;&lt;span style="color: gray"&gt;(source.&lt;/span&gt;&lt;span style="color: teal"&gt;UserID&lt;/span&gt;&lt;span style="color: gray"&gt;,source.&lt;/span&gt;&lt;span style="color: teal"&gt;UserName&lt;/span&gt;&lt;span style="color: gray"&gt;,source.&lt;/span&gt;&lt;span style="color: teal"&gt;UserFullName&lt;/span&gt;&lt;span style="color: gray"&gt;,source.&lt;/span&gt;&lt;span style="color: blue"&gt;Password&lt;/span&gt;&lt;span style="color: gray"&gt;,source.&lt;/span&gt;&lt;span style="color: blue"&gt;State&lt;/span&gt;&lt;span style="color: gray"&gt;,source.&lt;/span&gt;&lt;span style="color: teal"&gt;Email&lt;/span&gt;&lt;span style="color: gray"&gt;,source.&lt;/span&gt;&lt;span style="color: teal"&gt;UpdateBy&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: magenta"&gt;GETDATE&lt;/span&gt;&lt;span style="color: gray"&gt;(),source.&lt;/span&gt;&lt;span style="color: teal"&gt;Remark&lt;/span&gt;&lt;span style="color: gray"&gt;)        &lt;/span&gt;&lt;span style="color: blue"&gt;OUTPUT &lt;/span&gt;&lt;span style="color: teal"&gt;deleted&lt;/span&gt;&lt;span style="color: gray"&gt;.*, &lt;/span&gt;&lt;span style="color: magenta"&gt;$action&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;inserted&lt;/span&gt;&lt;span style="color: gray"&gt;.* &lt;/span&gt;&lt;span style="color: blue"&gt;INTO &lt;/span&gt;&lt;span style="color: teal"&gt;#AnalysisForUpsertUser&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: blue"&gt;END&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: blue"&gt;GOEXEC &lt;/span&gt;&lt;span style="color: teal"&gt;UpsertUser @UserID &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;6887&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UserName &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'test6887'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UserFullName &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'编辑所有测试'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Password &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'YCRrXZzNrNU='&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;@State &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;1&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Email &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'test3@microsoft.com'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UpdateBy &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'PROGRAM'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Remark &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'可以查看所有项目，并可以修改.'&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: blue"&gt;EXEC &lt;/span&gt;&lt;span style="color: teal"&gt;UpsertUser @UserID &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;6889&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UserName &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'test6889'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UserFullName &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'编辑所有测试'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Password &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'YCRrXZzNrNU='&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;@State &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;1&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Email &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'test3@microsoft.com'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UpdateBy &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'PROGRAM'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Remark &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'可以查看所有项目，并可以修改.'&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: blue"&gt;EXEC &lt;/span&gt;&lt;span style="color: teal"&gt;UpsertUser @UserID &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;6882&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UserName &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'test6882'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UserFullName &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'编辑所有测试'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Password &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'YCRrXZzNrNU='&lt;/span&gt;&lt;span style="color: gray"&gt;,    &lt;/span&gt;&lt;span style="color: teal"&gt;@State &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;1&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Email &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'test3@microsoft.com'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@UpdateBy &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'PROGRAM'&lt;/span&gt;&lt;span style="color: gray"&gt;, &lt;/span&gt;&lt;span style="color: teal"&gt;@Remark &lt;/span&gt;&lt;span style="color: gray"&gt;= &lt;/span&gt;&lt;span style="color: red"&gt;N'可以查看所有项目，并可以修改.'&lt;/span&gt;&lt;span style="color: gray"&gt;;    &lt;/span&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;&lt;span style="color: gray"&gt;* &lt;/span&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;&lt;span style="color: teal"&gt;[MyDB]&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;[dbo]&lt;/span&gt;&lt;span style="color: gray"&gt;.&lt;/span&gt;&lt;span style="color: teal"&gt;[tbUser]&lt;/span&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;&lt;span style="color: gray"&gt;* &lt;/span&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;&lt;span style="color: teal"&gt;#AnalysisForUpsertUser&lt;/span&gt;&lt;span style="color: blue"&gt;GO&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: blue"&gt;DROP TABLE &lt;/span&gt;&lt;span style="color: teal"&gt;#AnalysisForUpsertUser&lt;/span&gt;&lt;span style="color: gray"&gt;;&lt;/span&gt;&lt;span style="color: blue"&gt;GO&lt;/span&gt;&lt;/pre&gt;&lt;p&gt;参考资料：&lt;/p&gt;&lt;p&gt;1、&lt;a href="http://technet.microsoft.com/zh-cn/library/bb510625.aspx"&gt;MERGE (Transact-SQL)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2、&lt;a href="http://technet.microsoft.com/zh-cn/library/bb522522.aspx"&gt;使用 MERGE 插入、更新和删除数据&lt;/a&gt;&lt;/p&gt;&lt;p&gt;3、&lt;a href="http://technet.microsoft.com/zh-cn/library/ms177564.aspx"&gt;OUTPUT 子句 (Transact-SQL)&lt;/a&gt;&lt;/p&gt;&lt;p&gt;4、&lt;a href="http://database.51cto.com/art/201009/225513.htm"&gt;判断SQL数据库中函数、存储过程等是否存在的方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;5、&lt;a href="http://stackoverflow.com/questions/2275946/t-sql-insert-or-update?answertab=active#tab-top"&gt;T-SQL Insert or update&lt;/a&gt;&lt;/p&gt;&lt;p&gt;6、&lt;a href="http://www.51aspx.com/CodeFile/Nearforums7/db/scripts/mssql.0027.alter-proc-templates-insert-or-update.sql.html"&gt;源码：《WebForm :Nearforums论坛 v7.0源码》源文件浏览&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/volnet/aggbug/2322701.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2012/01/15/2322701.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2012/01/03/2310787.html</id><title type="text">[FIM]两张表结构相同完美同步，如何做？ObjectAlreadyExistsException</title><summary type="text">假设有这么一个场景： 表1和表2，假设结构相同（这不是重点），两张表都以userId作为Key。目标是从表1的数据同步到表2。 实现：1、表1中有，表2中没有的数据，从表1同步到表2。 2、表1中有，表2中也有的数据，以表1的各个字段为准。 3、表1中没有，表2中有的数据，在表2中继续保留。做法1： 两个MA，分别以userId作为Anchor，DistinguishedName，并且字段分别映射...</summary><published>2012-01-02T21:03:00Z</published><updated>2012-01-02T21:03:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310787.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310787.html"/><content type="html">&lt;p&gt;假设有这么一个场景：&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 表1和表2，假设结构相同（这不是重点），两张表都以userId作为Key。目标是从表1的数据同步到表2。&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实现：1、表1中有，表2中没有的数据，从表1同步到表2。&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2、表1中有，表2中也有的数据，以表1的各个字段为准。&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3、表1中没有，表2中有的数据，在表2中继续保留。&lt;br&gt;&amp;nbsp;&lt;br&gt;做法1：&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 两个MA，分别以userId作为Anchor，DistinguishedName，并且字段分别映射。&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 为MV编写Provisioning代码，并设置选项为启用MVExtension。&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 同步顺序：表1 FullImport -&amp;gt; 表2 FullImport -&amp;gt; 表2 FullSync -&amp;gt; 表1 FullSync -&amp;gt; 表2 Export&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 存在问题：&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当表2中原本存在数据，且该数据已经在表1中存在的时候，该条记录将引发ObjectAlreadyExistsException异常，该条记录没有处理，但正确的行为是不是应该是Join？遇到这个情况（异常）正确的解法是什么？&lt;br&gt;&amp;nbsp;&lt;br&gt;做法2：（改进做法1）&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 考虑到有ObjectAlreadyExistsException异常，因此打算在Provisioning代码中将此异常抛弃，算作正常行为（因为此时对象确实存在），这样FIM应该按照自行逻辑进行Join操作？但是事实上，并非我所想（应该是理解有误），MV数据里面既有表1的数据，也有表2的数据，互不相干。&lt;br&gt;&lt;/p&gt; &lt;p&gt;解决方案：&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 当表1中的数据在表2种已经存在的时候（第一次同步）会抛出ObjectAlreadyExistException，应先关闭MV扩展（Tools-&amp;gt;Options-&amp;gt;清空第一个复选框），执行表2的FullImport-&amp;gt;FullSync，然后再打开MV扩展，执行&lt;a href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310785.html"&gt;正常同步&lt;/a&gt;（表1的FullSync）。&lt;/p&gt; &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在实际操作过程中，其实通常&lt;font color="#f79646"&gt;并不需要先关闭MV扩展&lt;/font&gt;，只需要将表2先做一次FullSync，这样表1再做FullSync的时候，就可以避免这个问题了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/volnet/aggbug/2310787.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310787.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2012/01/03/2310786.html</id><title type="text">[FIM]如何从A导入数据，同步到B，在A系统中删除数据，在B系统中删除数据</title><summary type="text">问题描述： 从A导入数据，同步到B，在A系统中删除数据，在B系统中删除数据。 前提：A、B已经完成一次FULL_IMPORT、FULL_SYNC，假设在A中的数据在B中的数据（不考虑过滤），都一一对应。 按照之前的思路，在A中删除一条记录后，通过FULL_IMPORT的时候，在CS_A中会删除记录A，通过FULL_SYNC，因为CS_B中的DATA_1仍然与MV保持Connected，因此包括MV...</summary><published>2012-01-02T20:57:00Z</published><updated>2012-01-02T20:57:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310786.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310786.html"/><content type="html">&lt;p&gt;&lt;b&gt;问题描述：&lt;/b&gt; &lt;p&gt;从A导入数据，同步到B，在A系统中删除数据，在B系统中删除数据。 &lt;p&gt;前提：A、B已经完成一次FULL_IMPORT、FULL_SYNC，假设在A中的数据在B中的数据（不考虑过滤），都一一对应。 &lt;p&gt;按照之前的思路，在A中删除一条记录后，通过FULL_IMPORT的时候，在CS_A中会删除记录A，通过FULL_SYNC，因为CS_B中的DATA_1仍然与MV保持Connected，因此包括MV在内一直都会存在该条记录。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201201/201201030456579218.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/volnet/201201/201201030456591038.png" width="656" height="333"&gt;&lt;/a&gt; &lt;p&gt;&lt;b&gt;解决方案：&lt;/b&gt; &lt;p&gt;1、 首先要让MV中把这条记录删除才可能导致B系统删除该数据。 &lt;p&gt;之所以出现以上现象的原因是在于MV的默认配置所决定的，右键对应的MV，“Configuration Object Deletion Rule…”，这是改变MV对象删除规则的。该设置默认为第一项，也就是考虑到所有MA都有可能成为源，当某MV对象与所有MA都断开联系后，才删除对应的MV，类似C++的引用计数。我们这里的需求是，一旦A中删除，就将其他系统中的该记录删除，因此这里就需要配置成第二项，任何一个被勾选的对象被删除之后，都删除该MV对象。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201201/201201030457031721.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="1" border="0" alt="1" src="http://images.cnblogs.com/cnblogs_com/volnet/201201/201201030457041523.png" width="1123" height="707"&gt;&lt;/a&gt;&amp;shy;&amp;shy;&amp;shy;&amp;shy;&amp;shy;  &lt;p&gt;2、 完成了第一步还不够的，因为它只提到了删除MV中的对象，但并不会删除CS_B中的对象，因此这时CS_B中的对象是孤立无援的，在FIM中是disconnected object，这样的对象会在下次同步的时候，继续参与规则讨论。因此我们要把这种没有户口的对象删掉。做法就是在对应的MA的配置中，配置“Configure Deprovisioning”，指示在一个CS对象与MV失去联系后的行为，选择第三项“Stage a delete on the object for the next export run”，该选项表明在失去联系后在接下来的export操作执行的时候删除数据。这里会删除connected data source中的数据也就是DB_A，但是不会删除CS_A中的数据，因为这一步操作在下一次FULL_IMPORT的时候是会被处理掉的。 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201201/2012010304570814.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="2" border="0" alt="2" src="http://images.cnblogs.com/cnblogs_com/volnet/201201/201201030457106436.png" width="1123" height="707"&gt;&lt;/a&gt; &lt;p&gt;3、 执行FULL_SYNC、EXPORT，数据依次从MV、DB_B中删除，检查DB_A，确实删掉了，执行B.FULL_IMPORT，CS_B中的数据也删除了，至此完成了这条记录的整个删除生命周期。   &lt;img src="http://www.cnblogs.com/volnet/aggbug/2310786.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310786.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2012/01/03/2310785.html</id><title type="text">[FIM]如何通过Provision Code来向另一张表新增数据（附错误实例）</title><summary type="text">最近在做FIM的时候，发现Provisioning的项无法被添加了，然后发现自己在重构的时候，出现了一点儿画蛇添足。 首先说一下为什么要做Provisioning，原因是这样的，在FIM同步里面，假设有一个数据源，另一个目标数据源，目的是从一个数据源将数据导入到目标数据源中。默认情况下，FIM只处理两边都存在的数据，假设有这样两个数据： 表名：DB1.Table1 数据： aUser, aUser...</summary><published>2012-01-02T20:53:00Z</published><updated>2012-01-02T20:53:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310785.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310785.html"/><content type="html">&lt;p&gt;最近在做FIM的时候，发现Provisioning的项无法被添加了，然后发现自己在重构的时候，出现了一点儿画蛇添足。&lt;/p&gt; &lt;p&gt;首先说一下为什么要做Provisioning，原因是这样的，在FIM同步里面，假设有一个数据源，另一个目标数据源，目的是从一个数据源将数据导入到目标数据源中。默认情况下，FIM只处理两边都存在的数据，假设有这样两个数据：&lt;/p&gt; &lt;p&gt;表名：DB1.Table1&lt;/p&gt; &lt;p&gt;数据：&lt;/p&gt; &lt;p&gt;aUser, aUserName, aMobile&lt;/p&gt; &lt;p&gt;bUser, bUserName, bMobile&lt;/p&gt; &lt;p&gt;表名：DB2.Table2&lt;/p&gt; &lt;p&gt;bUser, bUserName1, bMobile1&lt;/p&gt; &lt;p&gt;cUser, cUserName1, cMobile1&lt;/p&gt; &lt;p&gt;默认情况下，两张表中，只有INNER JOIN的关系，也就是说bUser被关联了。这样在同步的时候，bUserName将会覆盖bUserName1，bMobile将会覆盖bMobile1，而aUser不会加入到DB2.Table2中。&lt;/p&gt; &lt;p&gt;而在实际的情况通常是DB1.Table1表代表一个类似HR的系统，新增一个员工的时候，我们希望新来的员工会出现在所有的第三方系统中，因此这个aUser就需要被强加到DB2.Table2中。&lt;/p&gt; &lt;p&gt;这需要我们为FIM启用Provisoion代码：（Tools-&amp;gt;Options-&amp;gt;Enable metaverse rules extension + Enable Provisioning Rules Extension）&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201201/201201030452551918.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/volnet/201201/201201030452565407.png" width="655" height="504"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;然后我们在MVExtension的代码中实现接口void IMVSynchronization.Provision(MVEntry mventry)。&lt;/p&gt; &lt;p&gt;在我们进行同步的时候，我们需要先将两个数据源的数据都导入（Import）各自的CS中，为了区分不同的数据源的数据，我们为他们分别指定了dataSource的属性，这里我们用一个常量来表示。&lt;/p&gt; &lt;p&gt;当我们执行哪个MA同步的时候，这个dataSource的值（mventry[“dataSource”]）就会是对应MA设置的那个常量，我们也就因此可以在MVExtensions代码中区分不同数据的来源了。&lt;/p&gt; &lt;p&gt;运行各个MA的时候，各个MA所对应的CS数据会被逐条通过mventry传入MVExtension中进行Provision。也就是说当我们执行DB1.Table1_MA的FULL_SYNC的时候，aUser和bUser都会被导入。当bUser导入的时候，我们可以想象，这个时候，如果我们不做任何事情，就离开这个Provision，按照默认的配置，Join-Rules将被激活，DB1.Table1_MA中的bUser将和DB2.Table2_MA中的bUser建立关联。于是会有一条Join-Rules：&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201201/201201030452577849.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/volnet/201201/20120103045257847.png" width="567" height="112"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;那么aUser呢？如果不做Provisioning，它将被忽略。这个时候，aUser的ConnectedMAs中只有DB1.Table1_MA，而没有DB2.Table2_MA，因为它还不曾与之关联。&lt;/p&gt; &lt;p&gt;下面是一段标准的将DB1.Table1_MA中的aUser添加到DB2.Table2_MA的方法，当遇到aUser的mventry的时候，我们取得ConnectedMAs，然后将它添加到DB2.Table2_MA的CS中，并创建Connector。&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: blue"&gt;private void &lt;/span&gt;ProvisioningFIMSys1User1(&lt;span style="color: #2b91af"&gt;MVEntry &lt;/span&gt;mventry){    &lt;span style="color: blue"&gt;try    &lt;/span&gt;{        &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: #a31515"&gt;"-----ProvisioningFIMSys1User1 start-----"&lt;/span&gt;);        &lt;span style="color: #2b91af"&gt;ConnectedMA &lt;/span&gt;MA = &lt;span style="color: blue"&gt;null&lt;/span&gt;;        &lt;span style="color: blue"&gt;if &lt;/span&gt;(TryGetMA(mventry, &lt;span style="color: #2b91af"&gt;MAs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;FIMSys1_User1_MA&lt;/span&gt;.NAME, &lt;span style="color: blue"&gt;out &lt;/span&gt;MA))        {            &lt;span style="color: blue"&gt;string &lt;/span&gt;dn = &lt;span style="color: blue"&gt;string&lt;/span&gt;.Empty;            &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"MA.Connectors.Count == {0}"&lt;/span&gt;, MA.Connectors.Count));            &lt;span style="color: blue"&gt;if &lt;/span&gt;(MA.Connectors.Count == 0) &lt;span style="color: green"&gt;// create new one            &lt;/span&gt;{                &lt;span style="color: #2b91af"&gt;CSEntry &lt;/span&gt;csEntry = &lt;span style="color: blue"&gt;null&lt;/span&gt;;                &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"mventry[\"{0}\"].IsPresent = {1}"&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MVs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.accountName, mventry[&lt;span style="color: #2b91af"&gt;MVs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.accountName].IsPresent));                &lt;span style="color: blue"&gt;if &lt;/span&gt;(mventry[&lt;span style="color: #2b91af"&gt;MVs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.accountName].IsPresent)                {                    dn = mventry[&lt;span style="color: #2b91af"&gt;MVs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.accountName].StringValue;                    &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: blue"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515"&gt;"dn.0 = {0}"&lt;/span&gt;, dn));                    csEntry = MA.Connectors.StartNewConnector(&lt;span style="color: #2b91af"&gt;MVs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;.NAME);                    &lt;span style="color: green"&gt;// create DN for csEntry.                    &lt;/span&gt;csEntry.DN = MA.CreateDN(dn);                    csEntry.CommitNewConnector();                    csEntry[&lt;span style="color: #2b91af"&gt;MAs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;FIMSys1_User1_MA&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.UniqueID].StringValue = mventry[&lt;span style="color: #2b91af"&gt;MVs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.accountName].StringValue;                    csEntry[&lt;span style="color: #2b91af"&gt;MAs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;FIMSys1_User1_MA&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.UserName].StringValue = mventry[&lt;span style="color: #2b91af"&gt;MVs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.displayName].StringValue;                    csEntry[&lt;span style="color: #2b91af"&gt;MAs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;FIMSys1_User1_MA&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.Mobile].StringValue = mventry[&lt;span style="color: #2b91af"&gt;MVs&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;.&lt;span style="color: #2b91af"&gt;Attributes&lt;/span&gt;.mobile].StringValue;                    &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: #a31515"&gt;"-----csEntry.CommitNewConnector(); -----"&lt;/span&gt;);                }            }        }    }    &lt;span style="color: blue"&gt;catch &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Exception &lt;/span&gt;ex)    {        &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: #a31515"&gt;"Exception:" &lt;/span&gt;+ ex.ToString());        &lt;span style="color: blue"&gt;throw &lt;/span&gt;ex;    }    &lt;span style="color: blue"&gt;finally    &lt;/span&gt;{        &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: #a31515"&gt;"-----ProvisioningFIMSys1User1 end-----"&lt;/span&gt;);    }}&lt;/pre&gt;&lt;p&gt;这个TryGetMA是一个用来获取MA的方法：&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: blue"&gt;public bool &lt;/span&gt;TryGetMA(&lt;span style="color: #2b91af"&gt;MVEntry &lt;/span&gt;mventry, &lt;span style="color: blue"&gt;string &lt;/span&gt;MAname, &lt;span style="color: blue"&gt;out &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ConnectedMA &lt;/span&gt;ma){    ma = &lt;span style="color: blue"&gt;null&lt;/span&gt;;    &lt;span style="color: blue"&gt;bool &lt;/span&gt;result = &lt;span style="color: blue"&gt;false&lt;/span&gt;;    &lt;span style="color: blue"&gt;if &lt;/span&gt;(mventry == &lt;span style="color: blue"&gt;null&lt;/span&gt;)        result = &lt;span style="color: blue"&gt;false&lt;/span&gt;;    &lt;span style="color: blue"&gt;else    &lt;/span&gt;{        ma = mventry.ConnectedMAs[MAname];        &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: #a31515"&gt;"GET MA: " &lt;/span&gt;+ MAname);        &lt;span style="color: blue"&gt;if &lt;/span&gt;(ma == &lt;span style="color: blue"&gt;null&lt;/span&gt;)            result = &lt;span style="color: blue"&gt;false&lt;/span&gt;;        &lt;span style="color: blue"&gt;else            &lt;/span&gt;result = &lt;span style="color: blue"&gt;true&lt;/span&gt;;    }    &lt;span style="color: blue"&gt;return &lt;/span&gt;result;}&lt;/pre&gt;&lt;p&gt;下面看看我做了什么蠢事，在之前它是这样写的（&lt;strong&gt;&lt;font color="#ff0000"&gt;不正确&lt;/font&gt;&lt;/strong&gt;）：&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: blue"&gt;public bool &lt;/span&gt;TryGetMA(&lt;span style="color: #2b91af"&gt;MVEntry &lt;/span&gt;mventry, &lt;span style="color: blue"&gt;string &lt;/span&gt;MAname, &lt;span style="color: blue"&gt;out &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ConnectedMA &lt;/span&gt;ma){    ma = &lt;span style="color: blue"&gt;null&lt;/span&gt;;    &lt;span style="color: blue"&gt;bool &lt;/span&gt;result = &lt;span style="color: blue"&gt;false&lt;/span&gt;;    &lt;span style="color: blue"&gt;if&lt;/span&gt;(mventry == &lt;span style="color: blue"&gt;null&lt;/span&gt;)        result = &lt;span style="color: blue"&gt;false&lt;/span&gt;;    &lt;span style="color: blue"&gt;else    &lt;/span&gt;{        &lt;font color="#ff0000"&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(ExistsMA(mventry, MAname))&lt;/font&gt;        {            ma = mventry.ConnectedMAs[MAname];            &lt;span style="color: #2b91af"&gt;Logger&lt;/span&gt;.Get().Write(&lt;span style="color: #a31515"&gt;"GET MA: " &lt;/span&gt;+ MAname);        }        &lt;span style="color: blue"&gt;if&lt;/span&gt;(ma == &lt;span style="color: blue"&gt;null&lt;/span&gt;)            result = &lt;span style="color: blue"&gt;false&lt;/span&gt;;        &lt;span style="color: blue"&gt;else            &lt;/span&gt;result = &lt;span style="color: blue"&gt;true&lt;/span&gt;;    }    &lt;span style="color: blue"&gt;return &lt;/span&gt;result;}&lt;/pre&gt;&lt;p&gt;仔细看一下这个ExistsMA：&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: blue"&gt;private bool &lt;/span&gt;ExistsMA(&lt;span style="color: #2b91af"&gt;MVEntry &lt;/span&gt;mventry, &lt;span style="color: blue"&gt;string &lt;/span&gt;MAname){    &lt;span style="color: blue"&gt;if &lt;/span&gt;(mventry != &lt;span style="color: blue"&gt;null &lt;/span&gt;&amp;amp;&amp;amp; mventry.ConnectedMAs.Count &amp;gt; 0)    {        &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;ConnectedMA &lt;/span&gt;ma &lt;span style="color: blue"&gt;in &lt;/span&gt;mventry.ConnectedMAs)        {            &lt;span style="color: blue"&gt;if &lt;/span&gt;(ma.Name == MAname) &lt;span style="color: blue"&gt;return true&lt;/span&gt;;        }    }    &lt;span style="color: blue"&gt;return false&lt;/span&gt;;}&lt;/pre&gt;&lt;p&gt;倒不是这个方法抛出了异常。而是因为当这个mventry在还没有与该MA建立关联的时候，我就试图去寻找它，当然返回的结果一定是false，于是我永远都无法获得这个MA。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/volnet/aggbug/2310785.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2012/01/03/2310785.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2011/12/01/2270079.html</id><title type="text">TFS导致的访问权限的问题</title><summary type="text">遇到读取权限的问题，TFS会对文件做只读处理，这样在ASP.NET Development Server使用FileMode.Open，的时候，会出现以下异常。 “/”应用程序中的服务器错误。 对路径“E:\MyCSharpProject\Projects\tfs.10.0.6.41\Configs\MenuItems.xml”的访问被拒绝。说明: 执行当前 Web 请求期间，出现未经处理的...</summary><published>2011-12-01T02:06:00Z</published><updated>2011-12-01T02:06:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2011/12/01/2270079.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2011/12/01/2270079.html"/><content type="html">&lt;p&gt;遇到读取权限的问题，TFS会对文件做只读处理，这样在ASP.NET Development Server使用FileMode.Open，的时候，会出现以下异常。&lt;/p&gt; &lt;p&gt;&lt;strong&gt;“/”应用程序中的服务器错误。  &lt;hr size="1" width="100%"&gt; &lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;&lt;i&gt;对路径“E:\MyCSharpProject\Projects\tfs.10.0.6.41\Configs\MenuItems.xml”的访问被拒绝。&lt;/i&gt;&lt;/strong&gt;&lt;/p&gt;&lt;b&gt;说明: &lt;/b&gt;执行当前 Web 请求期间，出现未经处理的异常。请检查堆栈跟踪信息，以了解有关该错误以及代码中导致错误的出处的详细信息。 &lt;br&gt;&lt;b&gt;异常详细信息: &lt;/b&gt;System.UnauthorizedAccessException: 对路径“E:\MyCSharpProject\Projects\tfs.10.0.6.41\Configs\MenuItems.xml”的访问被拒绝。 &lt;br&gt;ASP.NET 无权访问所请求的资源。请考虑对 ASP.NET 请求标识授予访问此资源的权限。ASP.NET 有一个在应用程序没有模拟时使用的基进程标识(通常，在 IIS 5 上为 {MACHINE}\ASPNET，在 IIS 6 和 IIS 7 上为网络服务，在 IIS 7.5 上为配置的应用程序池标识)。如果应用程序正在通过 &amp;lt;identity impersonate="true"/&amp;gt; 模拟，则标识将为匿名用户(通常为 IUSR_MACHINENAME)或经过身份验证的请求用户。 &lt;br&gt;要将 ASP.NET 访问权限授予某个文件，请在资源管理器中右击该文件，选择“属性”，然后选择“安全”选项卡。单击“添加”添加适当的用户或组。突出显示 ASP.NET 帐户，选中所需访问权限对应的框。&lt;br&gt;&lt;b&gt;源错误:&lt;/b&gt; &lt;p&gt;&lt;code&gt;&lt;pre&gt;行 15:             XmlSerializer serializer = new XmlSerializer(typeof(T));行 16:             // using (FileStream fileStream = new FileStream(xmlFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))行 17:             &lt;font color="#ff0000"&gt;using (FileStream fileStream = new FileStream(xmlFilePath, FileMode.Open))&lt;/font&gt;行 18:             {行 19:                 return serializer.Deserialize(fileStream) as T;&lt;/pre&gt;&lt;/code&gt;&lt;p&gt;&lt;b&gt;源文件: &lt;/b&gt;E:\MyCSharpProject\Projects\tfs.10.0.6.41\Utility\XmlHelper.cs&lt;b&gt; 行: &lt;/b&gt;17 &lt;p&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;解决方案：&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;将代码修改成：&lt;/p&gt;&lt;p&gt;using (FileStream fileStream = new FileStream(xmlFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))&lt;/p&gt;&lt;p&gt;即可。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/volnet/aggbug/2270079.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2011/12/01/2270079.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2011/10/16/log4net-custom-layout.html</id><title type="text">Log4net如何增加自定义字段（三种方式）</title><summary type="text">本文所提及的三种方式，不是原创，方法都来自互联网，出处不详。 谈到这个开源日志工具，应该大家都耳熟能详，从http://logging.apache.org/log4net/可以下载到它。 在官方提供的关于数据库插入日志的文档中，我们能看到，我们可以在Message中写入各种各样的文本，对于logger.Info(message, exception)，如何才能加入自定义的内容呢？如果我们都只是把...</summary><published>2011-10-16T14:14:00Z</published><updated>2011-10-16T14:14:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2011/10/16/log4net-custom-layout.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2011/10/16/log4net-custom-layout.html"/><content type="html">&lt;p&gt;本文所提及的三种方式，不是原创，方法都来自互联网，出处不详。&lt;/p&gt; &lt;p&gt;谈到这个开源日志工具，应该大家都耳熟能详，从&lt;a title="http://logging.apache.org/log4net/" href="http://logging.apache.org/log4net/"&gt;http://logging.apache.org/log4net/&lt;/a&gt;可以下载到它。&lt;/p&gt; &lt;p&gt;在官方提供的关于数据库插入日志的文档中，我们能看到，我们可以在Message中写入各种各样的文本，对于logger.Info(message, exception)，如何才能加入自定义的内容呢？如果我们都只是把他们写入Message，将不便于日后查找。举个例子，比如我们对登录有个日志，对退出也有个日志，如何才能区分二者呢，这时候我们希望对我们的Action有个记录，可能就需要一个Action字段。样子可能是：&lt;/p&gt; &lt;p&gt;logger.Info(actionName, message, exception)。&lt;/p&gt; &lt;p&gt;log4net是开源项目，但是文档并不详细，其实网上对这个的研究已经有很多了，也可以很方便搜到，本文就把它们做一个总结放在一起。&lt;/p&gt; &lt;p&gt;其实对于以上类型的日志，只是Log4net项目的一个日志类型，叫做PatternLayout，就是根据配置文件中提到的Pattern进行输出，让我们瞅一眼配置文件（该配置文件来自官方文档&lt;a title="http://logging.apache.org/log4net/release/config-examples.html" href="http://logging.apache.org/log4net/release/config-examples.html"&gt;http://logging.apache.org/log4net/release/config-examples.html&lt;/a&gt;），被指定为PatternLayout的方法，在PatternParser类中被识别，比如有个字符串为“%message%newline --- hello world %date”，PatternParser类的目的就是识别出其中的%message, %newline, %date，具体怎么做到的，请查看PatternParser类。除了%message之外，还有选项（option）的概念，%property{XXX}就是用到了这个特性，也是在PatternParser.ParseInternal中进行演算的。&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;appender &lt;/span&gt;&lt;span style="color: red"&gt;name&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;AdoNetAppender&lt;/span&gt;" &lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;log4net.Appender.AdoNetAppender&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;bufferSize &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;100&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;connectionType &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;connectionString &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;commandText &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameterName &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;@log_date&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dbType &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;DateTime&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;log4net.Layout.RawTimeStampLayout&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameterName &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;@thread&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dbType &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;String&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;size &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;255&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;log4net.Layout.PatternLayout&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;%thread&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameterName &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;@log_level&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dbType &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;String&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;size &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;50&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;log4net.Layout.PatternLayout&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;%level&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameterName &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;@logger&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dbType &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;String&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;size &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;255&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;log4net.Layout.PatternLayout&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;%logger&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameterName &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;@message&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dbType &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;String&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;size &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;4000&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;log4net.Layout.PatternLayout&lt;/span&gt;"&lt;span style="color: blue"&gt;&amp;gt;            &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;conversionPattern &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;%message&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;    &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameterName &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;@exception&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;dbType &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;String&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;size &lt;/span&gt;&lt;span style="color: red"&gt;value&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;2000&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;        &amp;lt;&lt;/span&gt;&lt;span style="color: #a31515"&gt;layout &lt;/span&gt;&lt;span style="color: red"&gt;type&lt;/span&gt;&lt;span style="color: blue"&gt;=&lt;/span&gt;"&lt;span style="color: blue"&gt;log4net.Layout.ExceptionLayout&lt;/span&gt;" &lt;span style="color: blue"&gt;/&amp;gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;parameter&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #a31515"&gt;appender&lt;/span&gt;&lt;span style="color: blue"&gt;&amp;gt;                    &lt;/span&gt;&lt;/pre&gt;&lt;p&gt;其中layout部分如果是指定PatternLayout的，则是本文所要涉及的重点，比如%message。&lt;/p&gt;&lt;p&gt;方法1，通过log4net提供的ThreadContext，设置属性的值，详见Info1部分。&lt;/p&gt;&lt;p&gt;方法2，通过PatternLayout的AddConvert，增加用于处理扩展部分（系统预制了一些包括%date、%message），此处做了一个通用的XPatternCustomLayout，用来截取%property{XXX}款式的匹配转换，详见Info2部分。&lt;/p&gt;&lt;p&gt;方法3，通过做一个类似PatternLayout的机制来实现，缺点也是比较明显的，需要针对每一个%XXXX做预制，这样的话，如果需要临时再增加，就比较困难了。但该方法有助于理解log4net PatternLayout的机制。&lt;/p&gt;&lt;p&gt;具体的内容就不在这里详述了，代码这玩意儿需要跑跑才清楚。&lt;/p&gt;&lt;p&gt;要运行代码，本文使用了本地数据库（一个随着压缩包提供的数据库文件，sdf，用到System.Data.SqlServerCe4.0，随Microsoft Visual Studio 2010提供），可以更换成SQLServer等标准数据库来使用，注意各配置文件内的描述。&lt;/p&gt;&lt;p&gt;针对方法1、2、3分别提供了配置文件log4net1.xml、log4net2.xml、log4net3.xml，只需要在Web.config文件中对应的字眼修改即可。&lt;/p&gt;&lt;p&gt;另外本地数据库需要指定路径，共4处需要修改，Web.config、log4net1.xml、log4net2.xml、log4net3.xml。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码下载：&lt;/p&gt;&lt;p&gt;&lt;a href="http://files.cnblogs.com/volnet/log4net.CustomLayout.zip"&gt;本地下载&lt;/a&gt; SVN（&lt;em&gt;svn checkout http://v-labs.googlecode.com/svn/trunk/log4net v-labs-read-only&lt;/em&gt; ）&lt;/p&gt;&lt;img src="http://www.cnblogs.com/volnet/aggbug/2214384.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2011/10/16/log4net-custom-layout.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2011/08/22/2149048.html</id><title type="text">安装MySQL的时候，无法删除服务</title><summary type="text">安装MySQL的时候，无法删除服务，在Start Service的时候，出错，Could not start the service MySQL. Error:0 到控制面板里查看服务，存在MySQL服务（名字可能是别的比如MySQL4，具体看安装时候的配置）。 右键启动，出现“在 本地计算机 无法启动MySQL服务”，“错误1067：进程意外终止。” 这个问题通常是因为当前实例已经存在，并且...</summary><published>2011-08-22T03:17:00Z</published><updated>2011-08-22T03:17:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2011/08/22/2149048.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2011/08/22/2149048.html"/><content type="html">&lt;p&gt;安装MySQL的时候，无法删除服务，在Start Service的时候，出错，Could not start the service MySQL. Error:0 &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201108/201108221116451444.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image" border="0" alt="Image" src="http://images.cnblogs.com/cnblogs_com/volnet/201108/201108221116454999.png" width="366" height="141"&gt;&lt;/a&gt; &lt;p&gt;到控制面板里查看服务，存在MySQL服务（名字可能是别的比如MySQL4，具体看安装时候的配置）。 &lt;p&gt;右键启动，出现“在 本地计算机 无法启动MySQL服务”，“错误1067：进程意外终止。” &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201108/201108221116475324.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="Image(1)" border="0" alt="Image(1)" src="http://images.cnblogs.com/cnblogs_com/volnet/201108/201108221116487177.png" width="262" height="100"&gt;&lt;/a&gt; &lt;p&gt;这个问题通常是因为当前实例已经存在，并且MySQL不是全新安装（有垃圾文件未清理，卸载也一样）。 &lt;p&gt;步骤1：卸载MySQL。 &lt;p&gt;步骤2：删除服务：运行命令行，cmd，&lt;strong&gt;sc delete mysql&lt;/strong&gt;，其中mysql为服务的名称。 &lt;p&gt;步骤3：删除垃圾文件：Windows7下路径是&lt;a href="file:///C:/ProgramData/MySQL"&gt;C:\ProgramData\MySQL&lt;/a&gt;，直接删除即可。 &lt;p&gt;步骤4：重新安装MySQL。 &lt;img src="http://www.cnblogs.com/volnet/aggbug/2149048.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2011/08/22/2149048.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/volnet/archive/2011/08/04/2127186.html</id><title type="text">关于EXCEL下载后无法打开的问题</title><summary type="text">通过流的下载的方式下载文件的需求很普遍，也基本不太会错，但最近用VPN（这套系统用的是网页反代的方式来实现），下载的Excel却无法打开，仔细检查后通过增加ContentType，修正了这个问题。代码分享如下：byte[] bytes = System.IO.File.ReadAllBytes(path); ms.Write(bytes, 0, bytes.Length); Response.A...</summary><published>2011-08-04T04:54:00Z</published><updated>2011-08-04T04:54:00Z</updated><author><name>volnet（可以叫我大V）</name><uri>http://www.cnblogs.com/volnet/</uri></author><link rel="alternate" href="http://www.cnblogs.com/volnet/archive/2011/08/04/2127186.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/volnet/archive/2011/08/04/2127186.html"/><content type="html">&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/volnet/201108/201108041254243225.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/volnet/201108/201108041254269835.png" width="957" height="148"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;通过流的下载的方式下载文件的需求很普遍，也基本不太会错，但最近用VPN（这套系统用的是网页反代的方式来实现），下载的Excel却无法打开，仔细检查后通过增加ContentType，修正了这个问题。代码分享如下：&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: blue"&gt;byte&lt;/span&gt;[] bytes = System.IO.&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.ReadAllBytes(path);                    ms.Write(bytes, 0, bytes.Length);                    Response.AddHeader(&lt;span style="color: #a31515"&gt;"Content-Disposition"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;"attachment;filename=" &lt;/span&gt;+ Server.UrlPathEncode(displayFileName));                    &lt;span style="color: blue"&gt;string &lt;/span&gt;contentType = GetContentType(path);                    &lt;span style="color: blue"&gt;if &lt;/span&gt;(!&lt;span style="color: blue"&gt;string&lt;/span&gt;.IsNullOrEmpty(contentType))                    {                        Response.ContentType = contentType;                    }                    Response.BinaryWrite(ms.ToArray());                    Response.End();&lt;/pre&gt;&lt;p&gt;其中ContentType部分如下：&lt;/p&gt;&lt;pre class="gc-code"&gt;&lt;span style="color: blue"&gt;public const string &lt;/span&gt;ExcelContentType_97Or2003 = &lt;span style="color: #a31515"&gt;"application/vnd.ms-excel"&lt;/span&gt;;&lt;span style="color: blue"&gt;public const string &lt;/span&gt;ExcelContentType_2007 = &lt;span style="color: #a31515"&gt;"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"&lt;/span&gt;; &lt;span style="color: blue"&gt;public string &lt;/span&gt;GetContentType(&lt;span style="color: blue"&gt;string &lt;/span&gt;path){    &lt;span style="color: blue"&gt;string &lt;/span&gt;extension = &lt;span style="color: #2b91af"&gt;Path&lt;/span&gt;.GetExtension(path).ToLower();    &lt;span style="color: blue"&gt;if &lt;/span&gt;(extension.EndsWith(&lt;span style="color: #a31515"&gt;"xlsx"&lt;/span&gt;) || extension.EndsWith(&lt;span style="color: #a31515"&gt;"xlsm"&lt;/span&gt;))    {        &lt;span style="color: blue"&gt;return &lt;/span&gt;ExcelContentType_2007;    }    &lt;span style="color: blue"&gt;else if &lt;/span&gt;(extension.EndsWith(&lt;span style="color: #a31515"&gt;"xls"&lt;/span&gt;))    {        &lt;span style="color: blue"&gt;return &lt;/span&gt;ExcelContentType_97Or2003;    }    &lt;span style="color: blue"&gt;return string&lt;/span&gt;.Empty;}&lt;/pre&gt;&lt;img src="http://www.cnblogs.com/volnet/aggbug/2127186.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/volnet/archive/2011/08/04/2127186.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
