<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_快速Web2.0开发框架</title><subtitle type="text">以技术为导向、关注技术中的每一个细节群一群二已满，请新来用户加群三：175093952</subtitle><id>http://feed.cnblogs.com/blog/u/66662/rss</id><updated>2012-02-10T03:38:59Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/66662/rss"/><entry><id>http://www.cnblogs.com/maoyong/articles/2345089.html</id><title type="text">为什么IIS7/7.5的Gzip不起作用</title><summary type="text">我在IIS7配置Gzip压缩一文中介绍了IIS7对于gzip压缩的相关配置，以及默认情况下，由于IIS7将Javascript配置为动态压缩（Dynamic Compression），受CPU还有其他因素的影响，不一定会返回gzip压缩后的内容。 但是前阵子发现，尽管将Javascript配置成了静态压缩，请求Javascript脚本文件的时候偶尔还是会出现没有gzip的情况。这篇文章和大家分享一下我遇到的这个问题以及解决这个问题的过程和思路，希望对大家有所帮助。“随机”的gzip行为问题的症状非常简单而又奇怪。有时候连续访问脚本多次，刚开始没有gzip，再次访问又有gzip。等过好一会再去访</summary><published>2012-02-10T03:39:00Z</published><updated>2012-02-10T03:39:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/articles/2345089.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/articles/2345089.html"/><content type="html">&lt;p&gt;我在&lt;a title="IIS7配置Gzip压缩" href="http://www.imkevinyang.com/2009/06/iis7%E9%85%8D%E7%BD%AEgzip%E5%8E%8B%E7%BC%A9.html" target="_blank"&gt;IIS7配置Gzip压缩&lt;/a&gt;一文中介绍了IIS7对于gzip压缩的相关配置，以及默认情况下，由于IIS7将Javascript配置为动态压缩（Dynamic Compression），受CPU还有其他因素的影响，不一定会返回gzip压缩后的内容。 但是前阵子发现，尽管将Javascript配置成了静态压缩，请求Javascript脚本文件的时候偶尔还是会出现没有gzip的情况。这篇文章和大家分享一下我遇到的这个问题以及解决这个问题的过程和思路，希望对大家有所帮助。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;随机&amp;rdquo;的gzip行为&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;问题的症状非常简单而又奇怪。有时候连续访问脚本多次，刚开始没有gzip，再次访问又有gzip。等过好一会再去访问，gzip又没有了。有的时候则是无论怎么访问都不给我返回gzip后的响应。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;问题的分析&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;排除了CPU负载过大的因素，因为发现当深夜机器CPU负载正常的时候也一样出现这样的问题。&lt;/p&gt;&#xD;
&lt;p&gt;在系统日志中发现以下Warning条目，引起了我的注意：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;Warning 2010/4/13 6:32:41 IIS-W3SVC-WP 2264 None&lt;/p&gt;&#xD;
&lt;p&gt;The directory specified for caching compressed content C:\inetpub\temp\IIS Temporary Compressed Files\XXX is invalid. Static compression is being disabled.&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;通过日志筛选，发现从09年7月份就一直出现这样的Warning了，而且出现频率是隔1-3天左右。&lt;/p&gt;&#xD;
&lt;p&gt;这个文件夹是IIS用于存放压缩后的静态内容缓存。按照上面日志的意思，是说这个目录出了问题，导致静态压缩功能被禁用了。但是我明明可以访问这个文件夹，而且里头确实还放着缓存的脚本。&lt;/p&gt;&#xD;
&lt;p&gt;IIS论坛上提这个问题的帖子很多，但最终得到解答的没看到。不过其中一些人的回复倒是给了我不少思路。其中有人说道可能是文件夹权限问题，我看了看那个压缩缓存目录，上面的权限的确是应用程序池的身份，没有问题。使用ProcessMonitor监测了w3wp.exe进程的活动情况，没有看到这个进程在访问文件系统时出现错误。&lt;/p&gt;&#xD;
&lt;p&gt;后来在网上看到了&lt;a href="http://www.ksingla.net/"&gt;Kanwaljeet Singla&lt;/a&gt;（IIS开发团队成员）的一篇文章，介绍IIS7相比IIS6在压缩模块上的改动，文中提到了一点，&lt;strong&gt;&lt;span style="color: #008000;"&gt;从IIS7开始，为了降低开销，IIS只对那些频繁访问的静态资源启用压缩&lt;/span&gt;&lt;/strong&gt;。通过IIS7新引入的两个配置选项frequentHitThreshold和frequentHitTimePeriod，我们可以设定，当某个资源在frequentHitTimePeriod时间内被连续访问了frequentHitThreshold次，那么就算是&amp;ldquo;频繁访问&amp;rdquo;了。默认的配置是10秒钟内连续对同一Url发起2次请求就算此Url对应的资源属于频繁访问的资源，IIS服务器就会对其进行压缩，然后丢入缓存目录。&lt;/p&gt;&#xD;
&lt;p&gt;这也就解释了为什么有时候第一次请求脚本的时候，服务器没有返回gzip压缩后的内容，而是等你接着下一次访问的时候才会返回gzip响应。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="连续访问Javascript才会gzip" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/IIS77.5Javascript_FC1F/image_ae7ff028-1277-4e94-9aa3-5ebbccc0f781.png" alt="连续访问Javascript才会gzip" width="494" height="85" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;但是按照这篇文章提到的IIS的设计理念，一旦资源被压缩缓存过，那么以后就不会再应用这个&amp;ldquo;频繁访问&amp;rdquo;的检测逻辑了，因为毕竟已经没有压缩开销了。而我非常确信这个脚本已经被缓存在服务器硬盘上了，那为什么我过一段时间再去访问的时候还是没有gzip呢？&lt;/p&gt;&#xD;
&lt;p&gt;在IIS7中有一个功能，叫做失败请求跟踪（Failed request tracing），允许技术人员跟踪那些出问题的请求在IIS内部都发生了什么事。为了揭开我的疑问，我对此网站开启了失败请求跟踪。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;IIS7的Bug？！&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;打开IIS7管理器，定位到相应的网站右侧的操作面板，开启&amp;ldquo;失败请求跟踪&amp;rdquo;。默认跟踪日志文件是存放在%SystemDrive%\inetpub\logs\FailedReqLogFiles目录中。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/IIS77.5Javascript_FC1F/image_226f6eb9-ab5a-4561-936f-a77415ca7f47.png" alt="image" width="138" height="93" border="0" /&gt; &lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/IIS77.5Javascript_FC1F/image_8e423917-a471-4919-82d8-ffe4d73e6fe0.png" alt="image" width="192" height="120" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后在功能面板中找到&amp;ldquo;失败请求跟踪规则&amp;rdquo;进行配置：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/IIS77.5Javascript_FC1F/image_dde6dba5-4630-49e7-af4c-74f032fb6e76.png" alt="image" width="202" height="128" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;为了防止其他脚本的干扰，在这里我限定了只跟踪测试的脚本&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/IIS77.5Javascript_FC1F/image_feddd15e-063b-4b7a-a8a1-31e796daa6c7.png" alt="image" width="164" height="159" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;响应状态填写200即可&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/IIS77.5Javascript_FC1F/image_54b56a66-24ac-425a-877f-0a05ce1b2a0f.png" alt="image" width="146" height="151" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;接下来是选择跟踪提供程序，也就是给你提供跟踪日志源的程序，由于我们的脚本只经过静态文件处理器，因此这里我们只需要选择www server处理程序即可。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/IIS77.5Javascript_FC1F/image_8b14a60f-fab6-42b2-986b-541a6af628fd.png" alt="image" width="274" height="245" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后我们就可以去测试一下访问出问题的脚本了。一旦IIS中途处理遇到些问题，那么就会以xml形式记录下相关的日志。打开FailedReqLogFiles目录，里头会有一些fr000001.xml这样格式的文件，每个文件代表一次失败请求。我们打开这个文件，查找compression关键词，发现了以下内容：&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_711905" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/KevinYang/archive/2010/06/02/1749675.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;div &gt;6&lt;/div&gt;&#xD;
&lt;div &gt;7&lt;/div&gt;&#xD;
&lt;div &gt;8&lt;/div&gt;&#xD;
&lt;div &gt;9&lt;/div&gt;&#xD;
&lt;div &gt;10&lt;/div&gt;&#xD;
&lt;div &gt;11&lt;/div&gt;&#xD;
&lt;div &gt;12&lt;/div&gt;&#xD;
&lt;div &gt;13&lt;/div&gt;&#xD;
&lt;div &gt;14&lt;/div&gt;&#xD;
&lt;div &gt;15&lt;/div&gt;&#xD;
&lt;div &gt;16&lt;/div&gt;&#xD;
&lt;div &gt;17&lt;/div&gt;&#xD;
&lt;div &gt;18&lt;/div&gt;&#xD;
&lt;div &gt;19&lt;/div&gt;&#xD;
&lt;div &gt;20&lt;/div&gt;&#xD;
&lt;div &gt;21&lt;/div&gt;&#xD;
&lt;div &gt;22&lt;/div&gt;&#xD;
&lt;div &gt;23&lt;/div&gt;&#xD;
&lt;div &gt;24&lt;/div&gt;&#xD;
&lt;div &gt;25&lt;/div&gt;&#xD;
&lt;div &gt;26&lt;/div&gt;&#xD;
&lt;div &gt;27&lt;/div&gt;&#xD;
&lt;div &gt;28&lt;/div&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Event&lt;/code&gt; &lt;code &gt;xmlns&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"&lt;a href="http://schemas.microsoft.com/win/2004/08/events/event"&gt;http://schemas.microsoft.com/win/2004/08/events/event&lt;/a&gt;"&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;System&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Provider&lt;/code&gt; &lt;code &gt;Name&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"WWW Server"&lt;/code&gt; &lt;code &gt;Guid&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"{3A2A4E84-4C21-4981-AE10-3FDA0D9B0F83}"&lt;/code&gt;&lt;code &gt;/&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;EventID&lt;/code&gt;&lt;code &gt;&amp;gt;0&amp;lt;/&lt;/code&gt;&lt;code &gt;EventID&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Version&lt;/code&gt;&lt;code &gt;&amp;gt;1&amp;lt;/&lt;/code&gt;&lt;code &gt;Version&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Level&lt;/code&gt;&lt;code &gt;&amp;gt;4&amp;lt;/&lt;/code&gt;&lt;code &gt;Level&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Opcode&lt;/code&gt;&lt;code &gt;&amp;gt;3&amp;lt;/&lt;/code&gt;&lt;code &gt;Opcode&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Keywords&lt;/code&gt;&lt;code &gt;&amp;gt;0x40&amp;lt;/&lt;/code&gt;&lt;code &gt;Keywords&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;TimeCreated&lt;/code&gt; &lt;code &gt;SystemTime&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"2010-05-13T16:59:08.086Z"&lt;/code&gt;&lt;code &gt;/&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Correlation&lt;/code&gt; &lt;code &gt;ActivityID&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"{00000000-0000-0000-FD2B-008041000061}"&lt;/code&gt;&lt;code &gt;/&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Execution&lt;/code&gt; &lt;code &gt;ProcessID&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"10752"&lt;/code&gt; &lt;code &gt;ThreadID&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"14504"&lt;/code&gt;&lt;code &gt;/&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Computer&lt;/code&gt;&lt;code &gt;&amp;gt;DMZ&amp;lt;/&lt;/code&gt;&lt;code &gt;Computer&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;/&lt;/code&gt;&lt;code &gt;System&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;EventData&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Data&lt;/code&gt; &lt;code &gt;Name&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"ContextId"&lt;/code&gt;&lt;code &gt;&amp;gt;{00000000-0000-0000-FD2B-008041000061}&amp;lt;/&lt;/code&gt;&lt;code &gt;Data&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Data&lt;/code&gt; &lt;code &gt;Name&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"Reason"&lt;/code&gt;&lt;code &gt;&amp;gt;14&amp;lt;/&lt;/code&gt;&lt;code &gt;Data&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;/&lt;/code&gt;&lt;code &gt;EventData&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;RenderingInfo&lt;/code&gt; &lt;code &gt;Culture&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"zh-CN"&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Opcode&lt;/code&gt;&lt;code &gt;&amp;gt;STATIC_COMPRESSION_NOT_SUCCESS&amp;lt;/&lt;/code&gt;&lt;code &gt;Opcode&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Keywords&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;Keyword&lt;/code&gt;&lt;code &gt;&amp;gt;Compression&amp;lt;/&lt;/code&gt;&lt;code &gt;Keyword&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;/&lt;/code&gt;&lt;code &gt;Keywords&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;freb:Description&lt;/code&gt; &lt;code &gt;Data&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"Reason"&lt;/code&gt;&lt;code &gt;&amp;gt;NOT_FREQUENTLY_HIT&amp;lt;/&lt;/code&gt;&lt;code &gt;freb:Description&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;/&lt;/code&gt;&lt;code &gt;RenderingInfo&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;ExtendedTracingInfo&lt;/code&gt; &lt;code &gt;xmlns&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"&lt;a href="http://schemas.microsoft.com/win/2004/08/events/trace"&gt;http://schemas.microsoft.com/win/2004/08/events/trace&lt;/a&gt;"&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;EventGuid&lt;/code&gt;&lt;code &gt;&amp;gt;{E60CEE96-4472-448D-A13C-2170B18220EC}&amp;lt;/&lt;/code&gt;&lt;code &gt;EventGuid&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;/&lt;/code&gt;&lt;code &gt;ExtendedTracingInfo&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;lt;/&lt;/code&gt;&lt;code &gt;Event&lt;/code&gt;&lt;code &gt;&amp;gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;在上面，我们看到了NOT_FREQUENTLY_HIT的字样，看上去响应没有gzip的原因，还是因为没有达到&amp;ldquo;频繁访问&amp;rdquo;的要求，即使请求的资源已经被压缩过然后存放在硬盘上了。似乎这个压缩缓存是有一定的时效的，就是过了多长时间就得重新验证一下这个&amp;ldquo;频繁访问&amp;rdquo;的逻辑了。&lt;/p&gt;&#xD;
&lt;p&gt;我又进行了大量的测试，发现这个失效时间大约是在5分钟。也就是说，当你频繁访问一个资源，IIS开始对其进行压缩并存放在本地压缩缓存目录之后，大约过5分钟，你再去访问，还是会重新执行&amp;ldquo;频繁访问&amp;rdquo;这个验证逻辑。&lt;/p&gt;&#xD;
&lt;p&gt;为了证实我得到的结论，我在推特上向&lt;a href="http://www.ksingla.net/"&gt;Kanwaljeet Singla&lt;/a&gt;（他的推特是@kjsingla）询问了这个问题。出乎我的意料，他很快就回复了我，估计是因为我在做这个测试的时候已经半夜了，他那边刚好是白天的缘故吧。他经过测试，证实&amp;ldquo;频繁访问&amp;rdquo;的逻辑检测发生在&amp;ldquo;响应是否已经压缩&amp;rdquo;逻辑之前，这确实是IIS7/7.5的一个Bug。&lt;/p&gt;&#xD;
&lt;p&gt;解决办法倒是很简单，只需要将&amp;ldquo;频繁访问&amp;rdquo;定义得更宽泛一些即可。例如1分钟内1次访问。&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div id="highlighter_323221" &gt;&#xD;
&lt;div &gt;&lt;span&gt;&lt;a  href="http://www.cnblogs.com/KevinYang/archive/2010/06/02/1749675.html"&gt;?&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;table border="0" cellspacing="0" cellpadding="0"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;1&lt;/div&gt;&#xD;
&lt;div &gt;2&lt;/div&gt;&#xD;
&lt;div &gt;3&lt;/div&gt;&#xD;
&lt;div &gt;4&lt;/div&gt;&#xD;
&lt;div &gt;5&lt;/div&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td &gt;&#xD;
&lt;div &gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;configuration&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;system.webServer&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;&lt;/code&gt;&lt;code &gt;serverRuntime&lt;/code&gt; &lt;code &gt;frequentHitThreshold&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"1"&lt;/code&gt; &lt;code &gt;frequentHitTimePeriod&lt;/code&gt;&lt;code &gt;=&lt;/code&gt;&lt;code &gt;"00:01:00"&lt;/code&gt; &lt;code &gt;/&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&lt;/code&gt;&lt;code &gt;&amp;lt;/&lt;/code&gt;&lt;code &gt;system.webServer&lt;/code&gt;&lt;code &gt;&amp;gt; &lt;/code&gt;&lt;/div&gt;&#xD;
&lt;div &gt;&lt;code &gt;&amp;lt;/&lt;/code&gt;&lt;code &gt;configuration&lt;/code&gt;&lt;code &gt;&amp;gt;&lt;/code&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;问题真的解决了吗？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当我以为问题圆满解决，满意的睡着之后，第二天测试的时候发现请求脚本又没有gzip了，而且这次是连着访问好几次都没有压缩，这没法用我昨晚得到的结论去解释。让我非常郁闷-_-|||&lt;/p&gt;&#xD;
&lt;p&gt;冷静！&lt;/p&gt;&#xD;
&lt;p&gt;在系统日志中，我又看到了压缩目录无效的警告信息了，但这次，这个压缩目录是真没了。回想起那个时刻做的操作，当时运营的网站抛出未处理的异常，我修改完这个异常就把应用程序池给重启了。难道是说，当网站出现异常的时候，如果强制回收应用程序池的话，会导致静态压缩目录被删除？更奇怪的是，当我再次回收应用程序池，发现这个压缩目录又被重新创建了。&lt;/p&gt;&#xD;
&lt;p&gt;为了验证我的猜想，我又重复了这个过程，让网站抛出异常=&amp;gt;重启应用程序池=&amp;gt;再次请求脚本，问题重现；我又新建了一个一摸一样配置的测试网站，同样的测试流程，却发现压缩目录正常，没有出现上述的症状。&lt;/p&gt;&#xD;
&lt;p&gt;经过细致的对比，我发现运营的网站和我测试的网站环境还是不大一样的。运营的网站时时刻刻都有外部的请求，而且还很频繁。而测试网站不会有任何干扰的流量。&lt;/p&gt;&#xD;
&lt;p&gt;为了模拟真实的情况，我用iMacro写了一个宏，不间断的向测试网站请求该脚本。一开始，可以看到压缩目录确实是存在的，然后我在中途手动回收了应用程序池。发现压缩缓存目录确实被删除了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img style="display: inline; border-width: 0px;" title="image" src="http://images.cnblogs.com/cnblogs_com/KevinYang/WindowsLiveWriter/IIS77.5Javascript_FC1F/image_d3aede1b-2aac-4975-8971-51b467321631.png" alt="image" width="449" height="115" border="0" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;经过再细致的测试，我最终得到一个结论：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;在IIS7/7.5中，如果为应用程序池配置了administrator的账号权限，那么如果在应用程序池处理静态文件压缩的时候回收应用程序池，会导致压缩缓存目录被删除。直到下次应用程序池健康重启的时候，此压缩缓存目录才会被重新创建。&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这个结论我还没有得到IIS团队的证实。但在我几台机器上的IIS7和7.5测试的结果确实都是这样的。联想之前的系统日志中，每隔1-3天就出现这样的问题，刚好是因为IIS7默认的回收间隔是1740分钟，也就是1天5小时。我计算了一下系统日志中的所有关于静态压缩目录警告出现的时间，和这个回收间隔的倍数非常吻合。&lt;/p&gt;&#xD;
&lt;p&gt;解决办法有两个：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;如果没有必要，则不要给应用程序池配置administrator的账号，使用内置的账号不会出现这样的问题。&lt;/li&gt;&#xD;
&lt;li&gt;禁用固定时间间隔回收，改成在一个相对空闲的固定时刻回收，例如半夜4点。&lt;/li&gt;&#xD;
&lt;/ul&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/2345089.html?type=2" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/articles/2345089.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/articles/2106373.html</id><title type="text">如何解决ajax跨域的问题? ajax跨域调用的解决办法有很多种!</title><summary type="text">解决ajax跨域的问题 ajax跨域调用的解决办法有很多种，我这里只说两种： 假设s.cnblogs.com是一个评论系统，只提供javascript方式的调用。news.cnblogs.com是一个新闻系统，这个系统将评论功能委托给s.cnblogs.com。这时news.cnblogs.com发表评论的代码可能是： function sendData(data,callback) { var xmlHttp=createXmlHttpRequest(); xmlHttp.open(&amp;#39;post&amp;#39;,&amp;#39;http://s.cnblogs.com/postHandler.as</summary><published>2011-07-14T06:59:00Z</published><updated>2011-07-14T06:59:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/articles/2106373.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/articles/2106373.html"/><content type="html">&lt;div id="firstpost"&gt;　　　　解决ajax跨域的问题 ajax跨域调用的解决办法有很多种，我这里只说两种： 假设s.cnblogs.com是一个评论系统，只提供javascript方式的调用。news.cnblogs.com是一个新闻系统，这个系统将评论功能委托给s.cnblogs.com。这时news.cnblogs.com发表评论的代码可能是： function sendData(data,callback) { var xmlHttp=createXmlHttpRequest(); xmlHttp.open('post','http://s.cnblogs.com/postHandler.ashx'); xmlHttp.onreadystatechange=callback; xmlHttp.send(data);//data包含要发送的数据。 } 这代代码在IE6中会有一个安全提醒，但在IE7里面，直接会出错。因为跨域。&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;第一种解决方案：&lt;/div&gt;&#xD;
&lt;div&gt;document.domain. 1.将sendData代码存进一个services.htm文件中。并在services.htm中设置document.domain='cnblogs.com' 2.将services.htm放到s.cnblogs.com网站根目录下面。 3.在news.cnblogs.com提交评论的页面加上&amp;lt;iframe id='ajaxFrame' src='http://s.cnblogs.com/services.htm' width='0' height='0'&amp;gt;&amp;lt;/iframe&amp;gt; 4.在news.cnblogs.com提交评论的页面加上 function sendData(data,callback) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ajaxFrame.window.sendData(data,callback); } 和document.domain='cnblogs.com'; 方案的缺点：只能解决跨子域的问题。&lt;/div&gt;&#xD;
&lt;div&gt;方案2：动态script 法。 1.在news.cnblogs.com提交评论的页面加上，&amp;lt;script id='ajaxProxy' src=''&amp;gt;&amp;lt;/script&amp;gt; function sendData(data,callback) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var proxy=document.getElementById('ajaxProxy');&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.src='http://s.cnblogs.com/postHandler.ashx?data="+data;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxy.onreadystatechange=callback; } 我个人更喜欢方案2，但方案的一个问题是callback可以做的事情太少，无法接收postHandler.ashx发回的所馈数据。不过，我觉得有一种变通的方案，那就是直接在postHandler.ashx中输出js,比如alert('ok');，但我测试了几次都没能成功能。感觉可能是我的RP问题。 这都不是完美的解决方案，用本地代理才是终极方案！ Ajax跨域访问的问题出于安全性考虑，浏览器禁止ajax跨域访问，但当有遇到这一类需求时就直接否则ajax直接访问这一方法。当然方法一定是有的，在网上一搜能找到一堆解决方案，如动态创建iframe获取结果在传回处理的，或者用script的src属性绕过的，还有通过本地代理的，我感觉本地代理方式是一种比较完美的方法，直接通过ajax像本地服务请求，本地服务再向远程服务获取结果，然后传回客户端，当然多了中间一层代理，但过程还是ajax方式的，同时本地的 service可以任意处理出想要的结果。 上回说到使用jQuery跨域调用JSON数据，但是如果对方不提供JSON数据，则需要用另外的方法实现跨域调用。这两天遇到这个问题，查了些资料，有一种基于代理的方式实现跨域调用。基本解决思路是，在本域写一个程序向对方发起请求，并且将响应内容再输出。这个程序相当于一个代理，则跨域调用就可以变成对本域的调用了。我用php实现的代理程序如下： 1 2 $remoteURL=urlencode($url); echo get_file_contents($remoteURL); 要注意的是，使用urlencode需要在php.ini中开启allow_url_fopen。&lt;/div&gt;&#xD;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;div&gt;摘自：&lt;a href="http://club.sm160.com/showtopic-99554.aspx"&gt;http://club.sm160.com/showtopic-99554.aspx&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/2106373.html?type=2" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/articles/2106373.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/archive/2010/04/25/1719870.html</id><title type="text">MySoft.Data v2.7.3 stable 版本发布，新增部分功能，并修复其中的已知的bug</title><summary type="text">此版本在简化了某些常用的操作，数据返回不再采用接口，增强了SourceList, SourceTable的功能在这里要感谢网友提供好的建议，并帮助我修复了不少bug，在功能上也有许多的改进昵称：Berin-230760 QQ：100538511 昵称：Ｍelody QQ：377526853昵称：uxspy QQ：13970711昵称：王皓 QQ：24097543昵称：峰言峰语 QQ：9534029...</summary><published>2010-04-25T06:49:00Z</published><updated>2010-04-25T06:49:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/archive/2010/04/25/1719870.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/archive/2010/04/25/1719870.html"/><content type="html">&lt;p&gt;此版本在简化了某些常用的操作，数据返回不再采用接口，增强了SourceList, SourceTable的功能&lt;/p&gt;&#xD;
&lt;p&gt;在这里要感谢网友提供好的建议，并帮助我修复了不少bug，在功能上也有许多的改进&lt;/p&gt;&#xD;
&lt;p&gt;昵称：Berin-230760&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QQ：100538511 &lt;/p&gt;&#xD;
&lt;p&gt;昵称：Ｍelody&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QQ：377526853&lt;/p&gt;&#xD;
&lt;p&gt;昵称：uxspy&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;&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; QQ：13970711&lt;/p&gt;&#xD;
&lt;p&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; QQ：24097543&lt;/p&gt;&#xD;
&lt;p&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; QQ：95340299&lt;/p&gt;&#xD;
&lt;p&gt;还有一位园子里的朋友对我的帮助非常大，暂不知道他的QQ是多少 &lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/ljzforever/"&gt;永远的阿哲&lt;/a&gt;&amp;nbsp;&amp;nbsp; URL：&lt;a href="http://www.cnblogs.com/ljzforever/"&gt;http://www.cnblogs.com/ljzforever/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在这里忠心的感谢大家的支持，我会一如既往的为大家服务！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;版本号：2.7.3 (2.7.3第一次修正)&lt;/strong&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.修正bool字段在new出来的对象时不能更新的bug &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对new出来的对象更新进行特殊处理。 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; new出来的对象更新时会更新所有提交的值 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果从数据库中读出的实体，则只更新被修改过的值 &lt;br /&gt;2.将Original对象名更改为Old，修正Old赋值不正确的bug &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 只有当前对象从数据库中读取并且更改时才会对Old对象赋值 &lt;/p&gt;&#xD;
&lt;p&gt;3.在Entity对象上增加一个ToRowReader方法，可以按字段名来读取数据 &lt;/p&gt;&#xD;
&lt;p&gt;4.修正了SourceList.ToTable()中的一个bug. &lt;br /&gt;&amp;nbsp; 当List数据项中属性为类或结构时,调用ToTable()会出错！ &lt;br /&gt;5.增加了SourceTable释放托管资源的接口Dispose(); &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;版本号：2.7.3 (2.7.3第二次修正) &lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.修正数据查询时条件中出现{}这样的符号时出错的bug. &lt;br /&gt;&amp;nbsp; 由于{}在组件内部有特殊用途，没能对传入的字符串进行特殊处理导致。 &lt;/p&gt;&#xD;
&lt;p&gt;2.对TableRelation增加Select,Where,OrderBy等处理 &lt;br /&gt;&amp;nbsp;&amp;nbsp; TableRelation&amp;lt;A&amp;gt; tr = Table.From&amp;lt;A&amp;gt;().LeftJoin&amp;lt;B&amp;gt;(A._.ID == B._.ID) &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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .LeftJoin&amp;lt;C&amp;gt;(B._.PID == C._.PID) &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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Where(A._.ID == 1) &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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .OrderBy(A._ID.Desc) &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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(A._.All,B._.Name,C._PName) &lt;br /&gt;&amp;nbsp;&amp;nbsp; DbSession.Default.From(tr).ToList(); &lt;br /&gt;3.返回的数据不再返回为接口，这样可以直接使用原始对象，省去转换的麻烦，如： &lt;br /&gt;&amp;nbsp; ToList()返回的为SourceList，SourceList继承于List &lt;br /&gt;&amp;nbsp; ToTable()返回的为SourceTable，SourceTable继承于DataTable &lt;br /&gt;&amp;nbsp; ToReader()返回的为SourceReader，SourceReader通过属性DataSource来访问IDataReader &lt;/p&gt;&#xD;
&lt;p&gt;4.支持内联查询语法，如下： &lt;br /&gt;&amp;nbsp; select [Products].*,[CategoryName] = ( select [Categories].[CategoryName] from [Categories] &lt;br /&gt;&amp;nbsp; where [Categories].[CategoryID] = [Products].[CategoryID] ) from [Products] &lt;br /&gt;&amp;nbsp; TableRelation&amp;lt;Products&amp;gt; relation = Table.From&amp;lt;Products&amp;gt;() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(Products._.All, new SysField&amp;lt;Categories&amp;gt;("CategoryName", Table.From&amp;lt;Categories&amp;gt;() &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; .Select(Categories._.CategoryName).Where(Categories._.CategoryID == Products._.CategoryID))); &lt;/p&gt;&#xD;
&lt;p&gt;IList&amp;lt;Products&amp;gt; list = DataAccess.DefaultSession.From(relation).ToList(); &lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;版本号：2.7.3 (2.7.3第三次修正) stable&lt;/strong&gt; &lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1.修正了在操作时字符串中带有 {} 时运行出错的bug. &lt;/p&gt;&#xD;
&lt;p&gt;2.修正了DbSession.Default.Update(Field,Field + 1,Where)方式运行时的错误 &lt;/p&gt;&#xD;
&lt;p&gt;3.对SourceList与SourceTable在功能上进一步增强 &lt;/p&gt;&#xD;
&lt;p&gt;4.存储过程与SQL语法操作中增加了字典参数传递的方法，如下 &lt;br /&gt;&amp;nbsp; IDictionary&amp;lt;string, object&amp;gt; parameters = new Dictionary&amp;lt;string, object&amp;gt;(); &lt;br /&gt;&amp;nbsp; parameters["$UserID"] = 1; &lt;br /&gt;&amp;nbsp; DbSession.Default.FromSql("select *from User where UserID = $UserID", parameters); &lt;br /&gt;&amp;nbsp; 存储过程与之雷同 &lt;br /&gt;5.增加了SysValue的处理，例如 &lt;br /&gt;&amp;nbsp; 将用户ID为1的更新时间修改为当前数据库时间 &lt;br /&gt;&amp;nbsp; DbSession.Default.Update(User._.UpdateTime,new SysValue("getdate()") User._.UserID == 1); &lt;br /&gt;6.将原MySoft.Web中的MVP添加到MySoft.Data组件之中，避免在非Web项目中引用MySoft.Web程序集&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这次为了MySoft.Data的代码再次被更改后发布，暂时不提供源码下载，愿请谅解！&lt;/p&gt;&#xD;
&lt;p&gt;有什么问题直接与我联系，我会及时修正。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/maoyong/lib_v2.7.3_stable.rar"&gt;MySoft 2.7.3 工具集与dll库下载&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/maoyong/SimpleGuestbook(基于MVP实现).rar"&gt;SimpleGuestbook(基于MVP实现).rar下载&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710879.html"&gt;MySoft.Data从入门到精通系列篇&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/02/1676233.html"&gt;点击进入MySoft问题反馈&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;QQ:121849018 &lt;/p&gt;&#xD;
&lt;p&gt;MSN:maoyong181@hotmail.com &lt;/p&gt;&#xD;
&lt;p&gt;Gmail:mysoft181@gmail.com&lt;/p&gt;&#xD;
&lt;p&gt;QQ讨论群(MySoft)：群一：27071789&amp;nbsp; 群二:107193048&lt;/p&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/1719870.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/04/25/1719870.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/archive/2010/04/13/1711433.html</id><title type="text">MySoft组件之MySoft.Web一个简单示例</title><summary type="text">今天抽了点时间写了一个很简单的MySoft.Web相关组件的示例程序。  别看它简单，但五脏俱全，下面就一一介绍这个示例的各种实现：  第一步：建一个Web项目，引用MySoft.Web程序集： 将MySoft.Web引用添加到当前项目中，在bin目录下为最新版本，之前的版本不保证可以编译通过  &amp;#160;  第二步：配置web.config 上面的controls是使用MySoft内部控件时所...</summary><published>2010-04-13T14:15:00Z</published><updated>2010-04-13T14:15:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1711433.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1711433.html"/><content type="html">&lt;p&gt;今天抽了点时间写了一个很简单的MySoft.Web相关组件的示例程序。&lt;/p&gt;  &lt;p&gt;别看它简单，但五脏俱全，下面就一一介绍这个示例的各种实现：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;第一步：建一个Web项目，引用MySoft.Web程序集：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmp94D9_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp94D9" border="0" alt="tmp94D9" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmp94D9_thumb.png" width="151" height="24" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;将MySoft.Web引用添加到当前项目中，在bin目录下为最新版本，之前的版本不保证可以编译通过&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;第二步：配置web.config&lt;/strong&gt;&lt;/p&gt;  &lt;div&gt;   &lt;pre&gt;&amp;lt;pages enableViewState=&amp;quot;&lt;span style="color: #8b0000"&gt;false&lt;/span&gt;&amp;quot; enableSessionState=&amp;quot;&lt;span style="color: #8b0000"&gt;true&lt;/span&gt;&amp;quot;&amp;gt;&#xD;
      &amp;lt;controls&amp;gt;&#xD;
        &amp;lt;add tagPrefix=&amp;quot;&lt;span style="color: #8b0000"&gt;my&lt;/span&gt;&amp;quot; &lt;span style="color: #0000ff"&gt;namespace&lt;/span&gt;=&amp;quot;&lt;span style="color: #8b0000"&gt;MySoft.Web.UI.Controls&lt;/span&gt;&amp;quot; assembly=&amp;quot;&lt;span style="color: #8b0000"&gt;MySoft.Web&lt;/span&gt;&amp;quot; /&amp;gt;&#xD;
      &amp;lt;/controls&amp;gt;&#xD;
    &amp;lt;/pages&amp;gt;&#xD;
    &amp;lt;httpHandlers&amp;gt;&#xD;
      &amp;lt;add verb=&amp;quot;&lt;span style="color: #8b0000"&gt;GET,POST&lt;/span&gt;&amp;quot; path=&amp;quot;&lt;span style="color: #8b0000"&gt;ajax/*.ashx&lt;/span&gt;&amp;quot; type=&amp;quot;&lt;span style="color: #8b0000"&gt;MySoft.Web.AjaxPageHandler, MySoft.Web&lt;/span&gt;&amp;quot;/&amp;gt;&#xD;
    &amp;lt;/httpHandlers&amp;gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;上面的controls是使用MySoft内部控件时所需的。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;httpHandlers里的配置是用于Ajax处理&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;第三步：编写客户端脚本与服务端通讯&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;后台: 实现客户端读取服务端时间的代码&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;注意：需要启用EnableAjaxCallback&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;public partial class _Default : AjaxPage &#xD;
  &lt;br /&gt;{ &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected void Page_Load(object sender, EventArgs e) &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; [AjaxMethod] &#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public DateTime GetServerDateTime() &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return DateTime.Now; &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; protected override bool EnableAjaxCallback &#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; get &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; { &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return true; &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; } &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &#xD;
&#xD;
  &lt;br /&gt;}&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;前台：&amp;lt;input type=&amp;quot;button&amp;quot; value=&amp;quot;获取服务端时间&amp;quot; onclick=&amp;quot;getDateTime();&amp;quot; /&amp;gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;function getDateTime() { &#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; var time = AjaxMethods.GetServerDateTime(); &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; alert(time.toLocaleString()); &#xD;
&#xD;
  &lt;br /&gt;}&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;此处的AjaxMethods内部对象，表示当前页面所有[AjaxMethod]方法的集合&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;Ajax方式加载用户控件的方法：&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;新建一个用户控件，起名为：TestParamControl.ascx&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;客户端代码：&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;function loadUserControlWithParam() { &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; var value = $('txtName').value; &#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; if (!value) { &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Dialog.alert('请输入名字！'); &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return; &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //divContainer为&amp;lt;div id=’divContainer’ /&amp;gt;容器&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //~/TestParamControl.ascx为用户控件路径&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //{Name : value }此处为用户控件的参数，可以传入多个参数&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; Ajax.UpdatePanel('divContainer', '~/TestParamControl.ascx', { Name: value }); &#xD;
  &lt;br /&gt;}&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;服务端代码：&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;public partial class TestParamControl : System.Web.UI.UserControl, MySoft.Web.UI.IAjaxProcessEventHandler &#xD;
  &lt;br /&gt;{ &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; protected void Page_Load(object sender, EventArgs e) &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; { &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; #region IAjaxProcessEventHandler 成员 &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; //加载数据必须实现接口IAjaxProcessEventHandler &#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public void OnAjaxProcess(CallbackParams callbackParams) &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 因为数据从客户端传入服务端为字符串，所以需要进行一些转换&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; callbackParams可以很方便的转换成各种数据类型，如下：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; int age = callbackParams[“age”].To&amp;lt;int&amp;gt;();&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; DateTime time = callbackParams[“startDate”].To&amp;lt;DateTime&amp;gt;();&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 直接获取string，可使用callbackParams[“参数名&amp;quot;]或callbackParams[“参数名&amp;quot;].Value;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Label1.Text = &amp;quot;你的名字是：&amp;quot; + callbackParams[&amp;quot;Name&amp;quot;].Value; &#xD;
&#xD;
  &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&amp;#160;&amp;#160; #endregion &#xD;
  &lt;br /&gt;}&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;插入代码块的功能居然报出了bug:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;em&gt;System.NullReferenceException: 未将对象引用设置到对象的实例。 &#xD;
    &lt;br /&gt;&amp;#160;&amp;#160; 在 CodemarksFramework.LiveWriter.Plugins.FrmLiveWriterPlug..ctor() &#xD;
&#xD;
    &lt;br /&gt;&amp;#160;&amp;#160; 在 CodemarksFramework.LiveWriter.Plugins.FrmLiveWriterPlug..ctor(String&amp;amp; content) &#xD;
&#xD;
    &lt;br /&gt;&amp;#160;&amp;#160; 在 CodemarksFramework.LiveWriter.Plugins.LiveWriterAdapter.CreateContent(IWin32Window dialogOwner, String&amp;amp; content) &#xD;
&#xD;
    &lt;br /&gt;&amp;#160;&amp;#160; 在 WindowsLive.Writer.PostEditor.ContentSources.ContentSourceManager.PerformInsertion(IContentSourceSite sourceSite, ContentSourceInfo contentSource)&lt;/em&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;不知道有谁知道怎样解决！&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;先写到这里吧，自己下载源码去研究，还有很多功能需要你们自己去发掘！&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;这里是效果图：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmp1BE3_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp1BE3" border="0" alt="tmp1BE3" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmp1BE3_thumb.png" width="624" height="448" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Ajax加载用户控件效果图：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmp3B2B_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp3B2B" border="0" alt="tmp3B2B" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmp3B2B_thumb.png" width="506" height="87" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Dialog弹出框效果图：&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmp160C_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp160C" border="0" alt="tmp160C" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmp160C_thumb.png" width="614" height="390" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Dialog提示框效果图:&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmpE849_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmpE849" border="0" alt="tmpE849" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoftMySoft.Web_12F9F/tmpE849_thumb.png" width="586" height="467" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&amp;#160;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;示例下载地址：&lt;a title="http://files.cnblogs.com/maoyong/WebExample.rar" href="http://files.cnblogs.com/maoyong/WebExample.rar"&gt;http://files.cnblogs.com/maoyong/WebExample.rar&lt;/a&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710879.html"&gt;MySoft.Data从入门到精通系列篇&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/1711433.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1711433.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/archive/2010/04/13/1710913.html</id><title type="text">MySoft.Data从入门到精通系列(五)【数据更新】</title><summary type="text">前一章讲了如何利用MySoft.Data进行数据的插入，利用DbSession可以实现各种数据增、删、改、查等各种复杂的处理，本章着重讲解一下数据的更新：  数据更新在日常开发中占据中非常重要的地位，尽次于查询。下面就讲解一下如何利用DbSession来进行数据的更新。  继续引用前面的DbSession配置，如下： 下面还是利用DataAccess.ExampleSession来进行操作：一、强...</summary><published>2010-04-13T03:01:00Z</published><updated>2010-04-13T03:01:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710913.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710913.html"/><content type="html">&lt;p&gt;前一章讲了如何利用MySoft.Data进行数据的插入，利用DbSession可以实现各种数据增、删、改、查等各种复杂的处理，本章着重讲解一下数据的更新：&lt;/p&gt; &lt;p&gt;数据更新在日常开发中占据中非常重要的地位，尽次于查询。下面就讲解一下如何利用DbSession来进行数据的更新。&lt;/p&gt; &lt;p&gt;继续引用前面的DbSession配置，如下：&lt;/p&gt; &lt;div style="width: 656px; height: 385px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_50105" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_50105').style.display='none'; document.getElementById('Code_Open_Image_50105').style.display='inline'; document.getElementById('Code_Open_Text_50105').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_50105" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_50105').style.display='none'; getElementById('Code_Closed_Image_50105').style.display='inline'; getElementById('Code_Closed_Text_50105').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_50105" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_50105"&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// 数据库访问类&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataAccess&#xD;
    {&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 通过配置节来实例化DbSession&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DbSession DefaultSession = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DbSession("&lt;span style="color: #8b0000"&gt;DataExample&lt;/span&gt;");&#xD;
&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 通过自定义类来实例化DbSession&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DataExample ExampleSession = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DataExample();&#xD;
&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// DataExample会话类&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataExample : DbSession&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DataExample()&#xD;
            : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;("&lt;span style="color: #8b0000"&gt;DataExample&lt;/span&gt;")&#xD;
        {&#xD;
#&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; DEBUG&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.RegisterSqlLogger(log =&amp;gt;&#xD;
                {&#xD;
                    System.IO.File.WriteAllText("&lt;span style="color: #8b0000"&gt;c:\\log.txt&lt;/span&gt;", log);&#xD;
                });&#xD;
#endif&#xD;
        }&#xD;
    }&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;下面还是利用DataAccess.ExampleSession来进行操作：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、强类型的数据更新&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;下面的操作以Products实体为例进行操作：&lt;p&gt;&lt;strong&gt;1、单个实体数据更新&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_112324" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_112324').style.display='none'; document.getElementById('Code_Open_Image_112324').style.display='inline'; document.getElementById('Code_Open_Text_112324').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_112324" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_112324').style.display='none'; getElementById('Code_Closed_Image_112324').style.display='inline'; getElementById('Code_Closed_Text_112324').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_112324" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_112324"&gt;            &lt;span style="color: #008000"&gt;//实例化一个Products对象&lt;/span&gt;&#xD;
            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductID = 1,&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            &lt;span style="color: #008000"&gt;//更新单个对象&lt;/span&gt;&#xD;
            product.Attach();&#xD;
            DataAccess.ExampleSession.Save(product);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;2、批量实体数据更新&lt;/strong&gt;&lt;/p&gt;&lt;div style="width: 659px; height: 318px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_652217" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_652217').style.display='none'; document.getElementById('Code_Open_Image_652217').style.display='inline'; document.getElementById('Code_Open_Text_652217').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_652217" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_652217').style.display='none'; getElementById('Code_Closed_Image_652217').style.display='inline'; getElementById('Code_Closed_Text_652217').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_652217" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_652217"&gt;            &lt;span style="color: #008000"&gt;//实例化一组Products对象&lt;/span&gt;&#xD;
            List&amp;lt;Products&amp;gt; list = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;Products&amp;gt;();&#xD;
            &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index = 0; index &amp;lt; 10; index++)&#xD;
            {&#xD;
                list.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
                {&#xD;
                    ProductID = index,&#xD;
                    ProductName = "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;" + index&#xD;
                });&#xD;
            }&#xD;
&#xD;
            &lt;span style="color: #008000"&gt;//批量更新数据&lt;/span&gt;&#xD;
            DbBatch batch = DataAccess.ExampleSession.BeginBatch(10);&#xD;
            list.ForEach(item =&amp;gt;&#xD;
            {&#xD;
                item.Attach();&#xD;
                batch.Save(item);&#xD;
            });&#xD;
&#xD;
            batch.Process();&lt;/pre&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;3、带事务单个实体更新(MySoft.Data内置实现DbTrans)&lt;/strong&gt;&lt;/p&gt;&lt;span id="Code_Open_Text_652217"&gt;&lt;div style="width: 659px; height: 357px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_181568" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_181568').style.display='none'; document.getElementById('Code_Open_Image_181568').style.display='inline'; document.getElementById('Code_Open_Text_181568').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_181568" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_181568').style.display='none'; getElementById('Code_Closed_Image_181568').style.display='inline'; getElementById('Code_Closed_Text_181568').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_181568" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_181568"&gt;            &lt;span style="color: #008000"&gt;//实例化一个Products对象&lt;/span&gt;&#xD;
            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductID = 1,&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            &lt;span style="color: #008000"&gt;//使用事务进行数据插入&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (DbTrans trans = DataAccess.ExampleSession.BeginTrans())&#xD;
            {&#xD;
                &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&#xD;
                {&#xD;
                    product.Attach();&#xD;
                    trans.Save(product);&#xD;
                    trans.Commit();&#xD;
                }&#xD;
                &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&#xD;
                {&#xD;
                    trans.Rollback();&#xD;
                }&#xD;
            }&lt;/pre&gt;&lt;/div&gt;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;4、带事务批量实体更新(MySoft.Data内置实现DbTrans)&lt;/strong&gt;&lt;/p&gt;&lt;div style="width: 659px; height: 492px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_824909" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_824909').style.display='none'; document.getElementById('Code_Open_Image_824909').style.display='inline'; document.getElementById('Code_Open_Text_824909').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_824909" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_824909').style.display='none'; getElementById('Code_Closed_Image_824909').style.display='inline'; getElementById('Code_Closed_Text_824909').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_824909" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_824909"&gt;&lt;span style="color: #008000"&gt;//实例化一组Products对象&lt;/span&gt;&#xD;
            List&amp;lt;Products&amp;gt; list = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;Products&amp;gt;();&#xD;
            &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index = 0; index &amp;lt; 10; index++)&#xD;
            {&#xD;
                list.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
                {&#xD;
                    ProductID = index,&#xD;
                    ProductName = "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;" + index&#xD;
                });&#xD;
            }&#xD;
&#xD;
            &lt;span style="color: #008000"&gt;//使用事务进行批量数据插入&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (DbTrans trans = DataAccess.ExampleSession.BeginTrans())&#xD;
            {&#xD;
                &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&#xD;
                {&#xD;
                    DbBatch batch = trans.BeginBatch(10);&#xD;
                    list.ForEach(item =&amp;gt;&#xD;
                    {&#xD;
                        item.Attach();&#xD;
                        batch.Save(item);&#xD;
                    });&#xD;
                    batch.Process();&#xD;
&#xD;
                    trans.Commit();&#xD;
                }&#xD;
                &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&#xD;
                {&#xD;
                    trans.Rollback();&#xD;
                }&#xD;
            }&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;5、创建外部数据库链接方式更新&lt;/strong&gt;&lt;/p&gt;&lt;div style="width: 670px; height: 347px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_487661" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_487661').style.display='none'; document.getElementById('Code_Open_Image_487661').style.display='inline'; document.getElementById('Code_Open_Text_487661').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_487661" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_487661').style.display='none'; getElementById('Code_Closed_Image_487661').style.display='inline'; getElementById('Code_Closed_Text_487661').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_487661" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_487661"&gt;&#xD;
            &lt;span style="color: #008000"&gt;//实例化一个Products对象&lt;/span&gt;&#xD;
            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductID = 1,&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (System.Data.Common.DbConnection conn = DataAccess.ExampleSession.CreateConnection())&#xD;
            {&#xD;
                &lt;span style="color: #008000"&gt;//更新单个对象&lt;/span&gt;&#xD;
                product.Attach();&#xD;
                DataAccess.ExampleSession.SetConnection(conn).Save(product);&#xD;
            }&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;注：批量插入可以采用同样的方法处理！&lt;p&gt;&lt;strong&gt;6、创建外部数据库事务方式更新&lt;/strong&gt;&lt;/p&gt;&lt;div style="width: 659px; height: 434px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_694810" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_694810').style.display='none'; document.getElementById('Code_Open_Image_694810').style.display='inline'; document.getElementById('Code_Open_Text_694810').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_694810" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_694810').style.display='none'; getElementById('Code_Closed_Image_694810').style.display='inline'; getElementById('Code_Closed_Text_694810').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_694810" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_694810"&gt;&lt;span style="color: #008000"&gt;//实例化一个Products对象&lt;/span&gt;&#xD;
            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductID = 1,&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (System.Data.Common.DbTransaction trans = DataAccess.ExampleSession.BeginTransaction())&#xD;
            {&#xD;
                &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&#xD;
                {&#xD;
                    &lt;span style="color: #008000"&gt;//更新单个对象&lt;/span&gt;&#xD;
                    product.Attach();&#xD;
                    DataAccess.ExampleSession.SetTransaction(trans).Save(product);&#xD;
                    trans.Commit();&#xD;
&#xD;
                }&#xD;
                &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&#xD;
                {&#xD;
                    trans.Rollback();&#xD;
                }&#xD;
            }&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;注：批量更新可以采用同样的方法处理！&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt; 当实体存在时更新，否则插入的处理方式：&lt;/strong&gt;&lt;/p&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_694179" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_694179').style.display='none'; document.getElementById('Code_Open_Image_694179').style.display='inline'; document.getElementById('Code_Open_Text_694179').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_694179" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_694179').style.display='none'; getElementById('Code_Closed_Image_694179').style.display='inline'; getElementById('Code_Closed_Text_694179').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_694179" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_694179"&gt;            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductID = 1,&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            DataAccess.ExampleSession.InsertOrUpdate(product);&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;以上操作相应的都可以使用事务来处理&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;二、UpdateCreator数据更新&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;通过更新创建器同样也可以达到上面的效果，也可以进行泛型方式进行数据插入，一般情况下创建器用于没有建立对象实体时直接对表和字段的操作。&lt;p&gt;&lt;strong&gt;1、通过实体更新实体&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_753143" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_753143').style.display='none'; document.getElementById('Code_Open_Image_753143').style.display='inline'; document.getElementById('Code_Open_Text_753143').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_753143" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_753143').style.display='none'; getElementById('Code_Closed_Image_753143').style.display='inline'; getElementById('Code_Closed_Text_753143').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_753143" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_753143"&gt;            UpdateCreator uc = UpdateCreator.NewCreator()&#xD;
            .From&amp;lt;Products&amp;gt;()&#xD;
            .SetEntity&amp;lt;Products&amp;gt;(product, &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;);&#xD;
&#xD;
            DataAccess.ExampleSession.Excute(uc);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;2、通过字符串表与字段更新数据&lt;/strong&gt;&lt;/p&gt;&lt;span id="Code_Open_Text_670225"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_846851" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_846851').style.display='none'; document.getElementById('Code_Open_Image_846851').style.display='inline'; document.getElementById('Code_Open_Text_846851').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_846851" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_846851').style.display='none'; getElementById('Code_Closed_Image_846851').style.display='inline'; getElementById('Code_Closed_Text_846851').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_846851" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_846851"&gt;            UpdateCreator uc = UpdateCreator.NewCreator()&#xD;
            .From("&lt;span style="color: #8b0000"&gt;Products&lt;/span&gt;")&#xD;
            .AddUpdate("&lt;span style="color: #8b0000"&gt;ProductName&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;")&#xD;
            .AddWhere("&lt;span style="color: #8b0000"&gt;ProductID&lt;/span&gt;", 1);&#xD;
&#xD;
            DataAccess.ExampleSession.Excute(uc);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;三、用户自定义更新方式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;DataAccess.ExampleSession.Update&amp;lt;Products&amp;gt;(Products._.ProductName, "测试产品", Products._.ProductID == 1);&lt;p&gt;&lt;p&gt;条件可以多个组件产生，如下：&lt;p&gt;WhereClip where = Where.All;&lt;p&gt;if(条件一) where = where &amp;amp;&amp;amp; Products._.ProductID == 1;&lt;p&gt;if(条件二) where = where &amp;amp;&amp;amp; Products._.ProductID == 2;&lt;p&gt;//ProductID为1和2(相当于In操作)&lt;p&gt;if(条件三) where = where || Products._.ProductID.In(1,2);&lt;p&gt;//ProductID不为1和2(相当于Not In操作)&lt;p&gt;if(条件四) where = where || &lt;strong&gt;&lt;font color="#ff0000"&gt;!&lt;/font&gt;&lt;/strong&gt;Products._.ProductID.In(1,2);&lt;/p&gt;&lt;p&gt;……&lt;p&gt;DataAccess.ExampleSession.Update&amp;lt;Products&amp;gt;(Products._.ProductName, "测试产品", where);&lt;/p&gt;&lt;span id="Code_Open_Text_487659"&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;以上通过创建器的方式同样可以用事务来操作 trans.Excute(uc);&lt;p&gt;这里只是简单的介绍了一下，还有更多的功能需要用户使用时才能体会到。&lt;p&gt;数据的更新操作就讲解到这里，下一章将讲解数据的删除(Delete)操作&lt;p&gt;&lt;p&gt;有什么问题可以到此处：&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/02/1676233.html"&gt;MySoft组件问题反馈与疑难解答&lt;/a&gt;&lt;p&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/1710913.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710913.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/archive/2010/04/13/1710879.html</id><title type="text">MySoft.Data从入门到精通系列篇</title><summary type="text">MySoft.Data发布至今已经有一个半月了，文档方面还是一直很欠缺，下面还是简单将相关文章做下汇总吧，以下没有链接的文档会逐步完成，这里只是简单的列一下大纲。MySoft.Data的目的是为了用户可以快速实现数据的CURD操作，并减轻用户频繁编写数据库操作的工作量，目前支持MSAccess,Sql Server (2000/2005),Oracle,Sqlite,MySql,Firebird等...</summary><published>2010-04-13T02:30:00Z</published><updated>2010-04-13T02:30:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710879.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710879.html"/><content type="html">&lt;p&gt;MySoft.Data发布至今已经有一个半月了，文档方面还是一直很欠缺，下面还是简单将相关文章做下汇总吧，以下没有链接的文档会逐步完成，这里只是简单的列一下大纲。&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data的目的是为了用户可以快速实现数据的CURD操作，并减轻用户频繁编写数据库操作的工作量，目前支持MSAccess,Sql Server (2000/2005),Oracle,Sqlite,MySql,Firebird等数据库。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;-------------------------------------------------------------------------------------- &lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/01/1675730.html"&gt;支持多表联合查询组件MySoft.Data正式发布(下载)&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/04/1678722.html"&gt;MySoft组件之MySoft.Data API&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/07/1680279.html"&gt;MySoft.Data从入门到精通系列(一)【生成实体】&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/08/1680743.html"&gt;MySoft.Data从入门到精通系列(二)【生成实体续(插件的使用)】&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/11/1683566.html"&gt;MySoft.Data从入门到精通系列(三)【DbSession的配置】&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/12/1684566.html"&gt;MySoft.Data从入门到精通系列(四)【数据插入】&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710913.html"&gt;MySoft.Data从入门到精通系列(五)【数据更新】&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(六)【数据删除】&lt;/p&gt;&#xD;
&lt;p&gt;--------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;MySoft.Data数据查询&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(七)【单表查询】&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(八)【多表联合查询】&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(九)【基于表关系查询】&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(十)【子查询（In、NotIn操作）】&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(十一)【Union查询】&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(十二)【分页查询】&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(十三)【分组与聚合操作】&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(十四)【字段内联查询】&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列(十五)【多条件与排序】&lt;/p&gt;&#xD;
&lt;p&gt;--------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;MySoft.Data数据处理sql与proc处理&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列之sql篇&lt;/p&gt;&#xD;
&lt;p&gt;MySoft.Data从入门到精通系列之proc(存储过程)篇&lt;/p&gt;&#xD;
&lt;p&gt;--------------------------------------------------------------------------------------&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/02/1676233.html"&gt;MySoft组件问题反馈与疑难解答&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;QQ:121849018 &lt;/p&gt;&#xD;
&lt;p&gt;MSN:maoyong181@hotmail.com &lt;/p&gt;&#xD;
&lt;p&gt;Gmail:mysoft181@gmail.com&lt;/p&gt;&#xD;
&lt;p&gt;QQ讨论群(MySoft)：群一：27071789&amp;nbsp; 群二:107193048&lt;/p&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/1710879.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/04/13/1710879.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/archive/2010/03/26/1696586.html</id><title type="text">MySoft.Data新版v2.7.3 beta发布，修正较多bug，新增功能尚未完全测试</title><summary type="text">1.新增SetProvider()方法，可以很方便对DbSession设置任意驱动 2.修正Access中使用Sum()或Avg()等聚合操作时的bug 3.修正通过AddParameters添加的参数无法输出值的bug 4.修正了Oracle中有排序时ToSingle方法读取的数据不正确的bug 5.修正了实体中没有主键时进行关联查询出错的bug 6.强化了ISourceTable的处理，增加了...</summary><published>2010-03-25T16:27:00Z</published><updated>2010-03-25T16:27:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/archive/2010/03/26/1696586.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/archive/2010/03/26/1696586.html"/><content type="html">&lt;p&gt;1.新增SetProvider()方法，可以很方便对DbSession设置任意驱动 &lt;/p&gt;&#xD;
&lt;p&gt;2.修正Access中使用Sum()或Avg()等聚合操作时的bug &lt;/p&gt;&#xD;
&lt;p&gt;3.修正通过AddParameters添加的参数无法输出值的bug &lt;/p&gt;&#xD;
&lt;p&gt;4.修正了Oracle中有排序时ToSingle方法读取的数据不正确的bug &lt;/p&gt;&#xD;
&lt;p&gt;5.修正了实体中没有主键时进行关联查询出错的bug &lt;/p&gt;&#xD;
&lt;p&gt;6.强化了ISourceTable的处理，增加了自定义选择列、排序，筛选，多条关联赋值等一系列处理。 &lt;/p&gt;&#xD;
&lt;p&gt;7.对DataUtils.ConvertType进行加强处理，修正了内部一个转换出错的bug &lt;/p&gt;&#xD;
&lt;p&gt;8.修正了一个ISourceTable转Entity时，Entity的属性在Table中对应的列不存在时转换报错的bug &lt;/p&gt;&#xD;
&lt;p&gt;9.增加IEntityBase接口，要以通过此接口获取更改前的原始对象及当前实体状态 &lt;br /&gt;&amp;nbsp; 注：当前实体没有进行修改时，原始对象为null &lt;br /&gt;&amp;nbsp; User user = DbSession.From&amp;lt;User&amp;gt;().ToSingle(); &lt;br /&gt;&amp;nbsp; 假如此时user.Name为"张三"; &lt;br /&gt;&amp;nbsp; user.As&amp;lt;IEntityBase&amp;gt;().Original 此时为null; &lt;br /&gt;&amp;nbsp; 当操作user.Name = "李四"; &lt;br /&gt;&amp;nbsp; user.As&amp;lt;IEntityBase&amp;gt;().Original不再为null; &lt;br /&gt;&amp;nbsp; user.As&amp;lt;IEntityBase&amp;gt;().Original.As&amp;lt;User&amp;gt;().Name为"张三"; &lt;br /&gt;10.增加TableRelation对象，用来保存一组关系，用于多表关联时直接操作使用！ &lt;br /&gt;&amp;nbsp;&amp;nbsp; TableRelation&amp;lt;A&amp;gt; tr = new TableRelation&amp;lt;A&amp;gt;().LeftJoin&amp;lt;B&amp;gt;(A._.ID == B._.ID) &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;&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; .LeftJoin&amp;lt;C&amp;gt;(B._.PID == C._.PID); &lt;br /&gt;&amp;nbsp;&amp;nbsp; DbSession.Default.From(tr).Select(A._.All,B._.Name,C._PName).ToTable();&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;下一版本目标功能：&lt;/strong&gt;&lt;span style="color: #ff0000;"&gt;新增实体验证处理。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/maoyong/MySoft.Data_v2.7.3_beta_src.rar"&gt;MySoft组件之MySoft.Data v2.7.3 源码下载&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://files.cnblogs.com/maoyong/lib_v2.7.3.rar"&gt;MySoft工具集与dll库&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a target="_blank" href="http://www.cnblogs.com/maoyong/archive/2010/03/02/1676233.html"&gt;点击进入MySoft问题反馈&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;QQ群:27071789【mysoft官方群】 &lt;/p&gt;&#xD;
&lt;p&gt;9974676【xpress开源博客群-基于mysoft开发】&lt;/p&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/1696586.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/26/1696586.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/archive/2010/03/12/1684566.html</id><title type="text">MySoft.Data从入门到精通系列(四)【数据插入】</title><summary type="text">前一章讲解了如何配置DbSession，本章重点讲解利用MySoft.Data进行数据的插入操作 这里先引用一下上一章的DbSession的配置代码  针对上一节DbSession的配置，可以看到，这里对DataExample类扩展了两个方法，而在我的组件内部并没有Insert&amp;lt;T&amp;gt;(T item)与Update&amp;lt;T&amp;gt;(T item)方法，而是将其合并到了一个方法Save&amp;...</summary><published>2010-03-12T09:32:00Z</published><updated>2010-03-12T09:32:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/archive/2010/03/12/1684566.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/archive/2010/03/12/1684566.html"/><content type="html">&lt;p&gt;前一章讲解了如何配置DbSession，本章重点讲解利用MySoft.Data进行数据的插入操作&lt;/p&gt; &lt;p&gt;这里先引用一下上一章的DbSession的配置代码&lt;/p&gt; &lt;div style="width: 658px; height: 255px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_822726" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_822726').style.display='none'; document.getElementById('Code_Open_Image_822726').style.display='inline'; document.getElementById('Code_Open_Text_822726').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_822726" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_822726').style.display='none'; getElementById('Code_Closed_Image_822726').style.display='inline'; getElementById('Code_Closed_Text_822726').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_822726" &gt;DbSession配置&lt;/span&gt;&lt;span id="Code_Open_Text_822726"&gt;    &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// 数据库访问类&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataAccess&#xD;
    {&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 通过配置节来实例化DbSession&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DbSession DefaultSession = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DbSession("&lt;span style="color: #8b0000"&gt;DataExample&lt;/span&gt;");&#xD;
&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 通过自定义类来实例化DbSession&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DataExample ExampleSession = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DataExample();&#xD;
&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// DataExample会话类&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataExample : DbSession&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DataExample()&#xD;
            : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;("&lt;span style="color: #8b0000"&gt;DataExample&lt;/span&gt;")&#xD;
        {&#xD;
#&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; DEBUG&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.RegisterSqlLogger(log =&amp;gt;&#xD;
                {&#xD;
                    System.IO.File.WriteAllText("&lt;span style="color: #8b0000"&gt;c:\\log.txt&lt;/span&gt;", log);&#xD;
                });&#xD;
#endif&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 插入实体&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;typeparam name="T"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;param name="item"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Insert&amp;lt;T&amp;gt;(T item) where T : Entity&#xD;
        {&#xD;
            item.Detach();&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.Save(item);&#xD;
        }&#xD;
&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 更新实体&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;typeparam name="T"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;param name="item"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Update&amp;lt;T&amp;gt;(T item) where T : Entity&#xD;
        {&#xD;
            item.Attach();&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;.Save(item);&#xD;
        }&#xD;
    }&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;针对上一节DbSession的配置，可以看到，&lt;/span&gt;这里对DataExample类扩展了两个方法，而在我的组件内部并没有Insert&amp;lt;T&amp;gt;(T item)与Update&amp;lt;T&amp;gt;(T item)方法，而是将其合并到了一个方法Save&amp;lt;T&amp;gt;(T item)，外部通过item.Attach()与item.Detach()来改变实体的状态。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注：item.Attach()与item.Detach()方法还有更多强大的用法，下面会重点讲到！&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;也许有人会觉得合并在一起很难区分插入与修改，应该直接用方法名来区分比较好，当然OK，直接在这里加上两个方法即可，还可以扩展出更多的方法来适应你项目开发的需求，比如你完全可以扩展出一个保存多个对象的方法，如下：&lt;/p&gt;&#xD;
&lt;div style="width: 659px; height: 263px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_791853" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_791853').style.display='none'; document.getElementById('Code_Open_Image_791853').style.display='inline'; document.getElementById('Code_Open_Text_791853').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_791853" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_791853').style.display='none'; getElementById('Code_Closed_Image_791853').style.display='inline'; getElementById('Code_Closed_Text_791853').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_791853" &gt;一次插入多条数据的扩展&lt;/span&gt;&lt;span id="Code_Open_Text_791853"&gt;        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 一次插入多条数据&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;typeparam name="T"&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;param name="items"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; Insert&amp;lt;T&amp;gt;(IList&amp;lt;T&amp;gt; items) where T : Entity&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ret = 0;&#xD;
            &lt;span style="color: #0000ff"&gt;foreach&lt;/span&gt; (T item &lt;span style="color: #0000ff"&gt;in&lt;/span&gt; items)&#xD;
            {&#xD;
                ret += Insert(item);&#xD;
            }&#xD;
            &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; ret;&#xD;
        }&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;用方法名来区分固然也是好的，但如果需要保存一个实体列表，而这个列表中的实体有些是需要插入的，有些是需要更新的，你该如何处理，只有一种办法，把列表拆分为两个，分别来进行插入与更新。&lt;/p&gt;&lt;p&gt;而使用一个方法Save&amp;lt;T&amp;gt;(T item)可以很方便解决这个问题，在外部将需要插入的方法调用item.Detach(),需要更新的实体调用item.Attach()即可，然后一次传入内部进行操作，还可以为每个实体设置插入的字段或更新的字段！这样是否使用上更优雅一些呢，如下：&lt;/p&gt;&lt;div&gt;&lt;div style="width: 659px; height: 176px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_306579" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_306579').style.display='none'; document.getElementById('Code_Open_Image_306579').style.display='inline'; document.getElementById('Code_Open_Text_306579').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_306579" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_306579').style.display='none'; getElementById('Code_Closed_Image_306579').style.display='inline'; getElementById('Code_Closed_Text_306579').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_306579" &gt;Detach()方法的简单应用&lt;/span&gt;&lt;span id="Code_Open_Text_306579"&gt;            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
            DataAccess.ExampleSession.Save(product);&#xD;
            product.Detach(Products._.UnitPrice);&#xD;
            DataAccess.ExampleSession.Save(product);&lt;/pre&gt;&lt;/div&gt;&lt;/span&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果数据库中的某些字段有默认值，比如日期字段需要保存为getdate()，就可以通过Detach()方法将其字段移除而不进行插入！&lt;/p&gt;&lt;p&gt;好了，DbSession的方法扩展和简单应用就讲到这里，下面开始讲解如何使用DbSession来插入数据，领略MySoft.Data带给你强大的功能体验与快速开发的便捷吧！&lt;/p&gt;&lt;p&gt;以下操作都以数据库Northwind为例。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;一、强类型数据插入&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;准备工作：&lt;/p&gt;&lt;p&gt;新建一个MySoftExample.DataEntity的项目，使用工具将Northwind中的所有表生成实体，生成的结果如图，生成时将命名空间也设置为MySoftExample.DataEntity。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_81A9/tmp306_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp306" border="0" alt="tmp306" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_81A9/tmp306_thumb.png" width="248" height="329"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;生成以上实体项目后，再新建一个MySoftExample.Web项目，将MySoftExample.DataEntity项目添加到当前项目的引用中，下面就可以通过生成的实体进行数据的操作了。&lt;/p&gt;&lt;p&gt;下面的操作以Products实体为例进行操作：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1、单个实体数据插入&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_126126" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_126126').style.display='none'; document.getElementById('Code_Open_Image_126126').style.display='inline'; document.getElementById('Code_Open_Text_126126').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_126126" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_126126').style.display='none'; getElementById('Code_Closed_Image_126126').style.display='inline'; getElementById('Code_Closed_Text_126126').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_126126" &gt;插入单个对象&lt;/span&gt;&lt;span id="Code_Open_Text_126126"&gt;            &lt;span style="color: #008000"&gt;//实例化一个Products对象&lt;/span&gt;&#xD;
            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            &lt;span style="color: #008000"&gt;//插入单个对象&lt;/span&gt;&#xD;
            DataAccess.ExampleSession.Save(product);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;2、批量实体数据插入&lt;/strong&gt;&lt;/p&gt;&lt;span id="Code_Open_Text_699545"&gt;&lt;div style="width: 652px; height: 168px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_191620" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_191620').style.display='none'; document.getElementById('Code_Open_Image_191620').style.display='inline'; document.getElementById('Code_Open_Text_191620').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_191620" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_191620').style.display='none'; getElementById('Code_Closed_Image_191620').style.display='inline'; getElementById('Code_Closed_Text_191620').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_191620" &gt;插入一组对象&lt;/span&gt;&lt;span id="Code_Open_Text_191620"&gt;            &lt;span style="color: #008000"&gt;//实例化一组Products对象&lt;/span&gt;&#xD;
            List&amp;lt;Products&amp;gt; list = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;Products&amp;gt;();&#xD;
            &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index = 0; index &amp;lt; 10; index++)&#xD;
            {&#xD;
                list.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
                {&#xD;
                    ProductName = "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;" + index&#xD;
                });&#xD;
            }&#xD;
&#xD;
            &lt;span style="color: #008000"&gt;//批量保存数据&lt;/span&gt;&#xD;
            DbBatch batch = DataAccess.ExampleSession.BeginBatch(10);&#xD;
            list.ForEach(item =&amp;gt;&#xD;
            {&#xD;
                batch.Save(item);&#xD;
            });&#xD;
&#xD;
            batch.Process();&lt;/pre&gt;&lt;/div&gt;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;3、带事务单个实体插入(MySoft.Data内置实现DbTrans)&lt;/strong&gt;&lt;/p&gt;&lt;div style="width: 652px; height: 161px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_368505" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_368505').style.display='none'; document.getElementById('Code_Open_Image_368505').style.display='inline'; document.getElementById('Code_Open_Text_368505').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_368505" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_368505').style.display='none'; getElementById('Code_Closed_Image_368505').style.display='inline'; getElementById('Code_Closed_Text_368505').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_368505" &gt;插入单个对象(内置事务)&lt;/span&gt;&lt;span id="Code_Open_Text_368505"&gt;            &lt;span style="color: #008000"&gt;//实例化一个Products对象&lt;/span&gt;&#xD;
            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            &lt;span style="color: #008000"&gt;//使用事务进行数据插入&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (DbTrans trans = DataAccess.ExampleSession.BeginTrans())&#xD;
            {&#xD;
                &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&#xD;
                {&#xD;
                    trans.Save(product);&#xD;
                    trans.Commit();&#xD;
                }&#xD;
                &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&#xD;
                {&#xD;
                    trans.Rollback();&#xD;
                }&#xD;
            }&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;4、带事务批量实体插入(MySoft.Data内置实现DbTrans)&lt;/strong&gt;&lt;/p&gt;&lt;div style="width: 652px; height: 237px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_69152" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_69152').style.display='none'; document.getElementById('Code_Open_Image_69152').style.display='inline'; document.getElementById('Code_Open_Text_69152').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_69152" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_69152').style.display='none'; getElementById('Code_Closed_Image_69152').style.display='inline'; getElementById('Code_Closed_Text_69152').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_69152" &gt;插入一组对象(内置事务)&lt;/span&gt;&lt;span id="Code_Open_Text_69152"&gt;            &lt;span style="color: #008000"&gt;//实例化一组Products对象&lt;/span&gt;&#xD;
            List&amp;lt;Products&amp;gt; list = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; List&amp;lt;Products&amp;gt;();&#xD;
            &lt;span style="color: #0000ff"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff"&gt;int&lt;/span&gt; index = 0; index &amp;lt; 10; index++)&#xD;
            {&#xD;
                list.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
                {&#xD;
                    ProductName = "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;" + index&#xD;
                });&#xD;
            }&#xD;
&#xD;
            &lt;span style="color: #008000"&gt;//使用事务进行批量数据插入&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (DbTrans trans = DataAccess.ExampleSession.BeginTrans())&#xD;
            {&#xD;
                &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&#xD;
                {&#xD;
                    DbBatch batch = trans.BeginBatch(10);&#xD;
                    list.ForEach(item =&amp;gt;&#xD;
                    {&#xD;
                        batch.Save(item);&#xD;
                    });&#xD;
                    batch.Process();&#xD;
&#xD;
                    trans.Commit();&#xD;
                }&#xD;
                &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&#xD;
                {&#xD;
                    trans.Rollback();&#xD;
                }&#xD;
            }&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;5、创建外部数据库链接方式插入&lt;/strong&gt;&lt;/p&gt;&lt;div style="width: 654px; height: 274px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_46778" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_46778').style.display='none'; document.getElementById('Code_Open_Image_46778').style.display='inline'; document.getElementById('Code_Open_Text_46778').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_46778" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_46778').style.display='none'; getElementById('Code_Closed_Image_46778').style.display='inline'; getElementById('Code_Closed_Text_46778').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_46778" &gt;插入单个对象(外部链接)&lt;/span&gt;&lt;span id="Code_Open_Text_46778"&gt;            &lt;span style="color: #008000"&gt;//实例化一个Products对象&lt;/span&gt;&#xD;
            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (System.Data.Common.DbConnection conn = DataAccess.ExampleSession.CreateConnection())&#xD;
            {&#xD;
                &lt;span style="color: #008000"&gt;//插入单个对象&lt;/span&gt;&#xD;
                DataAccess.ExampleSession.SetConnection(conn).Save(product);&#xD;
            }&lt;/pre&gt;&lt;/div&gt;注：批量插入可以采用同样的方法处理！&lt;br&gt;&lt;/span&gt;&lt;p&gt;&lt;strong&gt;6、创建外部数据库事务方式插入&lt;/strong&gt;&lt;/p&gt;&lt;div style="width: 655px; height: 272px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_232885" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_232885').style.display='none'; document.getElementById('Code_Open_Image_232885').style.display='inline'; document.getElementById('Code_Open_Text_232885').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_232885" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_232885').style.display='none'; getElementById('Code_Closed_Image_232885').style.display='inline'; getElementById('Code_Closed_Text_232885').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_232885" &gt;插入单个对象(外部事务)&lt;/span&gt;&lt;span id="Code_Open_Text_232885"&gt;            &lt;span style="color: #008000"&gt;//实例化一个Products对象&lt;/span&gt;&#xD;
            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品1&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;using&lt;/span&gt; (System.Data.Common.DbTransaction trans = DataAccess.ExampleSession.BeginTransaction())&#xD;
            {&#xD;
                &lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&#xD;
                {&#xD;
                    &lt;span style="color: #008000"&gt;//插入单个对象&lt;/span&gt;&#xD;
                    DataAccess.ExampleSession.SetTransaction(trans).Save(product);&#xD;
                    trans.Commit();&#xD;
                }&#xD;
                &lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&#xD;
                {&#xD;
                    trans.Rollback();&#xD;
                }&#xD;
            }&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;span id="Code_Open_Text_46778"&gt;注：批量插入可以采用同样的方法处理！&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;item.Detach()方法的高级用法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;font color="#0000ff" size="4"&gt;1、指定某些字段使用数据默认值(不改变原有对象传入的状态)&lt;/font&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #008000"&gt;//插入时排除某些字段&lt;/span&gt;&lt;br&gt;Detach(&lt;span style="color: #0000ff"&gt;params&lt;/span&gt; Field[] removeFields);&lt;br&gt;&lt;br&gt;&lt;span style="color: #008000"&gt;//字段CategoryID不进行插入操作&lt;/span&gt;&lt;br&gt;product.Detach(Products._.CategoryID);&lt;br&gt;&lt;br&gt;&lt;span style="color: #008000"&gt;//ExcludeField插入时包括的字段&lt;/span&gt;&lt;br&gt;&lt;span style="color: #008000"&gt;//调用Field.All或Products._.All的Remove方法排除插入的字段可以返回ExcludeField&lt;/span&gt;&lt;br&gt;&lt;span style="color: #008000"&gt;//也就是说Detach会排除除Remove以外的所有字段&lt;/span&gt;&lt;br&gt;Detach(ExcludeField field); &lt;br&gt;&lt;br&gt;&lt;span style="color: #008000"&gt;//只插入ProductName字段&lt;/span&gt;&lt;br&gt;product.Detach(Field.All.Remove(Products._.ProductName));&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;说明一下：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;不改变原有对象的传状态是指，假如product对象已经在外面调用过如：&lt;/p&gt;&lt;p&gt;在之前调用了product.Detach(Product._.SupplierID);&lt;/p&gt;&lt;p&gt;此处再次调用会在原有的基础上再排除CategoryID，相当于SupplierID与CategoryID都不进行插入操作，而以下DetachAll()方法则是清除之前所有的状态，再进行当前的处理。&lt;/p&gt;&lt;br&gt;&lt;div&gt;&lt;em&gt;&lt;font color="#0000ff" size="4"&gt;2、指定某些字段使用数据默认值(改变原有对象传入的状态)&lt;/font&gt;&lt;/em&gt;&lt;/div&gt;&lt;div&gt;&lt;pre&gt;&lt;span style="color: #008000"&gt;//插入时排除某些字段&lt;/span&gt;&#xD;
DetachAll(&lt;span style="color: #0000ff"&gt;params&lt;/span&gt; Field[] removeFields);&#xD;
&#xD;
&lt;span style="color: #008000"&gt;//字段CategoryID不进行插入操作&lt;/span&gt;&#xD;
product.DetachAll(Products._.CategoryID);&#xD;
&#xD;
&lt;span style="color: #008000"&gt;//ExcludeField插入时包括的字段&lt;/span&gt;&#xD;
&lt;span style="color: #008000"&gt;//调用Field.All或Products._.All的Remove方法排除插入的字段可以返回ExcludeField&lt;/span&gt;&#xD;
&lt;span style="color: #008000"&gt;//也就是说DetachAll会排除除Remove以外的所有字段&lt;/span&gt;&#xD;
DetachAll(ExcludeField field); &#xD;
&#xD;
&lt;span style="color: #008000"&gt;//只插入ProductName字段&lt;/span&gt;&#xD;
product.DetachAll(Field.All.Remove(Products._.ProductName));&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;p&gt;&lt;strong&gt;InsertOrUpdate方法的使用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;当用户不知道当前实体是否在数据库中存在时，可以使用此方法。&lt;/p&gt;&lt;p&gt;内部将会根据主键去判断此实体在数据库中是否存在，然后再自动调用相应的方法来进行处理。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_647159" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_647159').style.display='none'; document.getElementById('Code_Open_Image_647159').style.display='inline'; document.getElementById('Code_Open_Text_647159').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_647159" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_647159').style.display='none'; getElementById('Code_Closed_Image_647159').style.display='inline'; getElementById('Code_Closed_Text_647159').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_647159" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_647159"&gt;            Products product = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Products()&#xD;
            {&#xD;
                ProductID = 1,&#xD;
                ProductName = "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;"&#xD;
            };&#xD;
&#xD;
            DataAccess.ExampleSession.InsertOrUpdate(product);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;p&gt;当然数据插入操作还有其它的方式(自己可以慢慢研究)：&lt;/p&gt;&lt;span id="Code_Open_Text_637775"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_555305" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_555305').style.display='none'; document.getElementById('Code_Open_Image_555305').style.display='inline'; document.getElementById('Code_Open_Text_555305').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_555305" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_555305').style.display='none'; getElementById('Code_Closed_Image_555305').style.display='inline'; getElementById('Code_Closed_Text_555305').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_555305" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_555305"&gt;            DataAccess.ExampleSession.Insert&amp;lt;Products&amp;gt;(&#xD;
                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Field[] { Products._.ProductName },&#xD;
                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[] { "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;" });&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; productID;&#xD;
            DataAccess.ExampleSession.Insert&amp;lt;Products, &lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;gt;(&#xD;
                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; Field[] { Products._.ProductName },&#xD;
                &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; &lt;span style="color: #0000ff"&gt;object&lt;/span&gt;[] { "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;" }, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; productID);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&lt;br&gt;&lt;/span&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/span&gt;&lt;span id="Code_Open_Text_791853"&gt;&lt;p&gt;&lt;strong&gt;&lt;span id="Code_Open_Text_791853"&gt;二、InsertCreator数据插入&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;&lt;/span&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span id="Code_Open_Text_791853"&gt;&lt;span id="Code_Open_Text_791853"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&#xD;
&lt;p&gt;通过插入创建器同样也可以达到上面的效果，也可以进行泛型方式进行数据插入，一般情况下创建器用于没有建立对象实体时直接对表和字段的操作。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、通过实体插入实体&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_285847" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_285847').style.display='none'; document.getElementById('Code_Open_Image_285847').style.display='inline'; document.getElementById('Code_Open_Text_285847').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_285847" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_285847').style.display='none'; getElementById('Code_Closed_Image_285847').style.display='inline'; getElementById('Code_Closed_Text_285847').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_285847" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_285847"&gt;           InsertCreator ic = InsertCreator.NewCreator()&#xD;
            .From&amp;lt;Products&amp;gt;()&#xD;
            .SetEntity&amp;lt;Products&amp;gt;(product);&#xD;
&#xD;
            DataAccess.ExampleSession.Excute(ic);&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、通过字符串表与字段插入数据&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_769636" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_769636').style.display='none'; document.getElementById('Code_Open_Image_769636').style.display='inline'; document.getElementById('Code_Open_Text_769636').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_769636" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_769636').style.display='none'; getElementById('Code_Closed_Image_769636').style.display='inline'; getElementById('Code_Closed_Text_769636').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_769636" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_769636"&gt;            InsertCreator ic = InsertCreator.NewCreator()&#xD;
            .From("&lt;span style="color: #8b0000"&gt;Products&lt;/span&gt;")&#xD;
            .AddInsert("&lt;span style="color: #8b0000"&gt;ProductName&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;");&#xD;
&#xD;
            DataAccess.ExampleSession.Excute(ic);&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、通过字符串表与字段插入数据并返回标识列值&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_28967" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_28967').style.display='none'; document.getElementById('Code_Open_Image_28967').style.display='inline'; document.getElementById('Code_Open_Text_28967').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_28967" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_28967').style.display='none'; getElementById('Code_Closed_Image_28967').style.display='inline'; getElementById('Code_Closed_Text_28967').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_28967" &gt;代码&lt;/span&gt;&lt;span id="Code_Open_Text_28967"&gt;            InsertCreator ic = InsertCreator.NewCreator()&#xD;
                .From("&lt;span style="color: #8b0000"&gt;Products&lt;/span&gt;")&#xD;
                .AddInsert("&lt;span style="color: #8b0000"&gt;ProductName&lt;/span&gt;", "&lt;span style="color: #8b0000"&gt;测试产品&lt;/span&gt;")&#xD;
                .SetIdentityField("&lt;span style="color: #8b0000"&gt;ProductID&lt;/span&gt;");&#xD;
&#xD;
            &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; productID;&#xD;
            DataAccess.ExampleSession.Excute(ic, &lt;span style="color: #0000ff"&gt;out&lt;/span&gt; productID);&lt;/pre&gt;&lt;/div&gt;&lt;/span&gt;&#xD;
&lt;p&gt;以上通过创建器的方式同样可以用事务来操作 trans.Excute(ic);&lt;/p&gt;&#xD;
&lt;p&gt;这里只是简单的介绍了一下，还有更多的功能需要用户使用时才能体会到。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;数据的插入操作就讲解到这里，下一章将讲解数据的修改(Update)操作&lt;/p&gt;&#xD;
&lt;p&gt;有什么问题可以到此处：&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/02/1676233.html"&gt;MySoft组件问题反馈与疑难解答&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/1684566.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/12/1684566.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/archive/2010/03/11/1683566.html</id><title type="text">MySoft.Data从入门到精通系列(三)【DbSession的配置】</title><summary type="text">前一章讲解了如何生成实体，下面就具体来谈谈怎么样来对DbSession进行配置吧。  DbSession（数据会话类）是数据操作的核心，所有数据库的操作都通过它来完成，所以在编写数据库访问层之前得实例化DbSession对象。 下面我们就来认识一下这个DbSession对象。  一、DbSession实例化配置  DbSession两有种方式来进行实例化 1、通过配置文件创建C、如果是用户自已实现...</summary><published>2010-03-11T08:17:00Z</published><updated>2010-03-11T08:17:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/archive/2010/03/11/1683566.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/archive/2010/03/11/1683566.html"/><content type="html">&lt;p&gt;前一章讲解了如何生成实体，下面就具体来谈谈怎么样来对DbSession进行配置吧。&lt;/p&gt; &lt;p&gt;DbSession（数据会话类）是数据操作的核心，所有数据库的操作都通过它来完成，所以在编写数据库访问层之前得实例化DbSession对象。&lt;/p&gt; &lt;p&gt;下面我们就来认识一下这个DbSession对象。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;一、DbSession实例化配置&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;DbSession两有种方式来进行实例化&lt;/p&gt; &lt;p&gt;&lt;strong&gt;1、通过配置文件创建&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;span style="color: #008000"&gt;//指定connectionStrings节的名称来实例化DbSession&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DbSession(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; connectName);&lt;/pre&gt;&lt;pre&gt;这种方式一般用于已经配置好connectionStrings节的用户，如下所示：&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;div&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"DataExample"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;connectionString&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Server=(local);Database=Northwind;Uid=sa;Pwd=sa;"&lt;/span&gt; &#xD;
         &lt;span style="color: #ff0000"&gt;providerName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"MySoft.Data.SqlServer9.SqlServer9Provider"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;上面的配置节如果是Web项目，则在web.config中指定，如果是winform项目，则在app.config中的指定&lt;/pre&gt;&lt;pre&gt;后面的providerName指定数据库链接所使用的驱动。&lt;/pre&gt;&lt;pre&gt;上面的配置方式只针对.net已经支持的驱动，如Access,SqlServer,Oracle&lt;/pre&gt;&lt;pre&gt;默认程序集为MySoft.Data.dll&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;如果是MySql,Firebird,SQLite需要额外的程序集支持，就需要按如下配置:&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;div&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;add&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"DataExample"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;connectionString&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"Server=(local);Database=Northwind;Uid=sa;Pwd=sa;"&lt;/span&gt;&#xD;
         &lt;span style="color: #ff0000"&gt;providerName&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"MySoft.Data.MySql.MySqlProvider, MySoft.Data.MySql"&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;providerName的写法是前面className,后面跟assemblyName。&lt;/pre&gt;&lt;pre&gt;而且需要添加相关的驱动，如：MySql需要添加MySql.Data.dll与MySoft.Data.MySql.dll&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #008000"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&lt;strong&gt;2、通过动态创建DbProvider&lt;/strong&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #008000"&gt;//通过创建驱动的方式来实例化DbSession&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DbSession(DbProvider dbProvider);&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;这种方式一般用于需要动态创建会话对象的用户&lt;/pre&gt;&lt;pre&gt;DbProvider是一个抽象类，用户还可以自行扩展此驱动。&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;动态创建DbProvider来实例化DbSession会话:&lt;/pre&gt;&lt;pre&gt;A、可以传入connectionName来创建驱动，此时connectionName配置节可以不用写providerName;&lt;/pre&gt;&#xD;
&lt;div&gt;&lt;pre&gt;DbProvider provider = ProviderFactory.CreateDbProvider("&lt;span style="color: #8b0000"&gt;DataExample&lt;/span&gt;", ProviderType.SqlServer9);&#xD;
DbSession DataExample = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DbSession(provider);&#xD;
&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;B、通过传入connectionString来创建驱动，内部ProviderType枚举已经将支持的驱动罗列出来。&#xD;
DbProvider provider = ProviderFactory.CreateDbProvider(ProviderType.SqlServer9, &lt;/pre&gt;&lt;pre&gt;"&lt;span style="color: #8b0000"&gt;Server=(local);Database=Northwind;Uid=sa;Pwd=sa;&lt;/span&gt;");&#xD;
DbSession DataExample = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DbSession(provider);&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;C、如果是用户自已实现的驱动，可以通过第三种方式来创建驱动。&lt;/p&gt;&lt;pre&gt;DbProvider provider = ProviderFactory.CreateDbProvider(&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; assemblyName, &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; className,&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;string&lt;/span&gt; connectionString);&#xD;
DbSession DataExample = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DbSession(provider);&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;不过对于一般用于，通过内置的驱动已经完全够用了。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;二、DbSession自定义实例化&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;DbSession实例化有两种方式，直接实例化DbSession,如果内置的DbSession.Default就是其中一种。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;DbSession.Default：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这是DbSession内部一个静态的DbSession对象，默认创建自&lt;span style="color: #800000"&gt;connectionStrings&lt;/span&gt;中的最后一个配置节中的数据库链接，如果providerName为空，将默认为SqlServer2000.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面就讲一下如何来实例化DbSession来进行数据的访问&lt;/p&gt;&#xD;
&lt;p&gt;新建一个MySoftExample.Web项目。&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/414b99d0bb81_10CEA/tmp2F82_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp2F82" border="0" alt="tmp2F82" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/414b99d0bb81_10CEA/tmp2F82_thumb.png" width="183" height="26"&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;然后新建一个DataAccess的类，用来进行数据的访问类，名字可以自己定义。&lt;/p&gt;&#xD;
&lt;p&gt;讲解也比较费事，直接贴上代码：&lt;/p&gt;&#xD;
&lt;div style="width: 667px; height: 536px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_481951" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_481951').style.display='none'; document.getElementById('Code_Open_Image_481951').style.display='inline'; document.getElementById('Code_Open_Text_481951').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_481951" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_481951').style.display='none'; getElementById('Code_Closed_Image_481951').style.display='inline'; getElementById('Code_Closed_Text_481951').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_481951" &gt;实例化DbSession&lt;/span&gt;&lt;span id="Code_Open_Text_481951"&gt;    &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// 数据库访问类&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataAccess&#xD;
    {&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 通过配置节来实例化DbSession&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DbSession DefaultSession = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DbSession("&lt;span style="color: #8b0000"&gt;DataExample&lt;/span&gt;");&#xD;
&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// 通过自定义类来实例化DbSession&lt;/span&gt;&#xD;
        &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;readonly&lt;/span&gt; DataExample ExampleSession = &lt;span style="color: #0000ff"&gt;new&lt;/span&gt; DataExample();&#xD;
&#xD;
    }&#xD;
&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// DataExample会话类&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataExample : DbSession&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DataExample()&#xD;
            : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;("&lt;span style="color: #8b0000"&gt;DataExample&lt;/span&gt;")&#xD;
        {&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.RegisterSqlLogger(log =&amp;gt;&#xD;
                {&#xD;
                    System.IO.File.WriteAllText("&lt;span style="color: #8b0000"&gt;c:\\log.txt&lt;/span&gt;", log);&#xD;
                });&#xD;
        }&#xD;
    }&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进行以上配置后，用户可以有三种方式来操作数据，效果都一样的:&lt;/p&gt;&lt;p&gt;只不过ExampleSession操作数据库会写日志到c:\\log.txt文件。&lt;/p&gt;&lt;span style="display: none" id="Code_Open_Text_481951"&gt;&lt;p&gt;User user = new User() { name = “张三"" };&lt;/p&gt;&lt;p&gt;DbSession.Default.Save(user);&lt;/p&gt;&lt;p&gt;DataAccess.DefaultSession.Save(user);&lt;/p&gt;&lt;p&gt;DataAccess.ExampleSession.Save(user);&lt;/p&gt;&lt;/span&gt;&lt;p&gt;通过继承可以很方便的实现注册写日志事件。而且对外显示的名字为DataExample，这样是否显得更加清晰和雅观呢。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;如果不需要写日志，将注册事件的代码注释掉即可，还有一种方式是通过宏的方式，如下：&lt;/p&gt;&lt;div style="width: 664px; height: 282px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_301867" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_301867').style.display='none'; document.getElementById('Code_Open_Image_301867').style.display='inline'; document.getElementById('Code_Open_Text_301867').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_301867" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_301867').style.display='none'; getElementById('Code_Closed_Image_301867').style.display='inline'; getElementById('Code_Closed_Text_301867').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_301867" &gt;注册日志事件&lt;/span&gt;&lt;span id="Code_Open_Text_301867"&gt;    &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// DataExample会话类&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; DataExample : DbSession&#xD;
    {&#xD;
        &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; DataExample()&#xD;
            : &lt;span style="color: #0000ff"&gt;base&lt;/span&gt;("&lt;span style="color: #8b0000"&gt;DataExample&lt;/span&gt;")&#xD;
        {&#xD;
#&lt;span style="color: #0000ff"&gt;if&lt;/span&gt; DEBUG&#xD;
            &lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.RegisterSqlLogger(log =&amp;gt;&#xD;
                {&#xD;
                    System.IO.File.WriteAllText("&lt;span style="color: #8b0000"&gt;c:\\log.txt&lt;/span&gt;", log);&#xD;
                });&#xD;
#endif&#xD;
        }&#xD;
    }&lt;/pre&gt;&lt;/div&gt;&lt;/span&gt;&lt;p&gt;这样在Release模式下注册事件的代码将失效，这样便于在Debug模式下调试，发布时就不需要写日志了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br&gt;DbSession的配置就讲解到这里，下一章将讲述如何使用DbSession来进行数据插入操作！&lt;/p&gt;&#xD;
&lt;p&gt;有什么问题可以到此处：&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/02/1676233.html"&gt;MySoft组件问题反馈与疑难解答&lt;/a&gt;&lt;br&gt;&lt;/p&gt;&lt;strong&gt;注：此段时间工作上比较忙，故文档更新比较慢，让大家在使用上造成的困扰表示抱歉！&lt;/strong&gt;&lt;br&gt;&lt;br&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;div&gt;&lt;br&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/1683566.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/11/1683566.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/maoyong/archive/2010/03/08/1680743.html</id><title type="text">MySoft.Data从入门到精通系列(二)【生成实体续(插件的使用)】</title><summary type="text">前一章讲解了如何使用实体生成直接生成实体，本来此章打算讲解如何使用已经生成的实体来进行开发的，介于园子里很多朋友都不知道如何使用实体的插件，这章就着重讲一下实体生成插件的使用！  前面已经说明了插件如何安装，并针对vs.net2005与vs.net2008修改相应的配置，下面就来说说怎样在vs.net下使用插件，本人所用的开发工具为vs.net 2008。  一、打开vs.net查看插件是否启用 ...</summary><published>2010-03-08T05:40:00Z</published><updated>2010-03-08T05:40:00Z</updated><author><name>MySoft</name><uri>http://www.cnblogs.com/maoyong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/maoyong/archive/2010/03/08/1680743.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/maoyong/archive/2010/03/08/1680743.html"/><content type="html">&lt;p&gt;前一章讲解了如何使用实体生成直接生成实体，本来此章打算讲解如何使用已经生成的实体来进行开发的，介于园子里很多朋友都不知道如何使用实体的插件，这章就着重讲一下实体生成插件的使用！&lt;/p&gt; &lt;p&gt;前面已经说明了插件如何安装，并针对vs.net2005与vs.net2008修改相应的配置，下面就来说说怎样在vs.net下使用插件，本人所用的开发工具为vs.net 2008。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;一、打开vs.net查看插件是否启用&lt;/p&gt; &lt;p&gt;如下图所示，如果插件安装成功，在此处将可以看到以下界面&lt;/p&gt; &lt;p&gt;如果插件未启用，请勾上启用，然后确定！&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_B6AF/tmp49D4_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp49D4" border="0" alt="tmp49D4" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_B6AF/tmp49D4_thumb.png" width="194" height="284"&gt;&lt;/a&gt;&amp;nbsp;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_B6AF/tmpFABC_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmpFABC" border="0" alt="tmpFABC" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_B6AF/tmpFABC_thumb.png" width="448" height="328"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;二、新建一个C#或vb.net的类库项目&lt;/p&gt; &lt;p&gt;此项目只用于生成实体所用，所以我命名MySoftExample.EntityDesign&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_B6AF/tmp4056_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp4056" border="0" alt="tmp4056" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_B6AF/tmp4056_thumb.png" width="230" height="22"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;三、用生成工具生成接口文件&lt;/p&gt; &lt;p&gt;这里不需要勾上【从数据库直接生成实体】,选择右边的表后点击生成实体接口即可。&lt;/p&gt; &lt;p&gt;生成单个文件就在项目中建一个EntitiesDesign.cs文件，然后将代码复制过去&lt;/p&gt; &lt;p&gt;为每个接口生成一个独立的文件，在下方选择刚才项目所在的文件夹，点击生成多个文件即可&lt;/p&gt; &lt;p&gt;具体参照&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/07/1680279.html"&gt;前一单(生成实体)：&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_B6AF/tmp7194_2.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="tmp7194" border="0" alt="tmp7194" src="http://images.cnblogs.com/cnblogs_com/maoyong/WindowsLiveWriter/MySoft.Data_B6AF/tmp7194_thumb.png" width="655" height="476"&gt;&lt;/a&gt;&lt;/p&gt; &lt;p&gt;到此为止，接口文件就生成完了，如果字段属性有备注说明，这里会自动生成注释的。&lt;/p&gt; &lt;p&gt;四、配置实体生成的xml&lt;/p&gt; &lt;p&gt;首先将lib目录下的EntityDesignConfig.xml文件复制到MySoftExample.Design项目里&lt;/p&gt; &lt;div&gt; &lt;div&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml version="1.0" encoding="utf-8" &lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityDesignConfiguration&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;xsi&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;xsd&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://www.w3.org/2001/XMLSchema"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;CompileMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Debug&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;CompileMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;InputDllName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;EntityDesign.dll&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;InputDllName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;OutputLanguage&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;C#&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;OutputLanguage&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;OutputNamespace&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;EntityModel&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;OutputNamespace&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityCodePath&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;..\EntityModel\Entities.cs&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityCodePath&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityDesignConfiguration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;br&gt;打开此文件将看到上面的配置信息:&lt;/p&gt;&#xD;
&lt;p&gt;1、 CompileMode：表示编译的模式,默认为debug &#xD;
&lt;p&gt;2、 InputDllName：表示输入实体接口类的dll文件名，即该项目生成的dll的文件名 &#xD;
&lt;p&gt;3、 OutputLanguage：表示输出实体类的语言，默认为C#，也可以为vb.net &#xD;
&lt;p&gt;4、 OutputNamespace：表示输出实体类的命名空间 &#xD;
&lt;p&gt;5、 EntityCodePath：表示输出实体类文件的路径，即把由实体接口类生成的实体类生成完存放的路径。 &#xD;
&lt;p&gt;支持相对路径，..\表示前一级目录 &#xD;
&lt;p&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityCodePath&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;配置是支持单个文件或文件夹的，如果配置节的路径为文件名，则生成单个文件，如果是目录名则每个接口生成一个实体文件，我这里配置为每个实体生成独立的文件。 &#xD;
&lt;p&gt;我将配置好的xml发出来做为示例&lt;/p&gt;&#xD;
&lt;div&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;?&lt;/span&gt;xml version="1.0" encoding="utf-8" &lt;span style="color: #0000ff"&gt;?&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityDesignConfiguration&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;xsi&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://www.w3.org/2001/XMLSchema-instance"&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;:&lt;span style="color: #ff0000"&gt;xsd&lt;/span&gt;=&lt;span style="color: #0000ff"&gt;"http://www.w3.org/2001/XMLSchema"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;CompileMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Debug&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;CompileMode&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;InputDllName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;MySoftExample.EntityDesign.dll&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;InputDllName&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;OutputLanguage&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;C#&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;OutputLanguage&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;OutputNamespace&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;MySoftExample.DataEntity&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;OutputNamespace&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
  &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityCodePath&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;..\MySoftExample.DataEntity\&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityCodePath&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;EntityDesignConfiguration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;&lt;span style="color: #0000ff"&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&lt;/span&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&#xD;
&lt;p&gt;具体怎样配置请参考&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/01/1675777.html"&gt;MySoft.Data的使用说明&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;五、将接口通过插件来生成实体&lt;/p&gt;&#xD;
&lt;p&gt;配置好以上xml后，点击生成接口项目，此时只要配置没有问题，则会自动生成所需的文件。&lt;/p&gt;&#xD;
&lt;p&gt;其实插件会自动调用MySoft.Tools.EntityDesign.exe来生成。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注意：如果设置的是生成文件夹，则需要将生成的文件包括在项目中&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 如果设置的生成文件，则之前要先创建好这个文件在实体项目中！&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过接口来生成实体还有更加强大的功能，如下所示：&lt;/p&gt;&#xD;
&lt;div style="width: 671px; height: 361px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_701238" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_701238').style.display='none'; document.getElementById('Code_Open_Image_701238').style.display='inline'; document.getElementById('Code_Open_Text_701238').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_701238" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_701238').style.display='none'; getElementById('Code_Closed_Image_701238').style.display='inline'; getElementById('Code_Closed_Text_701238').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_701238" &gt;给属性加上注释或使用枚举&lt;/span&gt;&lt;span id="Code_Open_Text_701238"&gt;    /// &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;summary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    /// 用户类型&#xD;
    /// &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;summary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    public enum UserType&#xD;
    {&#xD;
        /// &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;summary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        /// 普通的&#xD;
        /// &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;summary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        General,&#xD;
        /// &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;summary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        /// 超级用户&#xD;
        /// &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;summary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
        Admin&#xD;
    }&#xD;
&#xD;
    /// &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;summary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    /// 用户信息&#xD;
    /// &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;summary&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&#xD;
    [Description("用户信息")]&#xD;
    public interface User : IEntity&#xD;
    {&#xD;
        [PrimaryKey]&#xD;
        [Description("用户ID")]&#xD;
        int UserID { get; }&#xD;
&#xD;
        [Description("用户名")]&#xD;
        string UserName { get; set; }&#xD;
&#xD;
        [Description("用户类型")]&#xD;
        UserType UserType { get; set; }&#xD;
    }&lt;/pre&gt;&lt;/div&gt;通过接口的方式可以给属性或类加上注释说明，必须通过Description来添加注释，否则无法附加到生成的实体中。&lt;br&gt;&lt;/span&gt;&#xD;
&lt;p&gt;本组件还支持枚举的方式进行增删改查，这样对用户的使用上会更加简便！&lt;/p&gt;&#xD;
&lt;p&gt;如果数据库中对字段进行增删改，只需要将此接口中的属性更改即可&lt;/p&gt;&#xD;
&lt;p&gt;还可以通过以下方式处理：&lt;/p&gt;&#xD;
&lt;div style="width: 659px; height: 244px" style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;pre&gt;&lt;img style="display: none" id="Code_Closed_Image_804913" onclick="this.style.display='none'; document.getElementById('Code_Closed_Text_804913').style.display='none'; document.getElementById('Code_Open_Image_804913').style.display='inline'; document.getElementById('Code_Open_Text_804913').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif" width="11" height="16"&gt;&lt;img id="Code_Open_Image_804913" onclick="this.style.display='none'; document.getElementById('Code_Open_Text_804913').style.display='none'; getElementById('Code_Closed_Image_804913').style.display='inline'; getElementById('Code_Closed_Text_804913').style.display='inline';" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif" width="11" height="16"&gt;&lt;span style="display: none" id="Code_Closed_Text_804913" &gt;使用Mapping来修改字段的映射&lt;/span&gt;&lt;span id="Code_Open_Text_804913"&gt;    &lt;span style="color: #808080"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// 用户信息&lt;/span&gt;&#xD;
    &lt;span style="color: #808080"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&#xD;
    [Description("&lt;span style="color: #8b0000"&gt;用户信息&lt;/span&gt;")]&#xD;
    [Mapping("&lt;span style="color: #8b0000"&gt;User&lt;/span&gt;")]&#xD;
    &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;interface&lt;/span&gt; UserEntity : IEntity&#xD;
    {&#xD;
        [PrimaryKey]&#xD;
        [Description("&lt;span style="color: #8b0000"&gt;用户ID&lt;/span&gt;")]&#xD;
        [Mapping("&lt;span style="color: #8b0000"&gt;UserID&lt;/span&gt;")]&#xD;
        &lt;span style="color: #0000ff"&gt;int&lt;/span&gt; ID { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; }&#xD;
&#xD;
        [Description("&lt;span style="color: #8b0000"&gt;用户名&lt;/span&gt;")]&#xD;
        [Mapping("&lt;span style="color: #8b0000"&gt;UserName&lt;/span&gt;")]&#xD;
        &lt;span style="color: #0000ff"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&#xD;
&#xD;
        [Description("&lt;span style="color: #8b0000"&gt;用户类型&lt;/span&gt;")]&#xD;
        [Mapping("&lt;span style="color: #8b0000"&gt;UserType&lt;/span&gt;")]&#xD;
        UserType Type { &lt;span style="color: #0000ff"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff"&gt;set&lt;/span&gt;; }&#xD;
    }&lt;/pre&gt;&lt;/div&gt;&lt;br&gt;&lt;/span&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注：此枚举需要放在独立的项目中，接口项目与实体项目都需要引用此枚举！&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 对接口的修改需要重新生成实体。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;插件的使用到此为止，下一章将讲解如何配置DbSession &#xD;
&lt;p&gt;如果要使项目编译成功，需要添加 MySoft.Data.dll到此项目中 &#xD;
&lt;p&gt;有什么问题可以到此处：&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/02/1676233.html"&gt;MySoft组件问题反馈与疑难解答&lt;/a&gt;&lt;img src="http://www.cnblogs.com/maoyong/aggbug/1680743.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/maoyong/archive/2010/03/08/1680743.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
