<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky5.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.feedsky.com/wnobleman" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/wnobleman" type="application/rss+xml"></fs:self_link><lastBuildDate>Tue, 14 Feb 2012 18:10:00 GMT</lastBuildDate><title>博客园-首页原创.NET区</title><description>专注于.NET技术</description><link atom:type="text/html">http://www.cnblogs.com/</link><id xmlns="http://www.w3.org/2005/Atom">http://feed.cnblogs.com/blog/sitehome/rss</id><generator xmlns="http://www.w3.org/2005/Atom">CNBlogs BlogServer</generator><link xmlns="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/sitehome/rss"></link><pubDate>Tue, 14 Feb 2012 19:10:36 GMT</pubDate><item><title>程序员零起步（二）——团队</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/xiaomiji/archive/2012/02/15/2352037.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>小米呀</name><uri>http://www.cnblogs.com/xiaomiji/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;谢谢大家的支持，费话了这么多，肯定是要继续费话的，嘿嘿，到上海奔波了几个月，生活未稳定，没心思过节呀，不过快乐还是要天天有的。&lt;/p&gt;
&lt;p&gt;2011年3月，目前人生的一个很重要的转折（当然，不知道以后干吗，只能说目前）毅然没有选择考研，一个机遇，进了吴老师带的诚合工作室，开始了我的团队生活。介绍一下，诚合工作室是我们学校网络部的一个老师开创的，到我这里，已经培养了三批学生了，进去的时候，要我们从Java、.net、c++、美工里面选一个组进去学习，大概一个组有五个人左右的样子，已经有一批毕业了，到外面去工作了。当时跟我一起进去的有十一个人，一起的话，美工组除了组长是男生，被五个女生包围外，其余组几乎是男生。有几个女生之前也是选.net的，不过学了一段时间，老师还是建议她们转美工了，c++是全部是男生，呵呵，对于我对语言方面了解，c++是男女比例最失调的，特别是做游戏，几乎没有女生会选择吧。虽然我现在比较喜欢编程，不过确实对算法方面，不是那么的感兴趣，但是，要是让我去配色、Ps的话，我还是编程吧，那个，实在是觉得要天赋，我是觉得自己是没有一点艺术素养的人。&lt;/p&gt;
&lt;p&gt;那个时候的我也已经大三了，马上要面临毕业了，还是选择了上手最快的.net，也出于之前看过一点c#的，自认为有点基础，真的接触，发现自己真的是什么都不知道，HTML是什么都还不怎么清楚，更谈不上JavaScript、JQuery什么的了。对于我来说也是件好事，一听到新的东西就感兴趣，那时候也不愿意去做别的什么了，去上课，睡觉的也是一大堆，每天去抢最后一排，由于经常不急不忙，以至于最后一排也抢不到，又不好意思在第一排打瞌睡，所幸就天天窝在工作室学习了。那里学习环境确实很不错，大家年龄也差不多，也不是为了赚钱，也不用比成绩，完全兴趣爱好，相处的都非常好，加上吴老师跟陈老师确实也对我们特别好，网络信息部的老师，手上有好多学校的项目，哎，不得不说一句，学校做的东西确实有点垃圾，也就都拿给我们练手了，也充当经费，差不多每两个星期会组织我们活动，学得确实比较快，如果你在的学校有这样的机会，一点不要放弃，好好在里面学，这些都没有人管的，没有人压迫你做什么，只提供一个环境，差不多也算是社会实践吧，起码我觉得，如果没有在里面的一年多，我出来是觉得没有人理的，先不要谈工作，应届毕业生，人家面试都不给机会的（来上海几个月了，面试了好多次，也从来没有觉得自己在学校做过一点项目就了不起，因为这充其量也只能当作一个入门，商业化的东西跟我们在学校学的确实相差很大）。&lt;/p&gt;
&lt;p&gt;无论在哪里，我都觉得虚心很重要，进诚合工作室之前，里面已经有一批人是比我早进去一两个月的，还有一些是之前自己有学过编程的，那时候觉得他们好厉害（确实比我厉害好多）。每个组有一个组长，算是带我们吧，跟组长交流后，他说他差不多也是自学，说是培训了一个月，真正做程序的人，哪里会跟你讲什么，就是带他们入门吧，组长也比较好，把那些个老师说的话跟我说了一点，告诉我，没事多到网上看看，带着好奇心，现在工作室也有几个项目，老师就是给我们几个需求说明书，详细的都没有，就告诉我们要实现些个什么功能，怎么实现不管你们，反正要做出他要的效果。没办法，就做的，不会就百度，有空的时候，工作室有一堆书就拿来看，程序员加美工，两三个月下来，也做出了一堆的东西来，说是说是系统，B/S模式的，用.net开发的也有、Java开发的也有（c++组的一直在搞研究，至今不懂他们在研究什么深奥的东西，很困惑），没有什么测试人员，随便来几个无聊的人攻击一下，就差不多瘫了。系统烂是有点烂，不管怎么说，从做设计到编码，再到发布，加最痛苦的无数次的修改，总算还是小有点成就感，现在还很怀念那时候大家一起做开发，起码现在在公司是很难有这种感觉的，所以也一直想毕业后，找到一个好一点的公司，进一个好一点的团队，稳定一点，好好做开发。&lt;/p&gt;
&lt;p&gt;吴老师现在差不多三十岁，一直说自己现在再不创业，就没有机会了，半年前就把工作室注册成了公司，暑假的时候就把我们全部招回去，去外面接项目。回去了的也就六七个，六月底七月初学校安排我们专业到南昌中兴软件园培训了半个来月的Java，五个人一组也就在那边做了一个小项目，我们.net组的，大家关系都很好，项目也一直是最多的，去了一半，中兴培训一完，回家一个星期我也就去学校了。其余的当然没有想过把自己以后的工作也押到刚起步的公司上，或是偷偷懒，暑假好好玩去了。我那时候是去了的，无论之后怎么选择，只要有锻炼、学习的机会，都是不会放弃的，确实很值得这样做，年轻就是要多奋斗吧。去的人少，又是去外面接项目，不用说，那个月很辛苦。老师也比较忙，出于对我们几个的信任，有时候去跟客户谈项目，就是我开着老师的车跟我们组组长两个人去跟客户谈需求的，虽说考了驾照，旁边没坐个会开车的，又在市区里面开，真是每天擦汗啊。跟外面的人谈项目也不像给学校做那么简单，难受是不免有的，他们也不懂程序这方面，什么乱七八糟的要求都有，而且觉得这个东西很简单，也不肯给多少钱，还经常要加班加点的。有一次碰到一个老表，直接要我们一天给他设计一个新闻发布网站，谈了四五次，终于通过了，结果通过的那天，就说他们领导明天要检查，不可能是不能点的呀，要是能看到实际内容的。哎，真是没办法，直接把我们两留到那里（那时候是下乡，听着真别扭），硬是通宵一个晚上把他做成他口里的，所谓能&amp;ldquo;动&amp;rdquo;的网站。嗯，大家应该也都想到了，我们之前做项目，怎么了积累了一些架构、模板什么的，新闻类的也是有的，也只有远程连接，拿过来，项目名称都来不及改，找点数据导到数据库里，先用着了。。。&lt;/p&gt;
&lt;p&gt;暑假，很充实的过去了，经常是不知道什么时候是白天，什么时候是黑夜的，知道自己技术不咋的，做人方面，见识方面，到是有点小长进。&lt;/p&gt;
&lt;p&gt;大四了，考研的考研，也陆续有人出去找工作了，学校也开了招聘会，哎，可是招计算机的几乎只有去做Word、Excel的（我在的学校，只有是工科方面的），看到那些个同级的签了就业协议，异或是看着考研的人那么努力奔图书馆，自己也按捺不住了，也急得慌，虽然吴老师说，公司给我们几个股份（那时候坚持下来的，08级的也就几个组长跟副组长了），项目拿钱给我们分红，但是，老师毕竟是老师，永远做不到以老板或是共同创业的伙伴对待，再次，江西软件方面的发展，对于还在学习的我们，足足不够，大家也就降降四处漂了。&lt;/p&gt;
&lt;p&gt;一直没提，对于偏向于理科方面的我，英语不是很好，刚进大学就选学日语去了，刚开始也只是学校提供机会，可以不上英语课，不考英语，去上日语课，后面也竟喜欢上了，那时没人指引，也不知道考证的重要性，也没去考。但是，出于想做程序的另一方面，也不想丢掉自己的日语，找工作的时候，程序员无非是到北上广的，上海这边对日外包的比较多，一个机遇，就跑过来的。&lt;/p&gt;
&lt;p&gt;又写了一堆，还没开始讲自己的求职经历，明天继续吧。。。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/xiaomiji/aggbug/2352037.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/xiaomiji/archive/2012/02/15/2352037.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>等待毕业的大四女本科生，发布一系列自己的程序员学习、七次求职经历。。。一个机遇，进了吴老师带的诚合工作室，开始了我的团队生活。</description><content:encoded>&lt;p&gt;谢谢大家的支持，费话了这么多，肯定是要继续费话的，嘿嘿，到上海奔波了几个月，生活未稳定，没心思过节呀，不过快乐还是要天天有的。&lt;/p&gt;
&lt;p&gt;2011年3月，目前人生的一个很重要的转折（当然，不知道以后干吗，只能说目前）毅然没有选择考研，一个机遇，进了吴老师带的诚合工作室，开始了我的团队生活。介绍一下，诚合工作室是我们学校网络部的一个老师开创的，到我这里，已经培养了三批学生了，进去的时候，要我们从Java、.net、c++、美工里面选一个组进去学习，大概一个组有五个人左右的样子，已经有一批毕业了，到外面去工作了。当时跟我一起进去的有十一个人，一起的话，美工组除了组长是男生，被五个女生包围外，其余组几乎是男生。有几个女生之前也是选.net的，不过学了一段时间，老师还是建议她们转美工了，c++是全部是男生，呵呵，对于我对语言方面了解，c++是男女比例最失调的，特别是做游戏，几乎没有女生会选择吧。虽然我现在比较喜欢编程，不过确实对算法方面，不是那么的感兴趣，但是，要是让我去配色、Ps的话，我还是编程吧，那个，实在是觉得要天赋，我是觉得自己是没有一点艺术素养的人。&lt;/p&gt;
&lt;p&gt;那个时候的我也已经大三了，马上要面临毕业了，还是选择了上手最快的.net，也出于之前看过一点c#的，自认为有点基础，真的接触，发现自己真的是什么都不知道，HTML是什么都还不怎么清楚，更谈不上JavaScript、JQuery什么的了。对于我来说也是件好事，一听到新的东西就感兴趣，那时候也不愿意去做别的什么了，去上课，睡觉的也是一大堆，每天去抢最后一排，由于经常不急不忙，以至于最后一排也抢不到，又不好意思在第一排打瞌睡，所幸就天天窝在工作室学习了。那里学习环境确实很不错，大家年龄也差不多，也不是为了赚钱，也不用比成绩，完全兴趣爱好，相处的都非常好，加上吴老师跟陈老师确实也对我们特别好，网络信息部的老师，手上有好多学校的项目，哎，不得不说一句，学校做的东西确实有点垃圾，也就都拿给我们练手了，也充当经费，差不多每两个星期会组织我们活动，学得确实比较快，如果你在的学校有这样的机会，一点不要放弃，好好在里面学，这些都没有人管的，没有人压迫你做什么，只提供一个环境，差不多也算是社会实践吧，起码我觉得，如果没有在里面的一年多，我出来是觉得没有人理的，先不要谈工作，应届毕业生，人家面试都不给机会的（来上海几个月了，面试了好多次，也从来没有觉得自己在学校做过一点项目就了不起，因为这充其量也只能当作一个入门，商业化的东西跟我们在学校学的确实相差很大）。&lt;/p&gt;
&lt;p&gt;无论在哪里，我都觉得虚心很重要，进诚合工作室之前，里面已经有一批人是比我早进去一两个月的，还有一些是之前自己有学过编程的，那时候觉得他们好厉害（确实比我厉害好多）。每个组有一个组长，算是带我们吧，跟组长交流后，他说他差不多也是自学，说是培训了一个月，真正做程序的人，哪里会跟你讲什么，就是带他们入门吧，组长也比较好，把那些个老师说的话跟我说了一点，告诉我，没事多到网上看看，带着好奇心，现在工作室也有几个项目，老师就是给我们几个需求说明书，详细的都没有，就告诉我们要实现些个什么功能，怎么实现不管你们，反正要做出他要的效果。没办法，就做的，不会就百度，有空的时候，工作室有一堆书就拿来看，程序员加美工，两三个月下来，也做出了一堆的东西来，说是说是系统，B/S模式的，用.net开发的也有、Java开发的也有（c++组的一直在搞研究，至今不懂他们在研究什么深奥的东西，很困惑），没有什么测试人员，随便来几个无聊的人攻击一下，就差不多瘫了。系统烂是有点烂，不管怎么说，从做设计到编码，再到发布，加最痛苦的无数次的修改，总算还是小有点成就感，现在还很怀念那时候大家一起做开发，起码现在在公司是很难有这种感觉的，所以也一直想毕业后，找到一个好一点的公司，进一个好一点的团队，稳定一点，好好做开发。&lt;/p&gt;
&lt;p&gt;吴老师现在差不多三十岁，一直说自己现在再不创业，就没有机会了，半年前就把工作室注册成了公司，暑假的时候就把我们全部招回去，去外面接项目。回去了的也就六七个，六月底七月初学校安排我们专业到南昌中兴软件园培训了半个来月的Java，五个人一组也就在那边做了一个小项目，我们.net组的，大家关系都很好，项目也一直是最多的，去了一半，中兴培训一完，回家一个星期我也就去学校了。其余的当然没有想过把自己以后的工作也押到刚起步的公司上，或是偷偷懒，暑假好好玩去了。我那时候是去了的，无论之后怎么选择，只要有锻炼、学习的机会，都是不会放弃的，确实很值得这样做，年轻就是要多奋斗吧。去的人少，又是去外面接项目，不用说，那个月很辛苦。老师也比较忙，出于对我们几个的信任，有时候去跟客户谈项目，就是我开着老师的车跟我们组组长两个人去跟客户谈需求的，虽说考了驾照，旁边没坐个会开车的，又在市区里面开，真是每天擦汗啊。跟外面的人谈项目也不像给学校做那么简单，难受是不免有的，他们也不懂程序这方面，什么乱七八糟的要求都有，而且觉得这个东西很简单，也不肯给多少钱，还经常要加班加点的。有一次碰到一个老表，直接要我们一天给他设计一个新闻发布网站，谈了四五次，终于通过了，结果通过的那天，就说他们领导明天要检查，不可能是不能点的呀，要是能看到实际内容的。哎，真是没办法，直接把我们两留到那里（那时候是下乡，听着真别扭），硬是通宵一个晚上把他做成他口里的，所谓能&amp;ldquo;动&amp;rdquo;的网站。嗯，大家应该也都想到了，我们之前做项目，怎么了积累了一些架构、模板什么的，新闻类的也是有的，也只有远程连接，拿过来，项目名称都来不及改，找点数据导到数据库里，先用着了。。。&lt;/p&gt;
&lt;p&gt;暑假，很充实的过去了，经常是不知道什么时候是白天，什么时候是黑夜的，知道自己技术不咋的，做人方面，见识方面，到是有点小长进。&lt;/p&gt;
&lt;p&gt;大四了，考研的考研，也陆续有人出去找工作了，学校也开了招聘会，哎，可是招计算机的几乎只有去做Word、Excel的（我在的学校，只有是工科方面的），看到那些个同级的签了就业协议，异或是看着考研的人那么努力奔图书馆，自己也按捺不住了，也急得慌，虽然吴老师说，公司给我们几个股份（那时候坚持下来的，08级的也就几个组长跟副组长了），项目拿钱给我们分红，但是，老师毕竟是老师，永远做不到以老板或是共同创业的伙伴对待，再次，江西软件方面的发展，对于还在学习的我们，足足不够，大家也就降降四处漂了。&lt;/p&gt;
&lt;p&gt;一直没提，对于偏向于理科方面的我，英语不是很好，刚进大学就选学日语去了，刚开始也只是学校提供机会，可以不上英语课，不考英语，去上日语课，后面也竟喜欢上了，那时没人指引，也不知道考证的重要性，也没去考。但是，出于想做程序的另一方面，也不想丢掉自己的日语，找工作的时候，程序员无非是到北上广的，上海这边对日外包的比较多，一个机遇，就跑过来的。&lt;/p&gt;
&lt;p&gt;又写了一堆，还没开始讲自己的求职经历，明天继续吧。。。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/xiaomiji/aggbug/2352037.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/xiaomiji/archive/2012/02/15/2352037.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 02:10:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/xiaomiji/archive/2012/02/15/2352037.html</guid><dc:creator>小米呀</dc:creator></item><item><title>通用异步 Windows TCP Socket 客户端组件的设计与实现</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>~怪^_*兽~</name><uri>http://www.cnblogs.com/ldcsaa/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;编写 Windows TCP Socket 客户端其实并不困难，Windows 提供了6种&amp;nbsp;I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起，剪不断理还乱。每个程序都 Copy / Parse 类似的代码再进行修改，实在有点情何以堪。因此本座利用一些闲暇时光写了一个基于 IOCP 的&lt;strong&gt;通用异步 Windows TCP&amp;nbsp;Socket 服务端组件&lt;/strong&gt;和一个&lt;strong&gt;通用异步 Windows TCP Socket 客户端组件&lt;/strong&gt;供各位看官参详参详，希望能激发下大家的灵感。本篇文章讲述客户端组件，以后有时间再和大家探讨下服务端组件的实现。闲话少说，我们现在步入正题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最重要的第一个问题：如何才能达到通用？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;答：很简单。&lt;/p&gt;
&lt;p&gt;1、限制组件的职能，说白了，&lt;span style=&quot;color: #0000ff;&quot;&gt;通信组件的唯一职责就是接受和发送字节流&lt;/span&gt;，绝对不能参与上层协议解析等工作。不在其位不谋其政就是这个意思。&lt;/p&gt;
&lt;p&gt;2、与上层使用者解耦、互不依赖，组件与使用者通过接口方法进行交互，组件实现 ISocketClient 接口为上层提供操作方法；使用者通过&amp;nbsp;IClientSocketListener 接口把自己注册为组件的 Listener，接收组件通知。因此，任何使用者只要实现了 IClientSocketListener 接口都可以使用组件；另一方面，你甚至可以自己重新写一个实现方式完全不同的组件实现给使用者调用，只要该组件遵从 ISocketClient 接口。这也是 DIP 设计原则的体现（&lt;a href=&quot;http://www.cnblogs.com/ldcsaa/archive/2012/02/12/2347166.html#2307459&quot;&gt;猛击这里你会有惊喜^_^&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最重要的第二个问题：可用性如何，也就是说使用起来是否是否方便？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;答：这个问题问得很好，可用性对所有通用组件都是至关重要的，如果太难用还不如自己重头写一个来得方便。因此，ISocketClient 和 IClientSocketListener 接口设计得尽量简单易用（通俗来说就是&amp;ldquo;傻瓜化&amp;rdquo;），这两个接口的主要方法均不超过 5 个。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最重要的第三个问题：组件的性能如何？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作为底层的通用组件，性能问题是必须考虑的，绝对不能成为系统的瓶颈。而另一方面，从实际出发，毕竟只是一个客户端组件，它的并发性要求远没有服务端那么高。因此，组件在设计上充分考虑了性能、现实使用情景、可用性和实现复杂性等因素，确保满足性能要求的同时又不会写得太复杂。做出以下两点设计决策：&lt;/p&gt;
&lt;ol&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;ol&gt;
&lt;li&gt;在单独线程中实现 Socket 通信交互。这样可以避免与主线程或其他线程相互干扰。&lt;/li&gt;
&lt;li&gt;I/O&amp;nbsp;模型选择 WSAEventSelect。细说一下选择这种 I/O 模型的原因：（各种 I/O 模型的性能比较可以参考：《Windows 网络编程（中文第二版）》第 154 页）
&lt;ul&gt;
&lt;li&gt;阻塞模型：（不解析，你懂的^_^）&lt;/li&gt;
&lt;li&gt;非阻塞模型：（性能太低）&lt;/li&gt;
&lt;li&gt;WSAAsyncSelect：&amp;nbsp;（两个原因：a、性能太低；b、对于纯 Console 程序还要背负 HWND 实在是伤不起呀！）&lt;/li&gt;
&lt;li&gt;重叠 I/O：（有点复杂了）&lt;/li&gt;
&lt;li&gt;完成端口：（何必呢？）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;唉，理论的东西就先别吹那么多了，直接上代码吧，求你了 ！！&lt;/p&gt;
&lt;p&gt;OK！先看看 &lt;strong&gt;ISocketClient&lt;/strong&gt; 和 &lt;strong&gt;IClientSocketListener&lt;/strong&gt; 的接口定义:&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件操作类型&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;enum&lt;/span&gt; EnSocketOperation&lt;br /&gt;{&lt;br /&gt;    SO_UNKNOWN    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;    SO_ACCEPT    = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;    SO_CONNECT    = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;,&lt;br /&gt;    SO_SEND        = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;,&lt;br /&gt;    SO_RECEIVE    = &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;,&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件监听器基接口&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; ISocketListener&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;enum&lt;/span&gt; EnHandleResult&lt;br /&gt;    {&lt;br /&gt;        HR_OK        = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;        HR_IGNORE    = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;        HR_ERROR    = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;,&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 已发出数据通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnSend(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLength) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 已接收数据通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnReceive(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLength) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭 socket 通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnClose(DWORD dwConnectionID) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; socket 错误数据通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnError(DWORD dwConnectionID, EnSocketOperation enOperation, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iErrorCode) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~ISocketListener() {}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 服务端组件监听器接口（暂时无视之）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; IServerSocketListener : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; ISocketListener&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 接收连接通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnAccept(DWORD dwConnectionID)    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 服务关闭通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnServerShutdown()                = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 客户端组件监听器接口&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;IClientSocketListener : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; ISocketListener&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 连接完成通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;EnHandleResult OnConnect(DWORD dwConnectionID) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 服务端组件接口（暂时无视之）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; ISocketServer&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;enum&lt;/span&gt; En_ISS_Error&lt;br /&gt;    {&lt;br /&gt;        ISS_OK                        = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;        ISS_SOCKET_CREATE            = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;        ISS_SOCKET_BIND                = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;,&lt;br /&gt;        ISS_SOCKET_LISTEN            = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;,&lt;br /&gt;        ISS_CP_CREATE                = &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;,&lt;br /&gt;        ISS_WORKER_THREAD_CREATE    = &lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;,&lt;br /&gt;        ISS_SOCKE_ATTACH_TO_CP        = &lt;span style=&quot;color: #800080;&quot;&gt;6&lt;/span&gt;,&lt;br /&gt;        ISS_ACCEPT_THREAD_CREATE    = &lt;span style=&quot;color: #800080;&quot;&gt;7&lt;/span&gt;,&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Start    (LPCTSTR pszBindAddress, USHORT usPort, &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt; lThreadCount)            = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Stop    ()                                                                    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Send    (DWORD dwConnID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pBuffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen)                        = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL HasStarted                ()                                                    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; En_ISS_Error GetLastError    ()                                                    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; LPCTSTR        GetLastErrorDesc()                                                    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL GetConnectionAddress(DWORD dwConnID, CString&amp;amp; strAddress, USHORT&amp;amp; usPort)    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~ISocketServer() {}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 服务端组件接口智能指针&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;typedef auto_ptr&amp;lt;ISocketServer&amp;gt;    ISocketServerPtr;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 客户端组件接口&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; ISocketClient&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 操作结果码&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;enum&lt;/span&gt; En_ISC_Error&lt;br /&gt;    {&lt;br /&gt;        ISC_OK                        = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;        ISC_CLIENT_HAD_STARTED        = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;        ISC_CLIENT_NOT_STARTED        = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;,&lt;br /&gt;        ISC_SOCKET_CREATE_FAIL        = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;,&lt;br /&gt;        ISC_CONNECT_SERVER_FAIL        = &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;,&lt;br /&gt;        ISC_WORKER_CREATE_FAIL        = &lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;,&lt;br /&gt;        ISC_NETWORK_ERROR            = &lt;span style=&quot;color: #800080;&quot;&gt;6&lt;/span&gt;,&lt;br /&gt;        ISC_PROTOCOL_ERROR            = &lt;span style=&quot;color: #800080;&quot;&gt;7&lt;/span&gt;,&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 启动通信&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Start (LPCTSTR pszRemoteAddress, USHORT usPort) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭通信&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Stop () = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Send (DWORD dwConnID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pBuffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 是否已启动&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL HasStarted () = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 获取错误码&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; En_ISC_Error GetLastError () = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 获取错误描述&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; LPCTSTR GetLastErrorDesc() = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~ISocketClient() {}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 客户端组件接口智能指针&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;typedef auto_ptr&amp;lt;ISocketClient&amp;gt; &lt;/strong&gt;   &lt;strong&gt;ISocketClientPtr&lt;/strong&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ISocketClient&lt;/strong&gt; 接口主要有以下三个方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start()：启动通信&lt;/li&gt;
&lt;li&gt;Send()：发送数据&lt;/li&gt;
&lt;li&gt;Stop()：停止通信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;IClientSocketListener&lt;/strong&gt; 接口有以下五个通知方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OnConnect()&lt;/li&gt;
&lt;li&gt;OnSend()&lt;/li&gt;
&lt;li&gt;OnReceive()&lt;/li&gt;
&lt;li&gt;OnClose()&lt;/li&gt;
&lt;li&gt;OnError()&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;够简单了吧^_^，使用者只需通过三个方法操作组件，然后处理五个组件通知。下面我们再看看组件的具体实现，先看组件类定义：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件实现类 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; CSocketClient : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; ISocketClient&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; ISocketClient 接口方法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Start (LPCTSTR pszRemoteAddress, USHORT usPortt);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Stop ();&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Send (DWORD dwConnID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pBuffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL HasStarted () {&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_bStarted;}&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; En_ISC_Error GetLastError () {&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; sm_enLastError;}&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; LPCTSTR GetLastErrorDesc();&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    BOOL CreateClientSocket();&lt;br /&gt;    BOOL ConnectToServer(LPCTSTR pszRemoteAddress, USHORT usPort);&lt;br /&gt;    BOOL CreateWorkerThread();&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 网络事件处理方法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    BOOL ProcessNetworkEvent();&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; WaitForWorkerThreadEnd();&lt;br /&gt;    BOOL ReadData();&lt;br /&gt;    BOOL SendData();&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SetLastError(En_ISC_Error code, LPCTSTR func, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; ec);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 通信线程函数&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;br /&gt;#ifndef _WIN32_WCE&lt;br /&gt;    UINT&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;    DWORD&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;     WINAPI WorkerThreadProc(LPVOID pv);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; RECEIVE_BUFFER_SIZE    = &lt;span style=&quot;color: #800080;&quot;&gt;8&lt;/span&gt; * &lt;span style=&quot;color: #800080;&quot;&gt;1024&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; WORKER_THREAD_END_TIME    = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt; * &lt;span style=&quot;color: #800080;&quot;&gt;1000&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;    DEFALUT_KEEPALIVE_TIMES        = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;    DEFALUT_KEEPALIVE_INTERVAL    = &lt;span style=&quot;color: #800080;&quot;&gt;10&lt;/span&gt; * &lt;span style=&quot;color: #800080;&quot;&gt;1000&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 构造函数&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; CSocketClient(IClientSocketListener* pListener)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; : m_pListener(pListener) &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 设置监听器对象&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; , m_soClient(INVALID_SOCKET)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_evSocket(NULL)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_dwConnID(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_hWorker(NULL)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_dwWorkerID(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_bStarted(FALSE)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;#ifdef _WIN32_WCE&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , sm_enLastError(ISC_OK)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; {&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; ASSERT(m_pListener);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; }&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~CSocketClient()    {&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(HasStarted()) Stop();}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 这是神马 ？？？&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; CInitSocket m_wsSocket;&lt;/strong&gt;&lt;br /&gt;    &lt;br /&gt;    SOCKET            m_soClient;&lt;br /&gt;    HANDLE            m_evSocket;&lt;br /&gt;    DWORD            m_dwConnID;&lt;br /&gt;&lt;br /&gt;    CCriSec            m_scStop;&lt;br /&gt;    CEvt            m_evStop;&lt;br /&gt;    HANDLE            m_hWorker;&lt;br /&gt;&lt;br /&gt;#ifndef _WIN32_WCE&lt;br /&gt;    UINT&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;    DWORD&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;                    m_dwWorkerID;&lt;br /&gt;&lt;br /&gt;    CBufferPtr        m_sndBuffer;&lt;br /&gt;    CCriSec            m_scBuffer;&lt;br /&gt;    CEvt            m_evBuffer;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;volatile&lt;/span&gt; BOOL    m_bStarted;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 监听器对象指针&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;strong&gt;IClientSocketListener* m_pListener;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;#ifndef _WIN32_WCE&lt;br /&gt;    __declspec(thread) &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; En_ISC_Error    sm_enLastError;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;volatile&lt;/span&gt; En_ISC_Error                    sm_enLastError;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;};&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;从上面的定义可以看出，组件实现类本身并没有提供额外的公共方法，它完全是可以被替换的。组件在构造函数中接收监听器对象，并且保存为其成员属性，因此可以在需要的时候向监听器发送事件通知。&lt;/p&gt;
&lt;p&gt;另外，不知各位看官是否注意到一个奇怪的成员属性：&amp;ldquo;&lt;strong&gt;CInitSocket m_wsSocket;&lt;/strong&gt; &amp;rdquo;，这个属性在其它地方从来都不会用到，那么它是干嘛的呢？在回答这个问题之前，首先想问问大家：Windows Socket 操作的整个操作过程中，第一个以及最后一个被调用的方法是什么？是 socket()、connect()、bind()、还是&amp;nbsp;closesocket() 吗？都错！答案是 &amp;mdash;&amp;mdash; ::WSAStartup() 和 ::WSACleanup()。每个程序都要调用一下这两个方法确实是很烦的，又不雅观。&amp;nbsp;其实，m_wsSocket 的唯一目的就是为了避免手工调用者两个方法，看看它的定义就明白了：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; CInitSocket&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    CInitSocket(LPWSADATA lpWSAData = NULL, BYTE minorVersion = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;, BYTE majorVersion = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        LPWSADATA lpTemp = lpWSAData;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(!lpTemp)&lt;br /&gt;            lpTemp    = (LPWSADATA)_alloca(&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(WSADATA));&lt;br /&gt;&lt;br /&gt;        m_iResult    = &lt;strong&gt;::WSAStartup(MAKEWORD(minorVersion, majorVersion), lpTemp)&lt;/strong&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ~CInitSocket()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(IsValid())&lt;br /&gt;            &lt;strong&gt;::WSACleanup()&lt;/strong&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;        GetResult()    {&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_iResult;}&lt;br /&gt;    BOOL    IsValid()    {&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_iResult == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;        m_iResult;&lt;br /&gt;};&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;现在我们看看组件类实现文件中几个重要方法的定义：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件事件触发宏定义&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireConnect&lt;/strong&gt;(id)                    m_pListener-&amp;gt;OnConnect(id)&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireSend&lt;/strong&gt;(id, data, len)            (m_bStarted ? m_pListener-&amp;gt;OnSend(id, data, len)    : ISocketListener::HR_IGNORE)&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireReceive&lt;/strong&gt;(id, data, len)        (m_bStarted ? m_pListener-&amp;gt;OnReceive(id, data, len)    : ISocketListener::HR_IGNORE)&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireClose&lt;/strong&gt;(id)                    (m_bStarted ? m_pListener-&amp;gt;OnClose(id)                : ISocketListener::HR_IGNORE)&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireError&lt;/strong&gt;(id, op, code)            (m_bStarted ? m_pListener-&amp;gt;OnError(id, op, code)    : ISocketListener::HR_IGNORE)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 启动组件&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;BOOL CSocketClient::Start(LPCTSTR pszRemoteAddress, USHORT usPort)&lt;br /&gt;{&lt;br /&gt;    BOOL isOK = FALSE;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(HasStarted())&lt;br /&gt;    {&lt;br /&gt;        SetLastError(ISC_CLIENT_HAD_STARTED, _T(__FUNCTION__), &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; isOK;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 创建 socket&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(CreateClientSocket())&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 连接服务器（内部会调用 &lt;strong&gt;FireConnect()&lt;/strong&gt; ）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(ConnectToServer(pszRemoteAddress, usPort))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 创建工作线程&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(CreateWorkerThread())&lt;br /&gt;                isOK = TRUE;&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;                SetLastError(ISC_WORKER_CREATE_FAIL, _T(__FUNCTION__), &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;            SetLastError(ISC_CONNECT_SERVER_FAIL, _T(__FUNCTION__), ::WSAGetLastError());&lt;br /&gt;    }&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;        SetLastError(ISC_SOCKET_CREATE_FAIL, _T(__FUNCTION__), ::WSAGetLastError());&lt;br /&gt;&lt;br /&gt;    isOK ? m_bStarted = TRUE : Stop();&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; isOK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭组件&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;BOOL CSocketClient::Stop()&lt;br /&gt;{&lt;br /&gt;    {&lt;br /&gt;        CCriSecLock locallock(m_scStop);&lt;br /&gt;&lt;br /&gt;        m_bStarted = FALSE;&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(m_hWorker != NULL)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 停止工作线程&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(::GetCurrentThreadId() != m_dwWorkerID)&lt;br /&gt;                WaitForWorkerThreadEnd();&lt;br /&gt;&lt;br /&gt;            ::CloseHandle(m_hWorker);&lt;br /&gt;            m_hWorker        = NULL;&lt;br /&gt;            m_dwWorkerID    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(m_evSocket != NULL)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭 WSAEvent&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            ::WSACloseEvent(m_evSocket);&lt;br /&gt;            m_evSocket    = NULL;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(m_soClient != INVALID_SOCKET)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭socket&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            shutdown(m_soClient, SD_SEND);&lt;br /&gt;            closesocket(m_soClient);&lt;br /&gt;            m_soClient    = INVALID_SOCKET;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        m_dwConnID = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 释放其它资源&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_sndBuffer.Free();&lt;br /&gt;    m_evBuffer.Reset();&lt;br /&gt;    m_evStop.Reset();&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;BOOL CSocketClient::Send(DWORD dwConnID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pBuffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen)&lt;br /&gt;{&lt;br /&gt;    ASSERT(iLen &amp;gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(!HasStarted())&lt;br /&gt;    {&lt;br /&gt;        SetLastError(ISC_CLIENT_NOT_STARTED, _T(__FUNCTION__), &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    CCriSecLock locallock(m_scBuffer);&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 把数据存入缓冲器&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_sndBuffer.Cat(pBuffer, iLen);&lt;br /&gt;　　&lt;span style=&quot;color: #008000;&quot;&gt;// 唤醒工作现场，发送数据&lt;/span&gt;&lt;br /&gt;    m_evBuffer.Set();&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 工作线程函数&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;#ifndef _WIN32_WCE&lt;br /&gt;    UINT&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;    DWORD&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;    WINAPI CSocketClient::WorkerThreadProc(LPVOID pv)&lt;br /&gt;{&lt;br /&gt;    CSocketClient* pClient = (CSocketClient*)pv;&lt;br /&gt;&lt;br /&gt;    TRACE0(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;---------------&amp;gt; 启动工作线程 &amp;lt;---------------\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    HANDLE hEvents[] = {pClient-&amp;gt;m_evSocket, pClient-&amp;gt;m_evBuffer, pClient-&amp;gt;m_evStop};&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt;(pClient-&amp;gt;HasStarted())&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 等待 socket 事件、发送数据事件和停止通信事件&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;        DWORD retval = ::MsgWaitForMultipleObjectsEx(&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;, hEvents, WSA_INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE);&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(retval == WSA_WAIT_EVENT_0)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理网络消息&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(!pClient-&amp;gt;ProcessNetworkEvent())&lt;br /&gt;            {&lt;br /&gt;                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(pClient-&amp;gt;HasStarted())&lt;br /&gt;                    pClient-&amp;gt;Stop();&lt;br /&gt;&lt;br /&gt;                &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(retval == WSA_WAIT_EVENT_0 + &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据（内部调用 &lt;strong&gt;FireSend()&lt;/strong&gt; ）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(!pClient-&amp;gt;SendData())&lt;br /&gt;            {&lt;br /&gt;                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(pClient-&amp;gt;HasStarted())&lt;br /&gt;                    pClient-&amp;gt;Stop();&lt;br /&gt;&lt;br /&gt;                &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(retval == WSA_WAIT_EVENT_0 + &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;)&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(retval == WSA_WAIT_EVENT_0 + &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 消息循环&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            ::PeekMessageLoop();&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;            ASSERT(FALSE);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    TRACE0(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;---------------&amp;gt; 退出工作线程 &amp;lt;---------------\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理网络消息&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;BOOL CSocketClient::ProcessNetworkEvent()&lt;br /&gt;{&lt;br /&gt;    ::WSAResetEvent(m_evSocket);&lt;br /&gt;&lt;br /&gt;    WSANETWORKEVENTS events;&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; rc = ::WSAEnumNetworkEvents(m_soClient, m_evSocket, &amp;amp;events);&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(rc == SOCKET_ERROR)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; code = ::WSAGetLastError();&lt;br /&gt;        SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), code);&lt;br /&gt;        &lt;strong&gt;FireError&lt;/strong&gt;(m_dwConnID, SO_UNKNOWN, code);&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 可读取 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(events.lNetworkEvents &amp;amp; FD_READ)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iCode = events.iErrorCode[FD_READ_BIT];&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(iCode == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 读取数据（内部调用 &lt;strong&gt;FireReceive()&lt;/strong&gt; ）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ReadData();&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), iCode);&lt;br /&gt;            &lt;strong&gt;FireError&lt;/strong&gt;(m_dwConnID, SO_RECEIVE, iCode);&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 可发送 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(events.lNetworkEvents &amp;amp; FD_WRITE)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iCode = events.iErrorCode[FD_WRITE_BIT];&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(iCode == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据（内部调用 &lt;strong&gt;FireSend()&lt;/strong&gt; ）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; SendData();&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), iCode);&lt;br /&gt;            &lt;strong&gt;FireError&lt;/strong&gt;(m_dwConnID, SO_SEND, iCode);&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; socket 已关闭 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(events.lNetworkEvents &amp;amp; FD_CLOSE)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iCode = events.iErrorCode[FD_CLOSE_BIT];&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(iCode == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;strong&gt;FireClose&lt;/strong&gt;(m_dwConnID);&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), iCode);&lt;br /&gt;            &lt;strong&gt;FireError&lt;/strong&gt;(m_dwConnID, SO_UNKNOWN, iCode);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;从上面的代码可以看出：通信过程中，组件的使用者不需要对通信过程进行任何干预，整个底层通信过程对使用者来说是透明的，使用只需集中精力处理好几个组件通知。下面来看看组件的一个使用示例：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件使用者：实现 IClientSocketListener &lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;CMainClient : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;IClientSocketListener&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 这些方法会操作组件&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; Login(LPCTSTR pszAddress, USHORT usPort, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; T_101_Data* pData);&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; Logout(&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; T_201_Data* pData);&lt;br /&gt;        BOOL SendData(EnCommandType enCmdType, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; TCommandData* pCmdData, WORD wCmdDataLen);&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;    GetLastError();&lt;br /&gt;    LPCTSTR    GetLastErrorDesc();&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 实现 IClientSocketListener&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnConnect(DWORD dwConnectionID);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnSend(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLength);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnReceive(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnClose(DWORD dwConnectionID);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnError(DWORD dwConnectionID, EnSocketOperation enOperation, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iErrorCode);&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    BOOL ParseReceiveBuffer();&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 其它方法 。。。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 构造函数&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; CMainClient()&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 创建组件，并把自己设置为组件的监听器&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; : m_pscClient(&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; CSocketClient(&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;))&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_dwConnID(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; {&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; }&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~CMainClient()    {}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件属性&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;   &lt;strong&gt; ISocketClientPtr m_pscClient;&lt;/strong&gt;&lt;br /&gt;    DWORD               m_dwConnID;&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 其它属性 。。。&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;};&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;BOOL CMainClient::Login(LPCTSTR pszAddress, USHORT usPort, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; T_101_Data* pData)&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 启动通信&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;    &lt;strong&gt;m_pscClient-&amp;gt;Start&lt;/strong&gt;(pszAddress, usPort) &amp;amp;&amp;amp;&lt;br /&gt;            SendData(CS_C_LOGIN_REQ, pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(T_101_Data));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CMainClient::Logout(&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; T_201_Data* pData)&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(pData)&lt;br /&gt;    {&lt;br /&gt;        SendData(CS_C_SET_STATUS, pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(T_201_Data));&lt;br /&gt;        ::WaitWithMessageLoop(LOGOUT_WAIT_TIME);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 停止通信&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;strong&gt;m_pscClient-&amp;gt;Stop()&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CMainClient::SendData(EnCommandType enCmdType, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; TCommandData* pCmdData, WORD wCmdDataLen)&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; WORD wBufferLen    = CMD_ADDITIVE_SIZE + wCmdDataLen;&lt;br /&gt;    CPrivateHeapByteBuffer buffer(m_hpPrivate, wBufferLen);&lt;br /&gt;    BYTE* pBuffer    = buffer;&lt;br /&gt;&lt;br /&gt;    memcpy(pBuffer, &amp;amp;wBufferLen, CMD_LEN_SIZE);&lt;br /&gt;    pBuffer += CMD_LEN_SIZE;&lt;br /&gt;    memcpy(pBuffer, &amp;amp;enCmdType, CMD_TYPE_SIZE);&lt;br /&gt;    pBuffer += CMD_TYPE_SIZE;&lt;br /&gt;    memcpy(pBuffer, pCmdData, wCmdDataLen);&lt;br /&gt;    pBuffer += wCmdDataLen;&lt;br /&gt;    memcpy(pBuffer, &amp;amp;CMD_FLAG, CMD_FLAG_SIZE);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;strong&gt;m_pscClient-&amp;gt;Send(m_dwConnID, buffer, wBufferLen)&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt; CMainClient::GetLastError()&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 获取通信错误码&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;strong&gt;m_pscClient-&amp;gt;GetLastError()&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;LPCTSTR CMainClient::GetLastErrorDesc()&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 获取通信错误描述&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;strong&gt;m_pscClient-&amp;gt;GetLastErrorDesc()&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理连接成功事件 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnConnect(DWORD dwConnectionID)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE1(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;CNNID: %d&amp;gt; 已连接\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID);&lt;br /&gt;    m_dwConnID = dwConnectionID;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; HR_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理数据已发出事件 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnSend(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLength)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE2(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;CNNID: %d&amp;gt; 发出数据包 (%d bytes)\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID, iLength);&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; HR_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理接收到数据事件&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnReceive(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE2(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;CNNID: %d&amp;gt; 接收数据包 (%d bytes)\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID, iLen);&lt;br /&gt;&lt;br /&gt;    ASSERT(pData != NULL &amp;amp;&amp;amp; iLen &amp;gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 保存数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_rcBuffer.Cat(pData, iLen);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 解析数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ParseReceiveBuffer() ? HR_OK : HR_ERROR;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理通信关闭事件&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnClose(DWORD dwConnectionID)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE1(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;CNNID: %d&amp;gt; 关闭连接\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 清理缓冲区&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_rcBuffer.Realloc(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; HR_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理通信错误事件 &lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnError(DWORD dwConnectionID, EnSocketOperation enOperation, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iErrorCode)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE3(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;CNNID: %d&amp;gt; 网络错误 (OP: %d, CO: %d)\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID, enOperation, iErrorCode);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 清理缓冲区&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_rcBuffer.Realloc(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; HR_OK;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;好了，码了一个晚上的字，累啊！到此为止吧，感谢收看~&lt;/p&gt;
&lt;p&gt;如果反应够好的话本座或许会找个时间继续发表《&lt;strong&gt;基于 IOCP 的通用异步 Windows TCP Socket 服务端组件的设计与实现&lt;/strong&gt;》，晚安 ^_^&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;（&lt;a href=&quot;http://files.cnblogs.com/ldcsaa/socket.zip&quot;&gt;想看源代码的朋友请狂点这里&lt;/a&gt;）&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/ldcsaa/aggbug/2351756.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>编写 Windows TCP Socket 客户端其实并不困难，Windows 提供了6种I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起，剪不断理还乱。每个程序都 Copy / Parse 类似的代码再进行修改，实在有点情何以堪。因此本座利用一些闲暇时光写了一个基于 IOCP 的通用异步 Windows TCPSocket 服务端组件和一个通用异步 Windows TCP Socket 客户端组件供各位看官参详参详，希望能激发下大家的灵感。本篇文章讲述客户端组件，以后有时间再和大家探讨下服务端组件的实现。闲话少说，我们现在步入正题。最重要的第..</description><content:encoded>&lt;p&gt;编写 Windows TCP Socket 客户端其实并不困难，Windows 提供了6种&amp;nbsp;I/O 通信模型供大家选择。但本座看过很多客户端程序都把 Socket 通信和业务逻辑混在一起，剪不断理还乱。每个程序都 Copy / Parse 类似的代码再进行修改，实在有点情何以堪。因此本座利用一些闲暇时光写了一个基于 IOCP 的&lt;strong&gt;通用异步 Windows TCP&amp;nbsp;Socket 服务端组件&lt;/strong&gt;和一个&lt;strong&gt;通用异步 Windows TCP Socket 客户端组件&lt;/strong&gt;供各位看官参详参详，希望能激发下大家的灵感。本篇文章讲述客户端组件，以后有时间再和大家探讨下服务端组件的实现。闲话少说，我们现在步入正题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最重要的第一个问题：如何才能达到通用？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;答：很简单。&lt;/p&gt;
&lt;p&gt;1、限制组件的职能，说白了，&lt;span style=&quot;color: #0000ff;&quot;&gt;通信组件的唯一职责就是接受和发送字节流&lt;/span&gt;，绝对不能参与上层协议解析等工作。不在其位不谋其政就是这个意思。&lt;/p&gt;
&lt;p&gt;2、与上层使用者解耦、互不依赖，组件与使用者通过接口方法进行交互，组件实现 ISocketClient 接口为上层提供操作方法；使用者通过&amp;nbsp;IClientSocketListener 接口把自己注册为组件的 Listener，接收组件通知。因此，任何使用者只要实现了 IClientSocketListener 接口都可以使用组件；另一方面，你甚至可以自己重新写一个实现方式完全不同的组件实现给使用者调用，只要该组件遵从 ISocketClient 接口。这也是 DIP 设计原则的体现（&lt;a href=&quot;http://www.cnblogs.com/ldcsaa/archive/2012/02/12/2347166.html#2307459&quot;&gt;猛击这里你会有惊喜^_^&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最重要的第二个问题：可用性如何，也就是说使用起来是否是否方便？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;答：这个问题问得很好，可用性对所有通用组件都是至关重要的，如果太难用还不如自己重头写一个来得方便。因此，ISocketClient 和 IClientSocketListener 接口设计得尽量简单易用（通俗来说就是&amp;ldquo;傻瓜化&amp;rdquo;），这两个接口的主要方法均不超过 5 个。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最重要的第三个问题：组件的性能如何？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作为底层的通用组件，性能问题是必须考虑的，绝对不能成为系统的瓶颈。而另一方面，从实际出发，毕竟只是一个客户端组件，它的并发性要求远没有服务端那么高。因此，组件在设计上充分考虑了性能、现实使用情景、可用性和实现复杂性等因素，确保满足性能要求的同时又不会写得太复杂。做出以下两点设计决策：&lt;/p&gt;
&lt;ol&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;&lt;ol&gt;
&lt;li&gt;在单独线程中实现 Socket 通信交互。这样可以避免与主线程或其他线程相互干扰。&lt;/li&gt;
&lt;li&gt;I/O&amp;nbsp;模型选择 WSAEventSelect。细说一下选择这种 I/O 模型的原因：（各种 I/O 模型的性能比较可以参考：《Windows 网络编程（中文第二版）》第 154 页）
&lt;ul&gt;
&lt;li&gt;阻塞模型：（不解析，你懂的^_^）&lt;/li&gt;
&lt;li&gt;非阻塞模型：（性能太低）&lt;/li&gt;
&lt;li&gt;WSAAsyncSelect：&amp;nbsp;（两个原因：a、性能太低；b、对于纯 Console 程序还要背负 HWND 实在是伤不起呀！）&lt;/li&gt;
&lt;li&gt;重叠 I/O：（有点复杂了）&lt;/li&gt;
&lt;li&gt;完成端口：（何必呢？）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;唉，理论的东西就先别吹那么多了，直接上代码吧，求你了 ！！&lt;/p&gt;
&lt;p&gt;OK！先看看 &lt;strong&gt;ISocketClient&lt;/strong&gt; 和 &lt;strong&gt;IClientSocketListener&lt;/strong&gt; 的接口定义:&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件操作类型&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;enum&lt;/span&gt; EnSocketOperation&lt;br /&gt;{&lt;br /&gt;    SO_UNKNOWN    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;    SO_ACCEPT    = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;    SO_CONNECT    = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;,&lt;br /&gt;    SO_SEND        = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;,&lt;br /&gt;    SO_RECEIVE    = &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;,&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件监听器基接口&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; ISocketListener&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;enum&lt;/span&gt; EnHandleResult&lt;br /&gt;    {&lt;br /&gt;        HR_OK        = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;        HR_IGNORE    = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;        HR_ERROR    = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;,&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 已发出数据通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnSend(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLength) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 已接收数据通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnReceive(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLength) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭 socket 通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnClose(DWORD dwConnectionID) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; socket 错误数据通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnError(DWORD dwConnectionID, EnSocketOperation enOperation, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iErrorCode) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~ISocketListener() {}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 服务端组件监听器接口（暂时无视之）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; IServerSocketListener : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; ISocketListener&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 接收连接通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnAccept(DWORD dwConnectionID)    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 服务关闭通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnServerShutdown()                = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 客户端组件监听器接口&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;IClientSocketListener : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; ISocketListener&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 连接完成通知&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;EnHandleResult OnConnect(DWORD dwConnectionID) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 服务端组件接口（暂时无视之）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; ISocketServer&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;enum&lt;/span&gt; En_ISS_Error&lt;br /&gt;    {&lt;br /&gt;        ISS_OK                        = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;        ISS_SOCKET_CREATE            = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;        ISS_SOCKET_BIND                = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;,&lt;br /&gt;        ISS_SOCKET_LISTEN            = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;,&lt;br /&gt;        ISS_CP_CREATE                = &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;,&lt;br /&gt;        ISS_WORKER_THREAD_CREATE    = &lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;,&lt;br /&gt;        ISS_SOCKE_ATTACH_TO_CP        = &lt;span style=&quot;color: #800080;&quot;&gt;6&lt;/span&gt;,&lt;br /&gt;        ISS_ACCEPT_THREAD_CREATE    = &lt;span style=&quot;color: #800080;&quot;&gt;7&lt;/span&gt;,&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Start    (LPCTSTR pszBindAddress, USHORT usPort, &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt; lThreadCount)            = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Stop    ()                                                                    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Send    (DWORD dwConnID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pBuffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen)                        = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL HasStarted                ()                                                    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; En_ISS_Error GetLastError    ()                                                    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; LPCTSTR        GetLastErrorDesc()                                                    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL GetConnectionAddress(DWORD dwConnID, CString&amp;amp; strAddress, USHORT&amp;amp; usPort)    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~ISocketServer() {}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 服务端组件接口智能指针&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;typedef auto_ptr&amp;lt;ISocketServer&amp;gt;    ISocketServerPtr;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 客户端组件接口&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; ISocketClient&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 操作结果码&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;enum&lt;/span&gt; En_ISC_Error&lt;br /&gt;    {&lt;br /&gt;        ISC_OK                        = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;,&lt;br /&gt;        ISC_CLIENT_HAD_STARTED        = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;,&lt;br /&gt;        ISC_CLIENT_NOT_STARTED        = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;,&lt;br /&gt;        ISC_SOCKET_CREATE_FAIL        = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;,&lt;br /&gt;        ISC_CONNECT_SERVER_FAIL        = &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;,&lt;br /&gt;        ISC_WORKER_CREATE_FAIL        = &lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;,&lt;br /&gt;        ISC_NETWORK_ERROR            = &lt;span style=&quot;color: #800080;&quot;&gt;6&lt;/span&gt;,&lt;br /&gt;        ISC_PROTOCOL_ERROR            = &lt;span style=&quot;color: #800080;&quot;&gt;7&lt;/span&gt;,&lt;br /&gt;    };&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 启动通信&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Start (LPCTSTR pszRemoteAddress, USHORT usPort) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭通信&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Stop () = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Send (DWORD dwConnID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pBuffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen) = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 是否已启动&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL HasStarted () = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 获取错误码&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; En_ISC_Error GetLastError () = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 获取错误描述&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; LPCTSTR GetLastErrorDesc() = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~ISocketClient() {}&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 客户端组件接口智能指针&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;typedef auto_ptr&amp;lt;ISocketClient&amp;gt; &lt;/strong&gt;   &lt;strong&gt;ISocketClientPtr&lt;/strong&gt;;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;ISocketClient&lt;/strong&gt; 接口主要有以下三个方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Start()：启动通信&lt;/li&gt;
&lt;li&gt;Send()：发送数据&lt;/li&gt;
&lt;li&gt;Stop()：停止通信&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;IClientSocketListener&lt;/strong&gt; 接口有以下五个通知方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;OnConnect()&lt;/li&gt;
&lt;li&gt;OnSend()&lt;/li&gt;
&lt;li&gt;OnReceive()&lt;/li&gt;
&lt;li&gt;OnClose()&lt;/li&gt;
&lt;li&gt;OnError()&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;够简单了吧^_^，使用者只需通过三个方法操作组件，然后处理五个组件通知。下面我们再看看组件的具体实现，先看组件类定义：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件实现类 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; CSocketClient : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; ISocketClient&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; ISocketClient 接口方法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Start (LPCTSTR pszRemoteAddress, USHORT usPortt);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Stop ();&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL Send (DWORD dwConnID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pBuffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; BOOL HasStarted () {&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_bStarted;}&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; En_ISC_Error GetLastError () {&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; sm_enLastError;}&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; LPCTSTR GetLastErrorDesc();&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    BOOL CreateClientSocket();&lt;br /&gt;    BOOL ConnectToServer(LPCTSTR pszRemoteAddress, USHORT usPort);&lt;br /&gt;    BOOL CreateWorkerThread();&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 网络事件处理方法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    BOOL ProcessNetworkEvent();&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; WaitForWorkerThreadEnd();&lt;br /&gt;    BOOL ReadData();&lt;br /&gt;    BOOL SendData();&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SetLastError(En_ISC_Error code, LPCTSTR func, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; ec);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 通信线程函数&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;br /&gt;#ifndef _WIN32_WCE&lt;br /&gt;    UINT&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;    DWORD&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;     WINAPI WorkerThreadProc(LPVOID pv);&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; RECEIVE_BUFFER_SIZE    = &lt;span style=&quot;color: #800080;&quot;&gt;8&lt;/span&gt; * &lt;span style=&quot;color: #800080;&quot;&gt;1024&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; WORKER_THREAD_END_TIME    = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt; * &lt;span style=&quot;color: #800080;&quot;&gt;1000&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;    DEFALUT_KEEPALIVE_TIMES        = &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;    DEFALUT_KEEPALIVE_INTERVAL    = &lt;span style=&quot;color: #800080;&quot;&gt;10&lt;/span&gt; * &lt;span style=&quot;color: #800080;&quot;&gt;1000&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 构造函数&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; CSocketClient(IClientSocketListener* pListener)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; : m_pListener(pListener) &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 设置监听器对象&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; , m_soClient(INVALID_SOCKET)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_evSocket(NULL)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_dwConnID(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_hWorker(NULL)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_dwWorkerID(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_bStarted(FALSE)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;#ifdef _WIN32_WCE&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , sm_enLastError(ISC_OK)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; {&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; ASSERT(m_pListener);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; }&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~CSocketClient()    {&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(HasStarted()) Stop();}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 这是神马 ？？？&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; CInitSocket m_wsSocket;&lt;/strong&gt;&lt;br /&gt;    &lt;br /&gt;    SOCKET            m_soClient;&lt;br /&gt;    HANDLE            m_evSocket;&lt;br /&gt;    DWORD            m_dwConnID;&lt;br /&gt;&lt;br /&gt;    CCriSec            m_scStop;&lt;br /&gt;    CEvt            m_evStop;&lt;br /&gt;    HANDLE            m_hWorker;&lt;br /&gt;&lt;br /&gt;#ifndef _WIN32_WCE&lt;br /&gt;    UINT&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;    DWORD&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;                    m_dwWorkerID;&lt;br /&gt;&lt;br /&gt;    CBufferPtr        m_sndBuffer;&lt;br /&gt;    CCriSec            m_scBuffer;&lt;br /&gt;    CEvt            m_evBuffer;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;volatile&lt;/span&gt; BOOL    m_bStarted;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 监听器对象指针&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;strong&gt;IClientSocketListener* m_pListener;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;#ifndef _WIN32_WCE&lt;br /&gt;    __declspec(thread) &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; En_ISC_Error    sm_enLastError;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;volatile&lt;/span&gt; En_ISC_Error                    sm_enLastError;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;};&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;从上面的定义可以看出，组件实现类本身并没有提供额外的公共方法，它完全是可以被替换的。组件在构造函数中接收监听器对象，并且保存为其成员属性，因此可以在需要的时候向监听器发送事件通知。&lt;/p&gt;
&lt;p&gt;另外，不知各位看官是否注意到一个奇怪的成员属性：&amp;ldquo;&lt;strong&gt;CInitSocket m_wsSocket;&lt;/strong&gt; &amp;rdquo;，这个属性在其它地方从来都不会用到，那么它是干嘛的呢？在回答这个问题之前，首先想问问大家：Windows Socket 操作的整个操作过程中，第一个以及最后一个被调用的方法是什么？是 socket()、connect()、bind()、还是&amp;nbsp;closesocket() 吗？都错！答案是 &amp;mdash;&amp;mdash; ::WSAStartup() 和 ::WSACleanup()。每个程序都要调用一下这两个方法确实是很烦的，又不雅观。&amp;nbsp;其实，m_wsSocket 的唯一目的就是为了避免手工调用者两个方法，看看它的定义就明白了：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; CInitSocket&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    CInitSocket(LPWSADATA lpWSAData = NULL, BYTE minorVersion = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;, BYTE majorVersion = &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;)&lt;br /&gt;    {&lt;br /&gt;        LPWSADATA lpTemp = lpWSAData;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(!lpTemp)&lt;br /&gt;            lpTemp    = (LPWSADATA)_alloca(&lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(WSADATA));&lt;br /&gt;&lt;br /&gt;        m_iResult    = &lt;strong&gt;::WSAStartup(MAKEWORD(minorVersion, majorVersion), lpTemp)&lt;/strong&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    ~CInitSocket()&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(IsValid())&lt;br /&gt;            &lt;strong&gt;::WSACleanup()&lt;/strong&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;        GetResult()    {&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_iResult;}&lt;br /&gt;    BOOL    IsValid()    {&lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; m_iResult == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt;        m_iResult;&lt;br /&gt;};&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;现在我们看看组件类实现文件中几个重要方法的定义：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件事件触发宏定义&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireConnect&lt;/strong&gt;(id)                    m_pListener-&amp;gt;OnConnect(id)&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireSend&lt;/strong&gt;(id, data, len)            (m_bStarted ? m_pListener-&amp;gt;OnSend(id, data, len)    : ISocketListener::HR_IGNORE)&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireReceive&lt;/strong&gt;(id, data, len)        (m_bStarted ? m_pListener-&amp;gt;OnReceive(id, data, len)    : ISocketListener::HR_IGNORE)&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireClose&lt;/strong&gt;(id)                    (m_bStarted ? m_pListener-&amp;gt;OnClose(id)                : ISocketListener::HR_IGNORE)&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#define&lt;/span&gt; &lt;strong&gt;FireError&lt;/strong&gt;(id, op, code)            (m_bStarted ? m_pListener-&amp;gt;OnError(id, op, code)    : ISocketListener::HR_IGNORE)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 启动组件&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;BOOL CSocketClient::Start(LPCTSTR pszRemoteAddress, USHORT usPort)&lt;br /&gt;{&lt;br /&gt;    BOOL isOK = FALSE;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(HasStarted())&lt;br /&gt;    {&lt;br /&gt;        SetLastError(ISC_CLIENT_HAD_STARTED, _T(__FUNCTION__), &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; isOK;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 创建 socket&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(CreateClientSocket())&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 连接服务器（内部会调用 &lt;strong&gt;FireConnect()&lt;/strong&gt; ）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(ConnectToServer(pszRemoteAddress, usPort))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 创建工作线程&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(CreateWorkerThread())&lt;br /&gt;                isOK = TRUE;&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;                SetLastError(ISC_WORKER_CREATE_FAIL, _T(__FUNCTION__), &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;            SetLastError(ISC_CONNECT_SERVER_FAIL, _T(__FUNCTION__), ::WSAGetLastError());&lt;br /&gt;    }&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;        SetLastError(ISC_SOCKET_CREATE_FAIL, _T(__FUNCTION__), ::WSAGetLastError());&lt;br /&gt;&lt;br /&gt;    isOK ? m_bStarted = TRUE : Stop();&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; isOK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭组件&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;BOOL CSocketClient::Stop()&lt;br /&gt;{&lt;br /&gt;    {&lt;br /&gt;        CCriSecLock locallock(m_scStop);&lt;br /&gt;&lt;br /&gt;        m_bStarted = FALSE;&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(m_hWorker != NULL)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 停止工作线程&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(::GetCurrentThreadId() != m_dwWorkerID)&lt;br /&gt;                WaitForWorkerThreadEnd();&lt;br /&gt;&lt;br /&gt;            ::CloseHandle(m_hWorker);&lt;br /&gt;            m_hWorker        = NULL;&lt;br /&gt;            m_dwWorkerID    = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(m_evSocket != NULL)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭 WSAEvent&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            ::WSACloseEvent(m_evSocket);&lt;br /&gt;            m_evSocket    = NULL;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(m_soClient != INVALID_SOCKET)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 关闭socket&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            shutdown(m_soClient, SD_SEND);&lt;br /&gt;            closesocket(m_soClient);&lt;br /&gt;            m_soClient    = INVALID_SOCKET;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        m_dwConnID = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 释放其它资源&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_sndBuffer.Free();&lt;br /&gt;    m_evBuffer.Reset();&lt;br /&gt;    m_evStop.Reset();&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;BOOL CSocketClient::Send(DWORD dwConnID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pBuffer, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen)&lt;br /&gt;{&lt;br /&gt;    ASSERT(iLen &amp;gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(!HasStarted())&lt;br /&gt;    {&lt;br /&gt;        SetLastError(ISC_CLIENT_NOT_STARTED, _T(__FUNCTION__), &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    CCriSecLock locallock(m_scBuffer);&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 把数据存入缓冲器&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_sndBuffer.Cat(pBuffer, iLen);&lt;br /&gt;　　&lt;span style=&quot;color: #008000;&quot;&gt;// 唤醒工作现场，发送数据&lt;/span&gt;&lt;br /&gt;    m_evBuffer.Set();&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 工作线程函数&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;#ifndef _WIN32_WCE&lt;br /&gt;    UINT&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#else&lt;/span&gt;&lt;br /&gt;    DWORD&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;#endif&lt;/span&gt;&lt;br /&gt;    WINAPI CSocketClient::WorkerThreadProc(LPVOID pv)&lt;br /&gt;{&lt;br /&gt;    CSocketClient* pClient = (CSocketClient*)pv;&lt;br /&gt;&lt;br /&gt;    TRACE0(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;---------------&amp;gt; 启动工作线程 &amp;lt;---------------\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    HANDLE hEvents[] = {pClient-&amp;gt;m_evSocket, pClient-&amp;gt;m_evBuffer, pClient-&amp;gt;m_evStop};&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt;(pClient-&amp;gt;HasStarted())&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 等待 socket 事件、发送数据事件和停止通信事件&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;        DWORD retval = ::MsgWaitForMultipleObjectsEx(&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;, hEvents, WSA_INFINITE, QS_ALLINPUT, MWMO_INPUTAVAILABLE);&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(retval == WSA_WAIT_EVENT_0)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理网络消息&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(!pClient-&amp;gt;ProcessNetworkEvent())&lt;br /&gt;            {&lt;br /&gt;                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(pClient-&amp;gt;HasStarted())&lt;br /&gt;                    pClient-&amp;gt;Stop();&lt;br /&gt;&lt;br /&gt;                &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(retval == WSA_WAIT_EVENT_0 + &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据（内部调用 &lt;strong&gt;FireSend()&lt;/strong&gt; ）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(!pClient-&amp;gt;SendData())&lt;br /&gt;            {&lt;br /&gt;                &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(pClient-&amp;gt;HasStarted())&lt;br /&gt;                    pClient-&amp;gt;Stop();&lt;br /&gt;&lt;br /&gt;                &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;            }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(retval == WSA_WAIT_EVENT_0 + &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;)&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(retval == WSA_WAIT_EVENT_0 + &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 消息循环&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            ::PeekMessageLoop();&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;            ASSERT(FALSE);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    TRACE0(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;---------------&amp;gt; 退出工作线程 &amp;lt;---------------\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理网络消息&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;BOOL CSocketClient::ProcessNetworkEvent()&lt;br /&gt;{&lt;br /&gt;    ::WSAResetEvent(m_evSocket);&lt;br /&gt;&lt;br /&gt;    WSANETWORKEVENTS events;&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; rc = ::WSAEnumNetworkEvents(m_soClient, m_evSocket, &amp;amp;events);&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(rc == SOCKET_ERROR)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; code = ::WSAGetLastError();&lt;br /&gt;        SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), code);&lt;br /&gt;        &lt;strong&gt;FireError&lt;/strong&gt;(m_dwConnID, SO_UNKNOWN, code);&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 可读取 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(events.lNetworkEvents &amp;amp; FD_READ)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iCode = events.iErrorCode[FD_READ_BIT];&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(iCode == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 读取数据（内部调用 &lt;strong&gt;FireReceive()&lt;/strong&gt; ）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ReadData();&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), iCode);&lt;br /&gt;            &lt;strong&gt;FireError&lt;/strong&gt;(m_dwConnID, SO_RECEIVE, iCode);&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 可发送 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(events.lNetworkEvents &amp;amp; FD_WRITE)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iCode = events.iErrorCode[FD_WRITE_BIT];&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(iCode == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据（内部调用 &lt;strong&gt;FireSend()&lt;/strong&gt; ）&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; SendData();&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), iCode);&lt;br /&gt;            &lt;strong&gt;FireError&lt;/strong&gt;(m_dwConnID, SO_SEND, iCode);&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; socket 已关闭 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(events.lNetworkEvents &amp;amp; FD_CLOSE)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iCode = events.iErrorCode[FD_CLOSE_BIT];&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(iCode == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;            &lt;strong&gt;FireClose&lt;/strong&gt;(m_dwConnID);&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;        {&lt;br /&gt;            SetLastError(ISC_NETWORK_ERROR, _T(__FUNCTION__), iCode);&lt;br /&gt;            &lt;strong&gt;FireError&lt;/strong&gt;(m_dwConnID, SO_UNKNOWN, iCode);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; FALSE;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; TRUE;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;从上面的代码可以看出：通信过程中，组件的使用者不需要对通信过程进行任何干预，整个底层通信过程对使用者来说是透明的，使用只需集中精力处理好几个组件通知。下面来看看组件的一个使用示例：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件使用者：实现 IClientSocketListener &lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;CMainClient : &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;IClientSocketListener&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 这些方法会操作组件&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; Login(LPCTSTR pszAddress, USHORT usPort, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; T_101_Data* pData);&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; Logout(&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; T_201_Data* pData);&lt;br /&gt;        BOOL SendData(EnCommandType enCmdType, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; TCommandData* pCmdData, WORD wCmdDataLen);&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt;    GetLastError();&lt;br /&gt;    LPCTSTR    GetLastErrorDesc();&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 实现 IClientSocketListener&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnConnect(DWORD dwConnectionID);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnSend(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLength);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnReceive(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnClose(DWORD dwConnectionID);&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; EnHandleResult OnError(DWORD dwConnectionID, EnSocketOperation enOperation, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iErrorCode);&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    BOOL ParseReceiveBuffer();&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 其它方法 。。。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 构造函数&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;:&lt;br /&gt;&lt;strong&gt; CMainClient()&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 创建组件，并把自己设置为组件的监听器&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt; : m_pscClient(&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; CSocketClient(&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;))&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; , m_dwConnID(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; {&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt; }&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; ~CMainClient()    {}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;:&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 组件属性&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;   &lt;strong&gt; ISocketClientPtr m_pscClient;&lt;/strong&gt;&lt;br /&gt;    DWORD               m_dwConnID;&lt;br /&gt;    &lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 其它属性 。。。&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;};&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;BOOL CMainClient::Login(LPCTSTR pszAddress, USHORT usPort, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; T_101_Data* pData)&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 启动通信&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;    &lt;strong&gt;m_pscClient-&amp;gt;Start&lt;/strong&gt;(pszAddress, usPort) &amp;amp;&amp;amp;&lt;br /&gt;            SendData(CS_C_LOGIN_REQ, pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(T_101_Data));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CMainClient::Logout(&lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; T_201_Data* pData)&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt;(pData)&lt;br /&gt;    {&lt;br /&gt;        SendData(CS_C_SET_STATUS, pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;sizeof&lt;/span&gt;(T_201_Data));&lt;br /&gt;        ::WaitWithMessageLoop(LOGOUT_WAIT_TIME);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 停止通信&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;strong&gt;m_pscClient-&amp;gt;Stop()&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;BOOL CMainClient::SendData(EnCommandType enCmdType, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; TCommandData* pCmdData, WORD wCmdDataLen)&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; WORD wBufferLen    = CMD_ADDITIVE_SIZE + wCmdDataLen;&lt;br /&gt;    CPrivateHeapByteBuffer buffer(m_hpPrivate, wBufferLen);&lt;br /&gt;    BYTE* pBuffer    = buffer;&lt;br /&gt;&lt;br /&gt;    memcpy(pBuffer, &amp;amp;wBufferLen, CMD_LEN_SIZE);&lt;br /&gt;    pBuffer += CMD_LEN_SIZE;&lt;br /&gt;    memcpy(pBuffer, &amp;amp;enCmdType, CMD_TYPE_SIZE);&lt;br /&gt;    pBuffer += CMD_TYPE_SIZE;&lt;br /&gt;    memcpy(pBuffer, pCmdData, wCmdDataLen);&lt;br /&gt;    pBuffer += wCmdDataLen;&lt;br /&gt;    memcpy(pBuffer, &amp;amp;CMD_FLAG, CMD_FLAG_SIZE);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 发送数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;strong&gt;m_pscClient-&amp;gt;Send(m_dwConnID, buffer, wBufferLen)&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt; CMainClient::GetLastError()&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 获取通信错误码&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;strong&gt;m_pscClient-&amp;gt;GetLastError()&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;LPCTSTR CMainClient::GetLastErrorDesc()&lt;br /&gt;{&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 获取通信错误描述&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;strong&gt;m_pscClient-&amp;gt;GetLastErrorDesc()&lt;/strong&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理连接成功事件 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnConnect(DWORD dwConnectionID)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE1(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;CNNID: %d&amp;gt; 已连接\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID);&lt;br /&gt;    m_dwConnID = dwConnectionID;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; HR_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理数据已发出事件 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnSend(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLength)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE2(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;CNNID: %d&amp;gt; 发出数据包 (%d bytes)\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID, iLength);&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; HR_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理接收到数据事件&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnReceive(DWORD dwConnectionID, &lt;span style=&quot;color: #0000ff;&quot;&gt;const&lt;/span&gt; BYTE* pData, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iLen)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE2(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;CNNID: %d&amp;gt; 接收数据包 (%d bytes)\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID, iLen);&lt;br /&gt;&lt;br /&gt;    ASSERT(pData != NULL &amp;amp;&amp;amp; iLen &amp;gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 保存数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_rcBuffer.Cat(pData, iLen);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 解析数据&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ParseReceiveBuffer() ? HR_OK : HR_ERROR;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理通信关闭事件&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnClose(DWORD dwConnectionID)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE1(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;CNNID: %d&amp;gt; 关闭连接\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 清理缓冲区&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_rcBuffer.Realloc(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; HR_OK;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;/*&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 处理通信错误事件 &lt;/span&gt;&lt;/strong&gt;&lt;span style=&quot;color: #008000;&quot;&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;ISocketListener::EnHandleResult CMainClient::OnError(DWORD dwConnectionID, EnSocketOperation enOperation, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; iErrorCode)&lt;/strong&gt;&lt;br /&gt;{&lt;br /&gt;    TRACE3(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&amp;lt;CNNID: %d&amp;gt; 网络错误 (OP: %d, CO: %d)\n&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, dwConnectionID, enOperation, iErrorCode);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 清理缓冲区&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    m_rcBuffer.Realloc(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; HR_OK;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;好了，码了一个晚上的字，累啊！到此为止吧，感谢收看~&lt;/p&gt;
&lt;p&gt;如果反应够好的话本座或许会找个时间继续发表《&lt;strong&gt;基于 IOCP 的通用异步 Windows TCP Socket 服务端组件的设计与实现&lt;/strong&gt;》，晚安 ^_^&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;（&lt;a href=&quot;http://files.cnblogs.com/ldcsaa/socket.zip&quot;&gt;想看源代码的朋友请狂点这里&lt;/a&gt;）&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/ldcsaa/aggbug/2351756.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 01:26:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/ldcsaa/archive/2012/02/15/2351756.html</guid><dc:creator>~怪^_*兽~</dc:creator></item><item><title>通用权限管理系统组件 (GPM - General Permissions Manager) 中灵活经典的.NET2.0数据库访问组件，附源码</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/jirigala/archive/2012/02/15/2352027.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>MVP-通用权限管理</name><uri>http://www.cnblogs.com/jirigala/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;情人节的晚上思绪万千，想到了曾经的N次恋爱，想到现在生活，想到曾经的奋斗，想到曾经在身边的女人，人生不易终于失眠了，上一篇我们介绍了&amp;nbsp;&lt;font color=&quot;#6699cc&quot;&gt;&lt;a id=&quot;ctl03_lnkTitle&quot; href=&quot;http://www.cnblogs.com/jirigala/archive/2012/02/14/2350279.html&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#6699cc&quot;&gt;通用权限管理系统组件 (GPM - General Permissions Manager) 中超级经典的.NET2.0静态数据库访问组件&lt;/font&gt;&lt;/a&gt;&amp;nbsp;&lt;/font&gt;&amp;nbsp;两者的区别就是一个是&lt;span style=&quot;color: red;&quot;&gt; static&lt;/span&gt; 的方法，另外一个是通过接口的方式实现的，接着我们介绍更加灵活的，动态数据库5种实用方法，与上一篇的数据库访问组件结合实用会更加强大一些，真正功能强大的是没任何封装的ADO.NET，其实自己封装的往往都是有些娱乐精神的人干出来的事情。&lt;/p&gt;&lt;p&gt;当然这些数据库访问组件都是可以单独使用的，可以与通用权限管理系统组件无任何关联。通用权限的很多实现理念就是无关性，通用权限与数据库访问组件是无关的，数据库库访问组件就可以单独用，甚至没任何无用的代码，配置在里面。&lt;/p&gt;&lt;p&gt;我们直接看代码如下：&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;-----------------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;All&amp;nbsp;Rights&amp;nbsp;Reserved&amp;nbsp;,&amp;nbsp;Copyright&amp;nbsp;(C)&amp;nbsp;2012&amp;nbsp;,&amp;nbsp;Hairihan&amp;nbsp;TECH,&amp;nbsp;Ltd.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;-----------------------------------------------------------------&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;System.Data;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;DotNet.Utilities;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;DotNet.Business;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DbTools2&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;静态数据库访问的方法程序&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;修改纪录&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2012-02-15&amp;nbsp;版本：1.0&amp;nbsp;JiRiGaLa&amp;nbsp;整理例子程序功能。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;版本：1.0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;author&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;JiRiGaLa&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;date&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;2012-02-15&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/date&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/author&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;&amp;nbsp;DbTools2&amp;nbsp;:&amp;nbsp;BasePage&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&amp;nbsp;Page_Load(&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态方法调用数据库的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.DynamicMethod();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态打开数据库的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.Oracle))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.MySql))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.DB2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.Access))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.SQLite))&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.SqlServer))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Open(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&amp;nbsp;DynamicMethod()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.Fill();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.ExecuteNonQuery();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.ExecuteScalar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.ExecuteReader();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;Fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态方法调用数据库的方法，能有效控制数据库的开关次数&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&amp;nbsp;Fill()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.DB2Helper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.MySqlHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.OleDbHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.OracleHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.SqLiteHelper(dbConnection);&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;DotNet.Utilities.SqlHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Open();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;1：直接执行&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataTable&amp;nbsp;dataTable&amp;nbsp;=&amp;nbsp;dbHelper.Fill(commandText);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;2：防注入的安全的参数化运行方式执行查询&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;SELECT&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;)&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;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;AND&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;这里是生成安全参数的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;&amp;nbsp;dbParameters&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;jirigala&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataTable&amp;nbsp;=&amp;nbsp;dbHelper.Fill(commandText,&amp;nbsp;dbParameters.ToArray());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;3：执行存储过程，假设也是需要传递这2个参数，类似功能的一个存储过程&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们不建议用存储过程，因为会对系统移植，多数据库设计等上会遇到很多麻烦&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;GET_USER&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataTable&amp;nbsp;=&amp;nbsp;dbHelper.Fill(commandText,&amp;nbsp;dbParameters.ToArray(),&amp;nbsp;CommandType.StoredProcedure);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;ExecuteNonQuery&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;静态方法调用数据库的方法，调用事物的方式&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;影响行数&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;int&lt;/span&gt;&amp;nbsp;ExecuteNonQuery()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;int&lt;/span&gt;&amp;nbsp;returnValue&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;DotNet.Utilities.SqlHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Open();&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;dbHelper.BeginTransaction();&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;1：直接执行&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;UPDATE&amp;nbsp;BASE_USER&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;SET&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteNonQuery(commandText);&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;2：防注入的安全的参数化运行方式执行查询&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;UPDATE&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SET&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&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;WHERE&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;DotNet.Utilities.DbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;)&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;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;AND&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;DotNet.Utilities.DbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;);&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;这里是生成安全参数的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;List&amp;lt;IDbDataParameter&amp;gt;&amp;nbsp;dbParameters&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;();&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;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;jirigala&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;));&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;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;));&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteNonQuery(commandText,&amp;nbsp;dbParameters.ToArray());&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;3：执行存储过程，假设也是需要传递这2个参数，类似功能的一个存储过程&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;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们不建议用存储过程，因为会对系统移植，多数据库设计等上会遇到很多麻烦&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;UPDATE_USER&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteNonQuery(commandText,&amp;nbsp;dbParameters.ToArray(),&amp;nbsp;CommandType.StoredProcedure);&lt;br /&gt;&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;dbHelper.CommitTransaction();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.RollbackTransaction();&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;BaseExceptionManager.LogException(dbHelper,&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.UserInfo,&amp;nbsp;ex);&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;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;finally&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;return&lt;/span&gt;&amp;nbsp;returnValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;ExecuteScalar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态方法调用数据库的方法，&amp;nbsp;支持Using的用法&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;结果&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;object&lt;/span&gt;&amp;nbsp;ExecuteScalar()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;object&lt;/span&gt;&amp;nbsp;returnValue&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;(DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;DotNet.Utilities.SqlHelper(dbConnection))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;1：直接执行&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;SELECT&amp;nbsp;CODE&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteScalar(commandText);&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;2：防注入的安全的参数化运行方式执行查询&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;SELECT&amp;nbsp;CODE&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&amp;nbsp;&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;)&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;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;AND&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;);&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;这里是生成安全参数的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;List&amp;lt;IDbDataParameter&amp;gt;&amp;nbsp;dbParameters&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;();&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;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;jirigala&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;));&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;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;));&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteScalar(commandText,&amp;nbsp;dbParameters.ToArray());&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;3：执行存储过程，假设也是需要传递这2个参数，类似功能的一个存储过程&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;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们不建议用存储过程，因为会对系统移植，多数据库设计等上会遇到很多麻烦&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;GET_USER&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteScalar(commandText,&amp;nbsp;dbParameters.ToArray(),&amp;nbsp;CommandType.StoredProcedure);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;return&lt;/span&gt;&amp;nbsp;returnValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;ExecuteReader&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态方法调用数据库的方法，每次执行程序会自动打开关闭数据库的例子，自动会多次打开关闭&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&amp;nbsp;ExecuteReader()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;DotNet.Utilities.SqlHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;1：直接执行&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&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;WHERE&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.ExecuteReader(commandText);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;2：防注入的安全的参数化运行方式执行查询&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;SELECT&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&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;WHERE&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;)&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;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;AND&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;这里是生成安全参数的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;&amp;nbsp;dbParameters&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;jirigala&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.ExecuteReader(commandText,&amp;nbsp;dbParameters.ToArray());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;3：执行存储过程，假设也是需要传递这2个参数，类似功能的一个存储过程&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们不建议用存储过程，因为会对系统移植，多数据库设计等上会遇到很多麻烦&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;GET_USER&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.ExecuteReader(commandText,&amp;nbsp;dbParameters.ToArray(),&amp;nbsp;CommandType.StoredProcedure);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;例子程序下载地址如下：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://files.cnblogs.com/jirigala/CRM.rar&quot;&gt;&lt;font color=&quot;#3d81ee&quot;&gt;/Files/jirigala/CRM.rar&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;.NET 2.0 数据库访问层源码在这里下载：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://files.cnblogs.com/jirigala/DotNet.Utilities.rar&quot;&gt;&lt;font color=&quot;#3d81ee&quot;&gt;/Files/jirigala/DotNet.Utilities.rar&lt;/font&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;
 
 
 
 
 
 
&lt;img src=&quot;http://www.cnblogs.com/jirigala/aggbug/2352027.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/jirigala/archive/2012/02/15/2352027.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>情人节的晚上思绪万千，想到了曾经的N次恋爱，想到现在生活，想到曾经的奋斗，想到曾经在身边的女人，人生不易终于失眠了，上一篇我们介绍了通用权限管理系统组件 (GPM - General Permissions Manager) 中超级经典的.NET2.0静态数据库访问组件两者的区别就是一个是 static 的方法，另外一个是通过接口的方式实现的，接着我们介绍更加灵活的，动态数据库5种实用方法，与上一篇的数据库访问组件结合实用会更加强大一些，真正功能强大的是没任何封装的ADO.NET，其实自己封装的往往都是有些娱乐精神的人干出来的事情。 当然这些数据库访问组件都是可以单独使用的，可以与通用权限管.</description><content:encoded>&lt;p&gt;情人节的晚上思绪万千，想到了曾经的N次恋爱，想到现在生活，想到曾经的奋斗，想到曾经在身边的女人，人生不易终于失眠了，上一篇我们介绍了&amp;nbsp;&lt;font color=&quot;#6699cc&quot;&gt;&lt;a id=&quot;ctl03_lnkTitle&quot; href=&quot;http://www.cnblogs.com/jirigala/archive/2012/02/14/2350279.html&quot; target=&quot;_blank&quot;&gt;&lt;font color=&quot;#6699cc&quot;&gt;通用权限管理系统组件 (GPM - General Permissions Manager) 中超级经典的.NET2.0静态数据库访问组件&lt;/font&gt;&lt;/a&gt;&amp;nbsp;&lt;/font&gt;&amp;nbsp;两者的区别就是一个是&lt;span style=&quot;color: red;&quot;&gt; static&lt;/span&gt; 的方法，另外一个是通过接口的方式实现的，接着我们介绍更加灵活的，动态数据库5种实用方法，与上一篇的数据库访问组件结合实用会更加强大一些，真正功能强大的是没任何封装的ADO.NET，其实自己封装的往往都是有些娱乐精神的人干出来的事情。&lt;/p&gt;&lt;p&gt;当然这些数据库访问组件都是可以单独使用的，可以与通用权限管理系统组件无任何关联。通用权限的很多实现理念就是无关性，通用权限与数据库访问组件是无关的，数据库库访问组件就可以单独用，甚至没任何无用的代码，配置在里面。&lt;/p&gt;&lt;p&gt;我们直接看代码如下：&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;-----------------------------------------------------------------&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;All&amp;nbsp;Rights&amp;nbsp;Reserved&amp;nbsp;,&amp;nbsp;Copyright&amp;nbsp;(C)&amp;nbsp;2012&amp;nbsp;,&amp;nbsp;Hairihan&amp;nbsp;TECH,&amp;nbsp;Ltd.&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;-----------------------------------------------------------------&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;System;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;System.Data;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;System.Collections.Generic;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;DotNet.Utilities;&lt;br /&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;DotNet.Business;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DbTools2&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;静态数据库访问的方法程序&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;修改纪录&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2012-02-15&amp;nbsp;版本：1.0&amp;nbsp;JiRiGaLa&amp;nbsp;整理例子程序功能。&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;版本：1.0&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;author&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;name&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;JiRiGaLa&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/name&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;date&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;2012-02-15&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/date&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/author&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;partial&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;class&lt;/span&gt;&amp;nbsp;DbTools2&amp;nbsp;:&amp;nbsp;BasePage&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&amp;nbsp;Page_Load(&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;object&lt;/span&gt;&amp;nbsp;sender,&amp;nbsp;EventArgs&amp;nbsp;e)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态方法调用数据库的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.DynamicMethod();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态打开数据库的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.Oracle))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.MySql))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.DB2))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.Access))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;using&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.SQLite))&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;(IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;DbHelperFactory.GetHelper(CurrentDbType.SqlServer))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Open(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&amp;nbsp;DynamicMethod()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.Fill();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.ExecuteNonQuery();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.ExecuteScalar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.ExecuteReader();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;Fill&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态方法调用数据库的方法，能有效控制数据库的开关次数&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&amp;nbsp;Fill()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.DB2Helper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.MySqlHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.OleDbHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.OracleHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;new&amp;nbsp;DotNet.Utilities.SqLiteHelper(dbConnection);&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;DotNet.Utilities.SqlHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Open();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;1：直接执行&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataTable&amp;nbsp;dataTable&amp;nbsp;=&amp;nbsp;dbHelper.Fill(commandText);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;2：防注入的安全的参数化运行方式执行查询&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;SELECT&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;)&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;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;AND&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;这里是生成安全参数的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;&amp;nbsp;dbParameters&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;jirigala&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataTable&amp;nbsp;=&amp;nbsp;dbHelper.Fill(commandText,&amp;nbsp;dbParameters.ToArray());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;3：执行存储过程，假设也是需要传递这2个参数，类似功能的一个存储过程&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们不建议用存储过程，因为会对系统移植，多数据库设计等上会遇到很多麻烦&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;GET_USER&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dataTable&amp;nbsp;=&amp;nbsp;dbHelper.Fill(commandText,&amp;nbsp;dbParameters.ToArray(),&amp;nbsp;CommandType.StoredProcedure);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;ExecuteNonQuery&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;静态方法调用数据库的方法，调用事物的方式&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;影响行数&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;int&lt;/span&gt;&amp;nbsp;ExecuteNonQuery()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;int&lt;/span&gt;&amp;nbsp;returnValue&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;DotNet.Utilities.SqlHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;try&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Open();&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;dbHelper.BeginTransaction();&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;1：直接执行&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;UPDATE&amp;nbsp;BASE_USER&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;SET&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteNonQuery(commandText);&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;2：防注入的安全的参数化运行方式执行查询&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;UPDATE&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SET&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&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;WHERE&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;DotNet.Utilities.DbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;)&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;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;AND&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;DotNet.Utilities.DbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;);&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;这里是生成安全参数的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;List&amp;lt;IDbDataParameter&amp;gt;&amp;nbsp;dbParameters&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;();&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;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;jirigala&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;));&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;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;));&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteNonQuery(commandText,&amp;nbsp;dbParameters.ToArray());&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;3：执行存储过程，假设也是需要传递这2个参数，类似功能的一个存储过程&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;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们不建议用存储过程，因为会对系统移植，多数据库设计等上会遇到很多麻烦&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;UPDATE_USER&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteNonQuery(commandText,&amp;nbsp;dbParameters.ToArray(),&amp;nbsp;CommandType.StoredProcedure);&lt;br /&gt;&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;dbHelper.CommitTransaction();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.RollbackTransaction();&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;BaseExceptionManager.LogException(dbHelper,&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;this&lt;/span&gt;.UserInfo,&amp;nbsp;ex);&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;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;finally&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.Close();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;return&lt;/span&gt;&amp;nbsp;returnValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;ExecuteScalar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态方法调用数据库的方法，&amp;nbsp;支持Using的用法&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;结果&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;object&lt;/span&gt;&amp;nbsp;ExecuteScalar()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;object&lt;/span&gt;&amp;nbsp;returnValue&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;using&lt;/span&gt;&amp;nbsp;(DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;DotNet.Utilities.SqlHelper(dbConnection))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;1：直接执行&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;SELECT&amp;nbsp;CODE&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteScalar(commandText);&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;2：防注入的安全的参数化运行方式执行查询&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;SELECT&amp;nbsp;CODE&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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&amp;nbsp;&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;)&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;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;AND&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;);&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;这里是生成安全参数的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;List&amp;lt;IDbDataParameter&amp;gt;&amp;nbsp;dbParameters&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;();&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;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;jirigala&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;));&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;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;));&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteScalar(commandText,&amp;nbsp;dbParameters.ToArray());&lt;br /&gt;&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;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;3：执行存储过程，假设也是需要传递这2个参数，类似功能的一个存储过程&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;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们不建议用存储过程，因为会对系统移植，多数据库设计等上会遇到很多麻烦&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&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;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;GET_USER&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&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;returnValue&amp;nbsp;=&amp;nbsp;dbHelper.ExecuteScalar(commandText,&amp;nbsp;dbParameters.ToArray(),&amp;nbsp;CommandType.StoredProcedure);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;return&lt;/span&gt;&amp;nbsp;returnValue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;ExecuteReader&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;动态方法调用数据库的方法，每次执行程序会自动打开关闭数据库的例子，自动会多次打开关闭&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 128, 128);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;void&lt;/span&gt;&amp;nbsp;ExecuteReader()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;dbConnection&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Data&amp;nbsp;Source=localhost;Initial&amp;nbsp;Catalog=UserCenterV36;User&amp;nbsp;Id&amp;nbsp;=&amp;nbsp;sa&amp;nbsp;;&amp;nbsp;Password&amp;nbsp;=&amp;nbsp;Password@1234;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DotNet.Utilities.IDbHelper&amp;nbsp;dbHelper&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;DotNet.Utilities.SqlHelper(dbConnection);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;1：直接执行&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;string&lt;/span&gt;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;SELECT&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&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;WHERE&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;0&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.ExecuteReader(commandText);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;2：防注入的安全的参数化运行方式执行查询&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;@&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;SELECT&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;FROM&amp;nbsp;BASE_USER&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;WHERE&amp;nbsp;CODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;)&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;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&amp;nbsp;AND&amp;nbsp;DELETIONSTATECODE&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;+&amp;nbsp;dbHelper.GetParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;这里是生成安全参数的方法&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;&amp;nbsp;dbParameters&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(0, 0, 255);&quot;&gt;new&lt;/span&gt;&amp;nbsp;List&amp;lt;IDbDataParameter&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;Code&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;jirigala&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbParameters.Add(dbHelper.MakeParameter(&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;DeletionStateCode&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;,&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 128);&quot;&gt;0&lt;/span&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.ExecuteReader(commandText,&amp;nbsp;dbParameters.ToArray());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;3：执行存储过程，假设也是需要传递这2个参数，类似功能的一个存储过程&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;我们不建议用存储过程，因为会对系统移植，多数据库设计等上会遇到很多麻烦&lt;/span&gt;&lt;span style=&quot;color: rgb(0, 128, 0);&quot;&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;commandText&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;GET_USER&lt;/span&gt;&lt;span style=&quot;color: rgb(128, 0, 0);&quot;&gt;&quot;&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbHelper.ExecuteReader(commandText,&amp;nbsp;dbParameters.ToArray(),&amp;nbsp;CommandType.StoredProcedure);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;例子程序下载地址如下：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://files.cnblogs.com/jirigala/CRM.rar&quot;&gt;&lt;font color=&quot;#3d81ee&quot;&gt;/Files/jirigala/CRM.rar&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;.NET 2.0 数据库访问层源码在这里下载：&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://files.cnblogs.com/jirigala/DotNet.Utilities.rar&quot;&gt;&lt;font color=&quot;#3d81ee&quot;&gt;/Files/jirigala/DotNet.Utilities.rar&lt;/font&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;
 
 
 
 
 
 
&lt;img src=&quot;http://www.cnblogs.com/jirigala/aggbug/2352027.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/jirigala/archive/2012/02/15/2352027.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 01:25:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/jirigala/archive/2012/02/15/2352027.html</guid><dc:creator>MVP-通用权限管理</dc:creator></item><item><title>基于ArcGIS10.0和Oracle10g的空间数据管理平台十七（C#开发）-空间数据编辑（下）</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/brucewoo/archive/2012/02/15/2352013.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>蔷薇理想人生</name><uri>http://www.cnblogs.com/brucewoo/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;我的新浪微博：&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://weibo.com/freshairbrucewoo&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;http://weibo.com/freshairbrucewoo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;欢迎大家相互交流，共同提高技术。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 上一篇介绍了空间数据编辑一部分实现，今天继续完成剩余的部分实现。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;1.根据选择编辑任务的不同显示不同形状的鼠标，以便指示相应任务方便编辑操作&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 根据选择编辑任务的不同显示不同形状的鼠标，以便指示相应任务方便编辑操作&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;sender&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;e&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; cboTasks_SelectedIndexChanged(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Restate &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             m_MapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             m_bEditingFtr = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             m_bSketching = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             m_bSelecting = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             m_bMove = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Select an operation and mouse pointer depending on the user choice &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (cboTasks.SelectedIndex)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                     &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Do Nothing - the tool has already been reset &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                     m_bEditingFtr = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerPencil;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;                     m_bSketching = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                     m_bSelecting = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerHand;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                     m_bMove = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;             } &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;2.选择需要的图层并且在地图编辑控件中显示出来&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 选择需要的图层并且在地图编辑控件中显示出来&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;sender&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;e&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; cboLayers_SelectedIndexChanged(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pMap == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Clear any existing selection &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             m_pMap.ClearSelection();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             IActiveView ipActiveView;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             ipActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             ipActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             String strLayerName = cboLayers.SelectedItem.ToString();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             axMapControl1.Map.ClearLayers();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             AddLayerToMapCtl(strLayerName, &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;             m_pCurrentLayer = m_pMap.get_Layer(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;             SetControlStates();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;3.测试是否击中地图对象或地图对象上的节点&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 测试是否击中地图对象或地图对象上的节点&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;tolerance&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;查询容差&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pPoint&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;点击位置&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pFeature&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;测试对象&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pHitPoint&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;查询目标点&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;hitDist&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;目标点与点击点距离&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;partIndex&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;节索引&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;vertexIndex&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;点索引&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;vertexHit&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;是否击中点&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;是否击中测试对象&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; TestGeometryHit(&lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; tolerance, IPoint pPoint, IFeature pFeature, &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; IPoint pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; vertexIndex, &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; vertexHit)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Function returns true if a feature's shape is hit and further defines &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; if a vertex lies within the tolorance &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; bRetVal = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             IGeometry pGeom = (IGeometry)pFeature.Shape;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;             IHitTest pHitTest = (IHitTest)pGeom;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;             pHitPoint = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; ESRI.ArcGIS.Geometry.Point();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; bTrue = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; First check if a vertex was hit &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 检查节点是否被击中&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pHitTest.HitTest(pPoint, tolerance, esriGeometryHitPartType.esriGeometryPartVertex, &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                 pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; bTrue))&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 bRetVal = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                 vertexHit = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Secondly check if a boundary was hit &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 检边界是否被击中&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pHitTest.HitTest(pPoint, tolerance,  esriGeometryHitPartType.esriGeometryPartBoundary,&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                 pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; bTrue))&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                 bRetVal = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;                 vertexHit = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Calculate offset to vertexIndex for multipatch geometries &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (partIndex &amp;gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;                 IGeometryCollection pGeomColn = (IGeometryCollection)pGeom;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;                 vertexOffset = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;; i &amp;lt; partIndex; i++)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;                     IPointCollection pPointColn = (IPointCollection)pGeomColn.get_Geometry(i);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;                     vertexOffset = vertexOffset + pPointColn.PointCount;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;53&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;54&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; bRetVal;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;55&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;4.向图层中更新新的地图对象，并使之处于选中状态&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 向图层中更新新的地图对象，并使之处于选中状态&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pFeature&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pGeometry&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; UpdateFeature(IFeature pFeature, IGeometry pGeometry)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Make sure we are actually editing this layer. If not give a warning. &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             IDataset pDataset = (IDataset)pFeature.Class;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!pWorkspaceEdit.IsBeingEdited())&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;                 System.Windows.Forms.MessageBox.Show(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;This feature is in a layer not in edit mode. \nEdit cannot be made.Start edit and try again.&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;,&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                     &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; If all tests succeed allow feature edits to be saved &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             pWorkspaceEdit.StartEditOperation();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             pFeature.Shape = pGeometry;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             pFeature.Store();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             pWorkspaceEdit.StopEditOperation();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;5.屏幕坐标转换为地图坐标&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 屏幕坐标转换为地图坐标&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pActiveView&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;地图&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pixelUnits&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;地图坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; ConvertPixelsToMapUnits(IActiveView pActiveView, &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; pixelUnits)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Uses the ratio of the size of the map in pixels to map units to do the conversion &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             IPoint p1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             IPoint p2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x1, x2, y1, y2;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, &lt;span style=&quot;color: #0000ff;&quot;&gt;out&lt;/span&gt; x1, &lt;span style=&quot;color: #0000ff;&quot;&gt;out&lt;/span&gt; y1);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p2, &lt;span style=&quot;color: #0000ff;&quot;&gt;out&lt;/span&gt; x2, &lt;span style=&quot;color: #0000ff;&quot;&gt;out&lt;/span&gt; y2);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; pixelExtent = x2 - x1;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; pixelUnits * sizeOfOnePixel;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;6.处理地图控件上的目标按下事件&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; axMapControl1_OnMouseDown(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, IMapControlEvents2_OnMouseDownEvent e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;首先判断当前用户选择了何种任务，并去完成相应的任务；如果没有选择任何任务，&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;即cboTasks的选项为没有任务时，该事件处理程序用于放大、缩小地图，鼠标左键&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;用于放大，其他键用于缩小&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;             m_pMap.ClearSelection();&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;清除地图中已选的要素&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bSketching)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;新建要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 SketchMouseDown(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bSelecting)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;选择要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;                 SelectMouseDown(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bEditingFtr)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;编辑要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;                 EditFeature(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bMove)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;移动要素&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                 MoveFeatureMouseDown(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Zoom in/out depending on which button was pressed &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                 IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                 IEnvelope pEnvelope = pActiveView.Extent;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                 ESRI.ArcGIS.Geometry.Point pnt = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; ESRI.ArcGIS.Geometry.Point();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                 IPoint iPnt = pnt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                 iPnt.X = e.mapX;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                 iPnt.Y = e.mapY;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;                 pEnvelope.CenterAt(iPnt);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (e.button == &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;) &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; left button &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;                     &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;放大视图&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;                     pEnvelope.Expand(&lt;span style=&quot;color: #800080;&quot;&gt;0.5&lt;/span&gt;, &lt;span style=&quot;color: #800080;&quot;&gt;0.5&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;                     &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;缩小视图&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;                     pEnvelope.Expand(&lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;                 pActiveView.Extent = pEnvelope;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;                 pActiveView.Refresh();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;             } &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;7.处理地图控件上的鼠标移动事件&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; axMapControl1_OnMouseMove(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, IMapControlEvents2_OnMouseMoveEvent e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bSketching)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;新建要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;                 SketchMouseMove(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bEditingFtr)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;编辑要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 FtrEditMouseMove(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bMove)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;移动要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;                 MoveFeatureMouseMove(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;8.处理地图控件上的鼠标按下事件&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; axMapControl1_OnMouseUp(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, IMapControlEvents2_OnMouseUpEvent e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bEditingFtr)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;结束编辑任务&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;                 EndFtrEdit(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bMove)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;结束移动要素任务&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 MoveFeatureEnd();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;9.新建对象方法：&lt;span style=&quot;color: #008000;&quot;&gt;当前图层为点图层时，每调用一次就新点一个点对象&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;当前图层为线图层或面图层时，第一次调用开始新建对象，并添加当前点，&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以后每调用一次，即向新对象中添加一个点,调用NewFeatureEnd方法完成对象创建 。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 新建对象方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 当前图层为点图层时，每调用一次就新点一个点对象&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 当前图层为线图层或面图层时，第一次调用开始新建对象，并添加当前点，&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 以后每调用一次，即向新对象中添加一个点,调用NewFeatureEnd方法完成对象创建&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 在Map.MouseDown事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SketchMouseDown(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Starts a new sketch or adds a point to an existing one, of a type &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; determined by the current layer selected in the layers combo. &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Can only sketch on GeoFeature layers &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pCurrentLayer == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; ((IGeoFeatureLayer)m_pCurrentLayer == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the mouse down point in map coordinates &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;             IFeatureLayer pFeatureLayer = (IFeatureLayer)m_pCurrentLayer;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pFeatureLayer.FeatureClass == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; if (this is a fresh sketch) create an appropriate feedback object, &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; otherwise extent the existing feedback &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果是新开始创建的对象，则相应的创建一个新的Feedback对象；&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 否则，向已存在的Feedback对象中加点&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!m_bInUse)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;                 m_pMap.ClearSelection();  &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;清除地图选中对象&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (pFeatureLayer.FeatureClass.ShapeType)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt;                         CreateFeature(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryMultipoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;                         m_bInUse = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; NewMultiPointFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;                         INewMultiPointFeedback pMPFeed = (INewMultiPointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;                         m_pPointCollection = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; Multipoint();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt;                         pMPFeed.Start(m_pPointCollection, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;53&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolyline:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;54&lt;/span&gt;                         m_bInUse = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;55&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; NewLineFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;56&lt;/span&gt;                         INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;57&lt;/span&gt;                         pLineFeed.Start(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;58&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;59&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolygon:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;60&lt;/span&gt;                         m_bInUse = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;61&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; NewPolygonFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;62&lt;/span&gt;                         INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;63&lt;/span&gt;                         pPolyFeed.Start(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;64&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;65&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;66&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback != &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;67&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;68&lt;/span&gt;                     m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;69&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;70&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;71&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;72&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;73&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewMultiPointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;74&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;75&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; Missing = Type.Missing;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;76&lt;/span&gt;                     m_pPointCollection.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;77&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;78&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewLineFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;79&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;80&lt;/span&gt;                     INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;81&lt;/span&gt;                     pLineFeed.AddPoint(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;82&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;83&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewPolygonFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;84&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;85&lt;/span&gt;                     INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;86&lt;/span&gt;                     pPolyFeed.AddPoint(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;87&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;88&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;89&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;10.新建对象过程中鼠标移动方法,产生Track效果&lt;span style=&quot;color: #008080;&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;在Map.MouseMove事件中调用本方法&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 新建对象过程中鼠标移动方法,产生Track效果&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 在Map.MouseMove事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SketchMouseMove(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!m_bInUse || m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Move the feedback envelope and store the current mouse position &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             m_pFeedback.MoveTo(pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y));&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             m_pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;11.完成新建对象，取得绘制的对象，并添加到图层中 &lt;span style=&quot;color: #008080;&quot;&gt;：&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.DblClick或Map.MouseDown(Button = 2)事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 完成新建对象，取得绘制的对象，并添加到图层中&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.DblClick或Map.MouseDown(Button = 2)事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; EndSketch()&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             IGeometry pGeom = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             IPointCollection pPointCollection = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Create a new feature if possible &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewMultiPointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;                 INewMultiPointFeedback pMPFeed = (INewMultiPointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 pMPFeed.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 pGeom = (IGeometry)m_pPointCollection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewLineFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                 INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 pLineFeed.AddPoint(m_pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;                 IPolyline pPolyLine = pLineFeed.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                 pPointCollection = (IPointCollection)pPolyLine;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pPointCollection.PointCount &amp;lt; &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;                     MessageBox.Show(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;至少输入两个节点.&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;错误的线几何对象&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                     pGeom = (IGeometry)pPointCollection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewPolygonFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                 pPolyFeed.AddPoint(m_pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                 IPolygon pPolygon = pPolyFeed.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pPolygon != &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                     pPointCollection = (IPointCollection)pPolygon;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pPointCollection.PointCount &amp;lt; &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                     MessageBox.Show(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;至少输入三个节点.&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;错误的线几何对象&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                     pGeom = (IGeometry)pPointCollection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;             CreateFeature(pGeom);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;             m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;             m_bInUse = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;12.查询当前图层中鼠标位置处的地图对象，&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseDown事件中调用本方法&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 查询当前图层中鼠标位置处的地图对象&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseDown事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SelectMouseDown(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Searches the map for features at the given point in the current layer &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; and selects them &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             m_pMap.ClearSelection();&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;清除地图中已选的要素&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pCurrentLayer == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; ((IGeoFeatureLayer)m_pCurrentLayer == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the feature layer and class of the current layer &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;             IFeatureLayer pFeatureLayer = (IFeatureLayer)m_pCurrentLayer;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;             IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pFeatureClass == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the mouse down position in map coordinates &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;             IGeometry pGeometry = pPoint;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Use a four pixel buffer around the cursor for feature search &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 设置查询缓冲区&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; length = ConvertPixelsToMapUnits(pActiveView, &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             ITopologicalOperator pTopo = (ITopologicalOperator)pGeometry;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;             IGeometry pBuffer = pTopo.Buffer(length);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;             pGeometry = (IGeometry)pBuffer.Envelope;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; up a Filter specific to this layer  &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;设置过滤器对象&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;             ISpatialFilter pSpatialFilter = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; SpatialFilter();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;             pSpatialFilter.Geometry = pGeometry;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (pFeatureClass.ShapeType)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;                     pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolyline:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;53&lt;/span&gt;                     pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;54&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;55&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolygon:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;56&lt;/span&gt;                     pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;57&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;58&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;59&lt;/span&gt;             pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;60&lt;/span&gt;             IQueryFilter pFilter = pSpatialFilter;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;61&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;62&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Do the search &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;63&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 查询&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;64&lt;/span&gt;             IFeatureCursor pCursor = pFeatureLayer.Search(pFilter, &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;65&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;66&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; and select the features on the map &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;67&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 在地图上高亮显示查询结果&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;68&lt;/span&gt;             IFeature pFeature = pCursor.NextFeature();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;69&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; (pFeature != &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;70&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;71&lt;/span&gt;                 m_pMap.SelectFeature(m_pCurrentLayer, pFeature);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;72&lt;/span&gt;                 pFeature = pCursor.NextFeature();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;73&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;74&lt;/span&gt;             pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;75&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;13.编辑当前图层中鼠标击中的地图对象(开始编辑),&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt; 如果为点对象，可进行位置移动，如果为线对象或面对象，可进行节点编辑&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;：&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseDown事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 编辑当前图层中鼠标击中的地图对象(开始编辑),&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果为点对象，可进行位置移动，如果为线对象或面对象，可进行节点编辑&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseDown事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  8&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  9&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; EditFeature(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 10&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 11&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Searches for features under the coordinate provided and starts an edit &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 12&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; operation on the first one found. &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 13&lt;/span&gt;             IPoint pHitPoint = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 14&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; hitDist = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 15&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; partIndex = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 16&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; vertexIndex = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 17&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; vertexOffset = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 18&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; vertex = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 19&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 20&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Use the first feature in the selection &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 21&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 取得鼠标击中的第一个对象&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 22&lt;/span&gt;             SelectMouseDown(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 23&lt;/span&gt;             IEnumFeature pSelected = (IEnumFeature)m_pMap.FeatureSelection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 24&lt;/span&gt;             IFeature pFeature = pSelected.Next();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 25&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pFeature == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 26&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 27&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 28&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 29&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 30&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 31&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 32&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 33&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Tolerance in pixels for line hits &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 34&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 节点空间查询容差&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 35&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; tol = ConvertPixelsToMapUnits(pActiveView, &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 36&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 37&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; The feedback action / edit action depends on the geometry type &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 38&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; and the location of point within the geometry &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 39&lt;/span&gt;             IGeometry pGeom = pFeature.Shape;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 40&lt;/span&gt;             IObjectClass pObjectClass = pFeature.Class;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 41&lt;/span&gt;             m_pEditFeature = pFeature;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 42&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 43&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (pGeom.GeometryType)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 44&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 45&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 46&lt;/span&gt;                     m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; MovePointFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 47&lt;/span&gt;                     m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 48&lt;/span&gt;                     IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 49&lt;/span&gt;                     pPointMove.Start((IPoint)pGeom, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 50&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 51&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 52&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolyline:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 53&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (TestGeometryHit(tol, pPoint, pFeature, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist,&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 54&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertex))&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 55&lt;/span&gt;                     {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 56&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!vertex)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 57&lt;/span&gt;                         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 58&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the path, add a point to it and vertex edit that newly added point &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 59&lt;/span&gt;                             IGeometryCollection pGeomColn = (IGeometryCollection)pGeom;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 60&lt;/span&gt;                             IPath pPath = (IPath)pGeomColn.get_Geometry(partIndex);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 61&lt;/span&gt;                             IPointCollection pPointColn = (IPointCollection)pPath;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 62&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt; numVertices = pPointColn.PointCount;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 63&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 64&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; Missing = Type.Missing;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 65&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; val;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 66&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (vertexIndex == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 67&lt;/span&gt;                             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 68&lt;/span&gt;                                 val = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 69&lt;/span&gt;                                 pPointColn.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; val, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 70&lt;/span&gt;                             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 71&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 72&lt;/span&gt;                             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 73&lt;/span&gt;                                 val = vertexIndex;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 74&lt;/span&gt;                                 pPointColn.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; val);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 75&lt;/span&gt;                             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 76&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 77&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Reset the index pointer to the new index &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 78&lt;/span&gt;                             TestGeometryHit(tol, pPoint, pFeature, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertex);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 79&lt;/span&gt;                         }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 80&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; LineMovePointFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 81&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 82&lt;/span&gt;                         ILineMovePointFeedback pLineMove = (ILineMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 83&lt;/span&gt;                         pLineMove.Start((IPolyline)pGeom, vertexIndex, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 84&lt;/span&gt;                     }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 85&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 86&lt;/span&gt;                     {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 87&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 88&lt;/span&gt;                     }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 89&lt;/span&gt;                     &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 90&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 91&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 92&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolygon:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 93&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (TestGeometryHit(tol, pPoint, pFeature, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist,&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 94&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertex))&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 95&lt;/span&gt;                     {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 96&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!vertex)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 97&lt;/span&gt;                         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 98&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the path, add a point to it and vertex edit that newly added point &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 99&lt;/span&gt;                             IGeometryCollection pGeomColn = (IGeometryCollection)pGeom;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;100&lt;/span&gt;                             IPath pPath = (IPath)pGeomColn.get_Geometry(partIndex);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;101&lt;/span&gt;                             IPointCollection pPointColn = (IPointCollection)pPath;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;102&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt; numVertices = pPointColn.PointCount;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;103&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;104&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Rethe index pointer to the new index &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;105&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; Missing = Type.Missing;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;106&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; val;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;107&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (vertexIndex == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;108&lt;/span&gt;                             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;109&lt;/span&gt;                                 val = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;110&lt;/span&gt;                                 pPointColn.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; val, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;111&lt;/span&gt;                             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;112&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;113&lt;/span&gt;                             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;114&lt;/span&gt;                                 val = vertexIndex;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;115&lt;/span&gt;                                 pPointColn.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; val);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;116&lt;/span&gt;                             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;117&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;118&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Reset the index pointer to the new index &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;119&lt;/span&gt;                             TestGeometryHit(tol, pPoint, pFeature, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertex);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;120&lt;/span&gt;                         }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;121&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; PolygonMovePointFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;122&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;123&lt;/span&gt;                         IPolygonMovePointFeedback pPolyMove = (IPolygonMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;124&lt;/span&gt;                         pPolyMove.Start((IPolygon)pGeom, vertexIndex + vertexOffset, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;125&lt;/span&gt;                     }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;126&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;127&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;128&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;129&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;130&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;131&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;132&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;14.编辑地图对象过程中的鼠标移动事件, &lt;span style=&quot;color: #008000;&quot;&gt;如果为点对象，进行位置移动；&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;如果为线对象或面对象，进行节点移动：&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseMove事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 编辑地图对象过程中的鼠标移动事件,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果为点对象，进行位置移动&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果为线对象或面对象，进行节点移动&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseMove事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; FtrEditMouseMove(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Moves the edit feedback object along with the mouse. &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             m_pFeedback.MoveTo(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;15.结束feature的编辑 &lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 结束feature的编辑&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; EndFtrEdit(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Uses the feedback object&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;s geometry to rethe geometry on the feature &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; being edited. &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; if (no feedback no edit &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IMovePointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                 IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                 IGeometry pGeometry = pPointMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;                 UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; ILineMovePointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                 ILineMovePointFeedback pLineMove = (ILineMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                 IGeometry pGeometry = pLineMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IPolygonMovePointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                 IPolygonMovePointFeedback pPolyMove = (IPolygonMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                 IGeometry pGeometry = pPolyMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                 UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;             pActiveView.Refresh();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;16.移动当前图层中鼠标击中地图对象的位置（开始移动）：&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseDown事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 移动当前图层中鼠标击中地图对象的位置（开始移动）&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseDown事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; MoveFeatureMouseDown(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;                 m_pMap.ClearSelection();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 SelectMouseDown(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 IEnumFeature pSelected = (IEnumFeature)m_pMap.FeatureSelection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;                 IFeature pFeature = pSelected.Next();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pFeature == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;) &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                 IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                 IGeometry pGeom = pFeature.Shape;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                 m_pEditFeature = pFeature;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (pGeom.GeometryType)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; MovePointFeedbackClass();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                         IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                         pPointMove.Start((IPoint)pGeom, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolyline:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; MoveLineFeedbackClass();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;                         IMoveLineFeedback pLineMove = (IMoveLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                         pLineMove.Start((IPolyline)pGeom, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolygon:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; MovePolygonFeedbackClass();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;                         IMovePolygonFeedback pPolyMove = (IMovePolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt;                         pPolyMove.Start((IPolygon)pGeom, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt;                 Console.WriteLine(e.Message.ToString());&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;53&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;54&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;17.移动地图对象过程中的鼠标移动事件：&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseMove事件中调用本方法&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 移动地图对象过程中的鼠标移动事件&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseMove事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; MoveFeatureMouseMove(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;) &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;                 IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 m_pFeedback.MoveTo(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                 Console.WriteLine(e.Message.ToString());&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;18.完成地图对象移动，取得移动后的对象，并将其更新到图层中：&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseUp事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 完成地图对象移动，取得移动后的对象，并将其更新到图层中&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseUp事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; MoveFeatureEnd()&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             IGeometry pGeometry;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;) &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IMovePointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                     IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;                     pGeometry = pPointMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;                     UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IMoveLineFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;                     IMoveLineFeedback pLineMove = (IMoveLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                     pGeometry = pLineMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                     UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IMovePolygonFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;                     IMovePolygonFeedback pPolyMove = (IMovePolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                     pGeometry = pPolyMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                     UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                 m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                 IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                 pActiveView.Refresh();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                 Console.WriteLine(e.Message.ToString());&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;总结：终于结束了，感觉通过可视化来编辑空间数据需要做太多的工作，上面把要做的工作几乎都秒到了，至于具体流程这个只需要简单组织一下逻辑就可以了。更强大的空间数据编辑功能有待于我们更加活跃的思维去创造！OK！今天就到这里了吧！情人节已过，各位coder们赶快回来编程吧！&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/brucewoo/aggbug/2352013.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/brucewoo/archive/2012/02/15/2352013.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>我的新浪微博：http://weibo.com/freshairbrucewoo。欢迎大家相互交流，共同提高技术。 上一篇介绍了空间数据编辑一部分实现，今天继续完成剩余的部分实现。1.根据选择编辑任务的不同显示不同形状的鼠标，以便指示相应任务方便编辑操作 1 /// &amp;lt;summary&amp;gt; 2 /// 根据选择编辑任务的不同显示不同形状的鼠标，以便指示相应任务方便编辑操作 3 /// &amp;lt;/summary&amp;gt; 4 /// &amp;lt;param name=&amp;quot;sender&amp;quot;&amp;gt;&amp;lt;/param&amp;gt; 5 /// &amp;lt;param name=&amp;quot;</description><content:encoded>&lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;我的新浪微博：&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;http://weibo.com/freshairbrucewoo&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;http://weibo.com/freshairbrucewoo&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p align=&quot;center&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;欢迎大家相互交流，共同提高技术。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 上一篇介绍了空间数据编辑一部分实现，今天继续完成剩余的部分实现。&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;1.根据选择编辑任务的不同显示不同形状的鼠标，以便指示相应任务方便编辑操作&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 根据选择编辑任务的不同显示不同形状的鼠标，以便指示相应任务方便编辑操作&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;sender&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;e&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; cboTasks_SelectedIndexChanged(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Restate &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             m_MapControl.MousePointer = esriControlsMousePointer.esriPointerDefault;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             m_bEditingFtr = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             m_bSketching = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             m_bSelecting = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             m_bMove = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Select an operation and mouse pointer depending on the user choice &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (cboTasks.SelectedIndex)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                     &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Do Nothing - the tool has already been reset &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                     m_bEditingFtr = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerPencil;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;                     m_bSketching = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                     m_bSelecting = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                     m_MapControl.MousePointer = esriControlsMousePointer.esriPointerHand;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                     m_bMove = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;             } &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;2.选择需要的图层并且在地图编辑控件中显示出来&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 选择需要的图层并且在地图编辑控件中显示出来&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;sender&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;e&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; cboLayers_SelectedIndexChanged(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pMap == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Clear any existing selection &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             m_pMap.ClearSelection();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             IActiveView ipActiveView;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             ipActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             ipActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             String strLayerName = cboLayers.SelectedItem.ToString();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             axMapControl1.Map.ClearLayers();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             AddLayerToMapCtl(strLayerName, &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;             m_pCurrentLayer = m_pMap.get_Layer(&lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;             SetControlStates();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;3.测试是否击中地图对象或地图对象上的节点&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 测试是否击中地图对象或地图对象上的节点&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;tolerance&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;查询容差&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pPoint&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;点击位置&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pFeature&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;测试对象&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pHitPoint&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;查询目标点&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;hitDist&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;目标点与点击点距离&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;partIndex&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;节索引&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;vertexIndex&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;点索引&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;vertexHit&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;是否击中点&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;是否击中测试对象&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; TestGeometryHit(&lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; tolerance, IPoint pPoint, IFeature pFeature, &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; IPoint pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; vertexIndex, &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; vertexHit)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Function returns true if a feature's shape is hit and further defines &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; if a vertex lies within the tolorance &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; bRetVal = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             IGeometry pGeom = (IGeometry)pFeature.Shape;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;             IHitTest pHitTest = (IHitTest)pGeom;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;             pHitPoint = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; ESRI.ArcGIS.Geometry.Point();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; bTrue = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; First check if a vertex was hit &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 检查节点是否被击中&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pHitTest.HitTest(pPoint, tolerance, esriGeometryHitPartType.esriGeometryPartVertex, &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                 pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; bTrue))&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 bRetVal = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                 vertexHit = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Secondly check if a boundary was hit &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 检边界是否被击中&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pHitTest.HitTest(pPoint, tolerance,  esriGeometryHitPartType.esriGeometryPartBoundary,&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                 pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; bTrue))&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                 bRetVal = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;                 vertexHit = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Calculate offset to vertexIndex for multipatch geometries &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (partIndex &amp;gt; &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;                 IGeometryCollection pGeomColn = (IGeometryCollection)pGeom;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;                 vertexOffset = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; (&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; i = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;; i &amp;lt; partIndex; i++)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;                     IPointCollection pPointColn = (IPointCollection)pGeomColn.get_Geometry(i);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;                     vertexOffset = vertexOffset + pPointColn.PointCount;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;53&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;54&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; bRetVal;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;55&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;4.向图层中更新新的地图对象，并使之处于选中状态&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 向图层中更新新的地图对象，并使之处于选中状态&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pFeature&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pGeometry&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; UpdateFeature(IFeature pFeature, IGeometry pGeometry)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Make sure we are actually editing this layer. If not give a warning. &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             IDataset pDataset = (IDataset)pFeature.Class;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             IWorkspaceEdit pWorkspaceEdit = (IWorkspaceEdit)pDataset.Workspace;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!pWorkspaceEdit.IsBeingEdited())&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;                 System.Windows.Forms.MessageBox.Show(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;This feature is in a layer not in edit mode. \nEdit cannot be made.Start edit and try again.&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;,&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                     &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Error&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; If all tests succeed allow feature edits to be saved &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             pWorkspaceEdit.StartEditOperation();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             pFeature.Shape = pGeometry;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             pFeature.Store();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             pWorkspaceEdit.StopEditOperation();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;5.屏幕坐标转换为地图坐标&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 屏幕坐标转换为地图坐标&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pActiveView&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;地图&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;pixelUnits&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;地图坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; ConvertPixelsToMapUnits(IActiveView pActiveView, &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; pixelUnits)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Uses the ratio of the size of the map in pixels to map units to do the conversion &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             IPoint p1 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperLeft;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             IPoint p2 = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.UpperRight;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x1, x2, y1, y2;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p1, &lt;span style=&quot;color: #0000ff;&quot;&gt;out&lt;/span&gt; x1, &lt;span style=&quot;color: #0000ff;&quot;&gt;out&lt;/span&gt; y1);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             pActiveView.ScreenDisplay.DisplayTransformation.FromMapPoint(p2, &lt;span style=&quot;color: #0000ff;&quot;&gt;out&lt;/span&gt; x2, &lt;span style=&quot;color: #0000ff;&quot;&gt;out&lt;/span&gt; y2);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; pixelExtent = x2 - x1;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; realWorldDisplayExtent = pActiveView.ScreenDisplay.DisplayTransformation.VisibleBounds.Width;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; sizeOfOnePixel = realWorldDisplayExtent / pixelExtent;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; pixelUnits * sizeOfOnePixel;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;6.处理地图控件上的目标按下事件&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; axMapControl1_OnMouseDown(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, IMapControlEvents2_OnMouseDownEvent e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;首先判断当前用户选择了何种任务，并去完成相应的任务；如果没有选择任何任务，&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;即cboTasks的选项为没有任务时，该事件处理程序用于放大、缩小地图，鼠标左键&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;用于放大，其他键用于缩小&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;             m_pMap.ClearSelection();&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;清除地图中已选的要素&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bSketching)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;新建要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 SketchMouseDown(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bSelecting)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;选择要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;                 SelectMouseDown(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bEditingFtr)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;编辑要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;                 EditFeature(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bMove)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;移动要素&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                 MoveFeatureMouseDown(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Zoom in/out depending on which button was pressed &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                 IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                 IEnvelope pEnvelope = pActiveView.Extent;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                 ESRI.ArcGIS.Geometry.Point pnt = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; ESRI.ArcGIS.Geometry.Point();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                 IPoint iPnt = pnt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                 iPnt.X = e.mapX;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                 iPnt.Y = e.mapY;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;                 pEnvelope.CenterAt(iPnt);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (e.button == &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;) &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; left button &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;                     &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;放大视图&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;                     pEnvelope.Expand(&lt;span style=&quot;color: #800080;&quot;&gt;0.5&lt;/span&gt;, &lt;span style=&quot;color: #800080;&quot;&gt;0.5&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;                     &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;缩小视图&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;                     pEnvelope.Expand(&lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;                 pActiveView.Extent = pEnvelope;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;                 pActiveView.Refresh();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;             } &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;7.处理地图控件上的鼠标移动事件&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; axMapControl1_OnMouseMove(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, IMapControlEvents2_OnMouseMoveEvent e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bSketching)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;新建要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;                 SketchMouseMove(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bEditingFtr)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;编辑要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 FtrEditMouseMove(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bMove)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;移动要素任务处理&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;                 MoveFeatureMouseMove(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;8.处理地图控件上的鼠标按下事件&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; axMapControl1_OnMouseUp(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, IMapControlEvents2_OnMouseUpEvent e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bEditingFtr)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;结束编辑任务&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;                 EndFtrEdit(e.x, e.y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_bMove)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;                 &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;结束移动要素任务&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 MoveFeatureEnd();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;9.新建对象方法：&lt;span style=&quot;color: #008000;&quot;&gt;当前图层为点图层时，每调用一次就新点一个点对象&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;当前图层为线图层或面图层时，第一次调用开始新建对象，并添加当前点，&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以后每调用一次，即向新对象中添加一个点,调用NewFeatureEnd方法完成对象创建 。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 新建对象方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 当前图层为点图层时，每调用一次就新点一个点对象&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 当前图层为线图层或面图层时，第一次调用开始新建对象，并添加当前点，&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 以后每调用一次，即向新对象中添加一个点,调用NewFeatureEnd方法完成对象创建&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 在Map.MouseDown事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SketchMouseDown(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Starts a new sketch or adds a point to an existing one, of a type &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; determined by the current layer selected in the layers combo. &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Can only sketch on GeoFeature layers &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pCurrentLayer == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; ((IGeoFeatureLayer)m_pCurrentLayer == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the mouse down point in map coordinates &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;             IFeatureLayer pFeatureLayer = (IFeatureLayer)m_pCurrentLayer;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pFeatureLayer.FeatureClass == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; if (this is a fresh sketch) create an appropriate feedback object, &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; otherwise extent the existing feedback &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果是新开始创建的对象，则相应的创建一个新的Feedback对象；&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 否则，向已存在的Feedback对象中加点&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!m_bInUse)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;                 m_pMap.ClearSelection();  &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;清除地图选中对象&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (pFeatureLayer.FeatureClass.ShapeType)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt;                         CreateFeature(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryMultipoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;                         m_bInUse = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; NewMultiPointFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;                         INewMultiPointFeedback pMPFeed = (INewMultiPointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;                         m_pPointCollection = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; Multipoint();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt;                         pMPFeed.Start(m_pPointCollection, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;53&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolyline:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;54&lt;/span&gt;                         m_bInUse = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;55&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; NewLineFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;56&lt;/span&gt;                         INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;57&lt;/span&gt;                         pLineFeed.Start(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;58&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;59&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolygon:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;60&lt;/span&gt;                         m_bInUse = &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;61&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; NewPolygonFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;62&lt;/span&gt;                         INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;63&lt;/span&gt;                         pPolyFeed.Start(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;64&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;65&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;66&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback != &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;67&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;68&lt;/span&gt;                     m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;69&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;70&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;71&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;72&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;73&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewMultiPointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;74&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;75&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; Missing = Type.Missing;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;76&lt;/span&gt;                     m_pPointCollection.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;77&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;78&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewLineFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;79&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;80&lt;/span&gt;                     INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;81&lt;/span&gt;                     pLineFeed.AddPoint(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;82&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;83&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewPolygonFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;84&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;85&lt;/span&gt;                     INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;86&lt;/span&gt;                     pPolyFeed.AddPoint(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;87&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;88&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;89&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;10.新建对象过程中鼠标移动方法,产生Track效果&lt;span style=&quot;color: #008080;&quot;&gt;，&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;在Map.MouseMove事件中调用本方法&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 新建对象过程中鼠标移动方法,产生Track效果&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 在Map.MouseMove事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SketchMouseMove(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!m_bInUse || m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Move the feedback envelope and store the current mouse position &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             m_pFeedback.MoveTo(pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y));&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             m_pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;11.完成新建对象，取得绘制的对象，并添加到图层中 &lt;span style=&quot;color: #008080;&quot;&gt;：&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.DblClick或Map.MouseDown(Button = 2)事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 完成新建对象，取得绘制的对象，并添加到图层中&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.DblClick或Map.MouseDown(Button = 2)事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; EndSketch()&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             IGeometry pGeom = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             IPointCollection pPointCollection = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Create a new feature if possible &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewMultiPointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;                 INewMultiPointFeedback pMPFeed = (INewMultiPointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 pMPFeed.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 pGeom = (IGeometry)m_pPointCollection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewLineFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                 INewLineFeedback pLineFeed = (INewLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 pLineFeed.AddPoint(m_pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;                 IPolyline pPolyLine = pLineFeed.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                 pPointCollection = (IPointCollection)pPolyLine;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pPointCollection.PointCount &amp;lt; &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;                     MessageBox.Show(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;至少输入两个节点.&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;错误的线几何对象&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                     pGeom = (IGeometry)pPointCollection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; INewPolygonFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 INewPolygonFeedback pPolyFeed = (INewPolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                 pPolyFeed.AddPoint(m_pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                 IPolygon pPolygon = pPolyFeed.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pPolygon != &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                     pPointCollection = (IPointCollection)pPolygon;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pPointCollection.PointCount &amp;lt; &lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                     MessageBox.Show(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;至少输入三个节点.&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;错误的线几何对象&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, MessageBoxButtons.OK, MessageBoxIcon.Exclamation);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                     pGeom = (IGeometry)pPointCollection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;             CreateFeature(pGeom);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;             m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;             m_bInUse = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;12.查询当前图层中鼠标位置处的地图对象，&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseDown事件中调用本方法&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 查询当前图层中鼠标位置处的地图对象&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseDown事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SelectMouseDown(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Searches the map for features at the given point in the current layer &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; and selects them &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             m_pMap.ClearSelection();&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;清除地图中已选的要素&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pCurrentLayer == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; ((IGeoFeatureLayer)m_pCurrentLayer == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the feature layer and class of the current layer &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;             IFeatureLayer pFeatureLayer = (IFeatureLayer)m_pCurrentLayer;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;             IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pFeatureClass == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the mouse down position in map coordinates &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;             IGeometry pGeometry = pPoint;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Use a four pixel buffer around the cursor for feature search &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 设置查询缓冲区&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; length = ConvertPixelsToMapUnits(pActiveView, &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             ITopologicalOperator pTopo = (ITopologicalOperator)pGeometry;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;             IGeometry pBuffer = pTopo.Buffer(length);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;             pGeometry = (IGeometry)pBuffer.Envelope;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; up a Filter specific to this layer  &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;设置过滤器对象&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;             ISpatialFilter pSpatialFilter = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; SpatialFilter();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;             pSpatialFilter.Geometry = pGeometry;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (pFeatureClass.ShapeType)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;                     pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolyline:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;53&lt;/span&gt;                     pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelCrosses;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;54&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;55&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolygon:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;56&lt;/span&gt;                     pSpatialFilter.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;57&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;58&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;59&lt;/span&gt;             pSpatialFilter.GeometryField = pFeatureClass.ShapeFieldName;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;60&lt;/span&gt;             IQueryFilter pFilter = pSpatialFilter;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;61&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;62&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Do the search &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;63&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 查询&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;64&lt;/span&gt;             IFeatureCursor pCursor = pFeatureLayer.Search(pFilter, &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;65&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;66&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; and select the features on the map &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;67&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 在地图上高亮显示查询结果&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;68&lt;/span&gt;             IFeature pFeature = pCursor.NextFeature();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;69&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;while&lt;/span&gt; (pFeature != &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;70&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;71&lt;/span&gt;                 m_pMap.SelectFeature(m_pCurrentLayer, pFeature);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;72&lt;/span&gt;                 pFeature = pCursor.NextFeature();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;73&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;74&lt;/span&gt;             pActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeoSelection, &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;, &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;75&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;13.编辑当前图层中鼠标击中的地图对象(开始编辑),&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt; 如果为点对象，可进行位置移动，如果为线对象或面对象，可进行节点编辑&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;：&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseDown事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 编辑当前图层中鼠标击中的地图对象(开始编辑),&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果为点对象，可进行位置移动，如果为线对象或面对象，可进行节点编辑&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseDown事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  8&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;  9&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; EditFeature(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 10&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 11&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Searches for features under the coordinate provided and starts an edit &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 12&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; operation on the first one found. &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 13&lt;/span&gt;             IPoint pHitPoint = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 14&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; hitDist = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 15&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; partIndex = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 16&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; vertexIndex = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 17&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; vertexOffset = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 18&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; vertex = &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 19&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 20&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Use the first feature in the selection &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 21&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 取得鼠标击中的第一个对象&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 22&lt;/span&gt;             SelectMouseDown(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 23&lt;/span&gt;             IEnumFeature pSelected = (IEnumFeature)m_pMap.FeatureSelection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 24&lt;/span&gt;             IFeature pFeature = pSelected.Next();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 25&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pFeature == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 26&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 27&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 28&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 29&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 30&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 31&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 32&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 33&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Tolerance in pixels for line hits &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 34&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 节点空间查询容差&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 35&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;double&lt;/span&gt; tol = ConvertPixelsToMapUnits(pActiveView, &lt;span style=&quot;color: #800080;&quot;&gt;4&lt;/span&gt;);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 36&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 37&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; The feedback action / edit action depends on the geometry type &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 38&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; and the location of point within the geometry &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 39&lt;/span&gt;             IGeometry pGeom = pFeature.Shape;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 40&lt;/span&gt;             IObjectClass pObjectClass = pFeature.Class;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 41&lt;/span&gt;             m_pEditFeature = pFeature;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 42&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 43&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (pGeom.GeometryType)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 44&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 45&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 46&lt;/span&gt;                     m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; MovePointFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 47&lt;/span&gt;                     m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 48&lt;/span&gt;                     IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 49&lt;/span&gt;                     pPointMove.Start((IPoint)pGeom, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 50&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 51&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 52&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolyline:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 53&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (TestGeometryHit(tol, pPoint, pFeature, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist,&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 54&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertex))&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 55&lt;/span&gt;                     {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 56&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!vertex)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 57&lt;/span&gt;                         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 58&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the path, add a point to it and vertex edit that newly added point &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 59&lt;/span&gt;                             IGeometryCollection pGeomColn = (IGeometryCollection)pGeom;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 60&lt;/span&gt;                             IPath pPath = (IPath)pGeomColn.get_Geometry(partIndex);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 61&lt;/span&gt;                             IPointCollection pPointColn = (IPointCollection)pPath;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 62&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt; numVertices = pPointColn.PointCount;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 63&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 64&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; Missing = Type.Missing;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 65&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; val;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 66&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (vertexIndex == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 67&lt;/span&gt;                             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 68&lt;/span&gt;                                 val = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 69&lt;/span&gt;                                 pPointColn.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; val, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 70&lt;/span&gt;                             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 71&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 72&lt;/span&gt;                             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 73&lt;/span&gt;                                 val = vertexIndex;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 74&lt;/span&gt;                                 pPointColn.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; val);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 75&lt;/span&gt;                             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 76&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 77&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Reset the index pointer to the new index &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 78&lt;/span&gt;                             TestGeometryHit(tol, pPoint, pFeature, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertex);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 79&lt;/span&gt;                         }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 80&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; LineMovePointFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 81&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 82&lt;/span&gt;                         ILineMovePointFeedback pLineMove = (ILineMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 83&lt;/span&gt;                         pLineMove.Start((IPolyline)pGeom, vertexIndex, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 84&lt;/span&gt;                     }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 85&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 86&lt;/span&gt;                     {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 87&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 88&lt;/span&gt;                     }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 89&lt;/span&gt;                     &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 90&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 91&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 92&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolygon:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 93&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (TestGeometryHit(tol, pPoint, pFeature, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist,&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 94&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertex))&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 95&lt;/span&gt;                     {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 96&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (!vertex)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 97&lt;/span&gt;                         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 98&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Get the path, add a point to it and vertex edit that newly added point &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 99&lt;/span&gt;                             IGeometryCollection pGeomColn = (IGeometryCollection)pGeom;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;100&lt;/span&gt;                             IPath pPath = (IPath)pGeomColn.get_Geometry(partIndex);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;101&lt;/span&gt;                             IPointCollection pPointColn = (IPointCollection)pPath;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;102&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;long&lt;/span&gt; numVertices = pPointColn.PointCount;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;103&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;104&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Rethe index pointer to the new index &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;105&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; Missing = Type.Missing;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;106&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; val;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;107&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (vertexIndex == &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;108&lt;/span&gt;                             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;109&lt;/span&gt;                                 val = &lt;span style=&quot;color: #800080;&quot;&gt;1&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;110&lt;/span&gt;                                 pPointColn.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; val, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;111&lt;/span&gt;                             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;112&lt;/span&gt;                             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;113&lt;/span&gt;                             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;114&lt;/span&gt;                                 val = vertexIndex;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;115&lt;/span&gt;                                 pPointColn.AddPoint(pPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; Missing, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; val);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;116&lt;/span&gt;                             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;117&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;118&lt;/span&gt;                             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Reset the index pointer to the new index &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;119&lt;/span&gt;                             TestGeometryHit(tol, pPoint, pFeature, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; pHitPoint, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; hitDist, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; partIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexIndex, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertexOffset, &lt;span style=&quot;color: #0000ff;&quot;&gt;ref&lt;/span&gt; vertex);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;120&lt;/span&gt;                         }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;121&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; PolygonMovePointFeedback();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;122&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;123&lt;/span&gt;                         IPolygonMovePointFeedback pPolyMove = (IPolygonMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;124&lt;/span&gt;                         pPolyMove.Start((IPolygon)pGeom, vertexIndex + vertexOffset, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;125&lt;/span&gt;                     }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;126&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;127&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;128&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;129&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;130&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;131&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;132&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;14.编辑地图对象过程中的鼠标移动事件, &lt;span style=&quot;color: #008000;&quot;&gt;如果为点对象，进行位置移动；&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;如果为线对象或面对象，进行节点移动：&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseMove事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 编辑地图对象过程中的鼠标移动事件,&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果为点对象，进行位置移动&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果为线对象或面对象，进行节点移动&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseMove事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; FtrEditMouseMove(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Moves the edit feedback object along with the mouse. &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;             m_pFeedback.MoveTo(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;15.结束feature的编辑 &lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 结束feature的编辑&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; EndFtrEdit(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;             &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; Uses the feedback object&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;s geometry to rethe geometry on the feature &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; being edited. &lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; if (no feedback no edit &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IMovePointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                 IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                 IGeometry pGeometry = pPointMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;                 UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; ILineMovePointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                 ILineMovePointFeedback pLineMove = (ILineMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                 IGeometry pGeometry = pLineMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IPolygonMovePointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                 IPolygonMovePointFeedback pPolyMove = (IPolygonMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                 IGeometry pGeometry = pPolyMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                 UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;             pActiveView.Refresh();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;16.移动当前图层中鼠标击中地图对象的位置（开始移动）：&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseDown事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 移动当前图层中鼠标击中地图对象的位置（开始移动）&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseDown事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; MoveFeatureMouseDown(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt;                 m_pMap.ClearSelection();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 SelectMouseDown(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 IEnumFeature pSelected = (IEnumFeature)m_pMap.FeatureSelection;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;                 IFeature pFeature = pSelected.Next();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (pFeature == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;) &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                 IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                 IGeometry pGeom = pFeature.Shape;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                 m_pEditFeature = pFeature;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;switch&lt;/span&gt; (pGeom.GeometryType)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPoint:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; MovePointFeedbackClass();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                         IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt;                         pPointMove.Start((IPoint)pGeom, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolyline:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; MoveLineFeedbackClass();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;                         IMoveLineFeedback pLineMove = (IMoveLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                         pLineMove.Start((IPolyline)pGeom, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;                     &lt;span style=&quot;color: #0000ff;&quot;&gt;case&lt;/span&gt; esriGeometryType.esriGeometryPolygon:&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;41&lt;/span&gt;                         m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; MovePolygonFeedbackClass();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;42&lt;/span&gt;                         m_pFeedback.Display = pActiveView.ScreenDisplay;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;43&lt;/span&gt;                         IMovePolygonFeedback pPolyMove = (IMovePolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;44&lt;/span&gt;                         pPolyMove.Start((IPolygon)pGeom, pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;45&lt;/span&gt;                         &lt;span style=&quot;color: #0000ff;&quot;&gt;break&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;46&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;47&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;48&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;49&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;50&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;51&lt;/span&gt;                 Console.WriteLine(e.Message.ToString());&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;52&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;53&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;54&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;17.移动地图对象过程中的鼠标移动事件：&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseMove事件中调用本方法&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 移动地图对象过程中的鼠标移动事件&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseMove事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;x&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标X坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;y&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;鼠标Y坐标，屏幕坐标&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; MoveFeatureMouseMove(&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; x, &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; y)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;) &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;                 IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 IPoint pPoint = pActiveView.ScreenDisplay.DisplayTransformation.ToMapPoint(x, y);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                 m_pFeedback.MoveTo(pPoint);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                 Console.WriteLine(e.Message.ToString());&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;18.完成地图对象移动，取得移动后的对象，并将其更新到图层中：&lt;span style=&quot;color: #008000;&quot;&gt;建议在Map.MouseUp事件中调用本方法 &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 1&lt;/span&gt;         &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 2&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 完成地图对象移动，取得移动后的对象，并将其更新到图层中&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 3&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 建议在Map.MouseUp事件中调用本方法&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 4&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 5&lt;/span&gt;         &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; MoveFeatureEnd()&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 6&lt;/span&gt;         {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 7&lt;/span&gt;             IGeometry pGeometry;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 8&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt; 9&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;10&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;11&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback == &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;) &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;12&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;13&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IMovePointFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;14&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;15&lt;/span&gt;                     IMovePointFeedback pPointMove = (IMovePointFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;16&lt;/span&gt;                     pGeometry = pPointMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;17&lt;/span&gt;                     UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;18&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;19&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IMoveLineFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;20&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;21&lt;/span&gt;                     IMoveLineFeedback pLineMove = (IMoveLineFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;22&lt;/span&gt;                     pGeometry = pLineMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;23&lt;/span&gt;                     UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;24&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;25&lt;/span&gt;                 &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (m_pFeedback &lt;span style=&quot;color: #0000ff;&quot;&gt;is&lt;/span&gt; IMovePolygonFeedback)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;26&lt;/span&gt;                 {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;27&lt;/span&gt;                     IMovePolygonFeedback pPolyMove = (IMovePolygonFeedback)m_pFeedback;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;28&lt;/span&gt;                     pGeometry = pPolyMove.Stop();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;29&lt;/span&gt;                     UpdateFeature(m_pEditFeature, pGeometry);&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;30&lt;/span&gt;                 }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;31&lt;/span&gt; &lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;32&lt;/span&gt;                 m_pFeedback = &lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;33&lt;/span&gt;                 IActiveView pActiveView = (IActiveView)m_pMap;&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;34&lt;/span&gt;                 pActiveView.Refresh();&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;35&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;36&lt;/span&gt;             &lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt; (Exception e)&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;37&lt;/span&gt;             {&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;38&lt;/span&gt;                 Console.WriteLine(e.Message.ToString());&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;39&lt;/span&gt;             }&lt;br /&gt;&lt;span style=&quot;color: #008080;&quot;&gt;40&lt;/span&gt;         }&lt;/pre&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: left;&quot; align=&quot;center&quot;&gt;&lt;span&gt;总结：终于结束了，感觉通过可视化来编辑空间数据需要做太多的工作，上面把要做的工作几乎都秒到了，至于具体流程这个只需要简单组织一下逻辑就可以了。更强大的空间数据编辑功能有待于我们更加活跃的思维去创造！OK！今天就到这里了吧！情人节已过，各位coder们赶快回来编程吧！&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/brucewoo/aggbug/2352013.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/brucewoo/archive/2012/02/15/2352013.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 00:27:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/brucewoo/archive/2012/02/15/2352013.html</guid><dc:creator>蔷薇理想人生</dc:creator></item><item><title>程序员第二定律：量化管理在程序员身上永无可能</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/daoshi/archive/2012/02/15/2352009.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>理想流</name><uri>http://www.cnblogs.com/daoshi/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;恰如标题，第二定律表示为：在思维可以精确量化前，量化管理在程序员身上永无可能。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;这次估计会有争议，所以这里给出具体的逻辑链以及对应的分析。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;逻辑链：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;软件是一种固化的思维&amp;nbsp;&amp;rarr;思维的本质是概念和逻辑&amp;nbsp;&amp;rarr;&amp;nbsp;概念和逻辑无法直接度量和精确度量&amp;nbsp;&amp;rarr;&amp;nbsp;度量过程中需要很多的主观判断&amp;nbsp;&amp;rarr;&amp;nbsp;以目标为导向的，个人中心的量化管理（相关的激励和惩罚）将崩溃&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;具体分析：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;公平公正是管理的基石，为达成这一目的很多人会想到量化管理，但量化管理的基石却往往被忽略。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;对人进行量化管理的基石是：量化后的数字主要受个人表现这一个因素的影响，否则将产生巨大的不公正，并对个人工作意愿产生不良影响，是真正的事与愿违。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;好比说，不同的工人在同等条件下生产杯子，一个人一小时生产5个，一个人1小时生产6个，那显然后者要好于前者。这时，5和6可以用来比较的前提是两个人的生产条件相同，比如生产工艺等。在这种情况下，量化后的数字为个人表现的函数，因此量化管理基本上是公正的。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;这时可以进一步来考虑下面的情形：两个人同时生产杯子，厂方安排一个人用工艺a，另一个人用工艺b，这个时候前者一小时生产5个，后者1小时生产6个。这个时候单纯比较5和6事实上是不公平的，因为这1个杯子的差距可能是工艺造成的。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;大多时候，软件的情况比后一个情形还要糟糕一些。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;在软件开发中，往往既没有办法清楚的界定一个人的输入，也没办法清楚的界定一个人的输出。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;软件开发的输入是需求，但同一个需求不需要做多次，所以对需求自身的复杂程度眼下来看还只能依赖判断，而不能精确度量。&lt;/p&gt;
&lt;p&gt;软件开发的输出是代码，而代码自身属于固化后的思维。在度量思维时，多少、大小、长短、厚薄这类惯常的度量方向，并不具有多大意义。就好比说，不能讲一个人代码写的越多贡献就越大一样。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;诚然思维的表现形式则是可以度量的，我们可以通过页数来度量一本书的厚薄，通过分钟来度量一部电影的长短，通过代码行来度量软件，但这种度量所反映的内涵是有限度的，精度也是有限度的。最终结果很可能是人员之间的差距是由误差或其他非主观因素造成的，而不是由个人工作好坏所造成的。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;总结来看，在软件开发中，数字含义的模糊性会导致使用数字进行评价包含非常多的不公正，这种不公正会对工作意愿构成致命伤害。所以个人层面的量化管理在软件开发面前，必然崩溃。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;补充说明：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为避免矫枉过正，最后需要强调的是：并不是说项目管理中不需要收集数据，只是说在软件这个行业中，各种数据的精度天生是有限的，因此必须用在允许有限精度的工作上（估算、任务安排等），而不能用在对人进行评价、对项目进行评价这样需要高精度数据的工作上。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这条定律的推论可以无限多，影响到管理，流程乃至估算，这里就不列了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;关联文章：&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;程序员第一定律：关于技能和收入&quot; href=&quot;http://www.cnblogs.com/daoshi/archive/2012/02/13/2348557.html&quot;&gt;程序员第一定律：关于技能和收入&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/daoshi/aggbug/2352009.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/daoshi/archive/2012/02/15/2352009.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>恰如标题，第二定律表示为：在思维可以精确量化前，量化管理在程序员身上永无可能。这次估计会有争议，所以这里给出具体的逻辑链以及对应的分析。逻辑链：软件是一种固化的思维→思维的本质是概念和逻辑→概念和逻辑无法直接度量和精确度量→度量过程中需要很多的主观判断→以目标为导向的，个人中心的量化管理（相关的激励和惩罚）将崩溃具体分析：公平公正是管理的基石，为达成这一目的很多人会想到量化管理，但量化管理的基石却往往被忽略。对人进行量化管理的基石是：量化后的数字主要受个人表现这一个因素的影响，否则将产生巨大的不公正，并对个人工作意愿产生不良影响，是真正的事与愿违。好比说，不同的工人在同等条件下生产杯子，一个人</description><content:encoded>&lt;p&gt;恰如标题，第二定律表示为：在思维可以精确量化前，量化管理在程序员身上永无可能。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;这次估计会有争议，所以这里给出具体的逻辑链以及对应的分析。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;逻辑链：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;软件是一种固化的思维&amp;nbsp;&amp;rarr;思维的本质是概念和逻辑&amp;nbsp;&amp;rarr;&amp;nbsp;概念和逻辑无法直接度量和精确度量&amp;nbsp;&amp;rarr;&amp;nbsp;度量过程中需要很多的主观判断&amp;nbsp;&amp;rarr;&amp;nbsp;以目标为导向的，个人中心的量化管理（相关的激励和惩罚）将崩溃&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;具体分析：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;公平公正是管理的基石，为达成这一目的很多人会想到量化管理，但量化管理的基石却往往被忽略。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;对人进行量化管理的基石是：量化后的数字主要受个人表现这一个因素的影响，否则将产生巨大的不公正，并对个人工作意愿产生不良影响，是真正的事与愿违。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;好比说，不同的工人在同等条件下生产杯子，一个人一小时生产5个，一个人1小时生产6个，那显然后者要好于前者。这时，5和6可以用来比较的前提是两个人的生产条件相同，比如生产工艺等。在这种情况下，量化后的数字为个人表现的函数，因此量化管理基本上是公正的。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;这时可以进一步来考虑下面的情形：两个人同时生产杯子，厂方安排一个人用工艺a，另一个人用工艺b，这个时候前者一小时生产5个，后者1小时生产6个。这个时候单纯比较5和6事实上是不公平的，因为这1个杯子的差距可能是工艺造成的。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;大多时候，软件的情况比后一个情形还要糟糕一些。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;在软件开发中，往往既没有办法清楚的界定一个人的输入，也没办法清楚的界定一个人的输出。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;软件开发的输入是需求，但同一个需求不需要做多次，所以对需求自身的复杂程度眼下来看还只能依赖判断，而不能精确度量。&lt;/p&gt;
&lt;p&gt;软件开发的输出是代码，而代码自身属于固化后的思维。在度量思维时，多少、大小、长短、厚薄这类惯常的度量方向，并不具有多大意义。就好比说，不能讲一个人代码写的越多贡献就越大一样。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;诚然思维的表现形式则是可以度量的，我们可以通过页数来度量一本书的厚薄，通过分钟来度量一部电影的长短，通过代码行来度量软件，但这种度量所反映的内涵是有限度的，精度也是有限度的。最终结果很可能是人员之间的差距是由误差或其他非主观因素造成的，而不是由个人工作好坏所造成的。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;总结来看，在软件开发中，数字含义的模糊性会导致使用数字进行评价包含非常多的不公正，这种不公正会对工作意愿构成致命伤害。所以个人层面的量化管理在软件开发面前，必然崩溃。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;补充说明：&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为避免矫枉过正，最后需要强调的是：并不是说项目管理中不需要收集数据，只是说在软件这个行业中，各种数据的精度天生是有限的，因此必须用在允许有限精度的工作上（估算、任务安排等），而不能用在对人进行评价、对项目进行评价这样需要高精度数据的工作上。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这条定律的推论可以无限多，影响到管理，流程乃至估算，这里就不列了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;关联文章：&lt;/p&gt;
&lt;p&gt;&lt;a title=&quot;程序员第一定律：关于技能和收入&quot; href=&quot;http://www.cnblogs.com/daoshi/archive/2012/02/13/2348557.html&quot;&gt;程序员第一定律：关于技能和收入&lt;/a&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/daoshi/aggbug/2352009.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/daoshi/archive/2012/02/15/2352009.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 00:21:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/daoshi/archive/2012/02/15/2352009.html</guid><dc:creator>理想流</dc:creator></item><item><title>[Nhibernate] Inverse</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/Gavinzhao/archive/2012/02/15/2194711.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>子 夜.</name><uri>http://www.cnblogs.com/Gavinzhao/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;什么是inverse?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;通过inverse的设置来决定是由哪端来维护对象之间的关系的&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;双向many-to-one&lt;/p&gt;
&lt;p&gt;Employee.hbm.xml&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #ff00ff;&quot;&gt;xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;utf-8&quot;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;hibernate-mapping&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;urn:nhibernate-mapping-2.2&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;namespace&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;ZiyeNhi.Entities&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;assembly&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;ZiyeNhi.Entities&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employee&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;table&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Emp&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;id&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EmpId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EmpId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;int&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;generator&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;identity&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;generator&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;property&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EmpName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EmpName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;length&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;50&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;property&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;proxy&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;hibernate-mapping&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Department.hbm.xml&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #ff00ff;&quot;&gt;xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;utf-8&quot;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;hibernate-mapping&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;urn:nhibernate-mapping-2.2&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;namespace&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;ZiyeNhi.Entities&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;assembly&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;ZiyeNhi.Entities&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;table&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Dep&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;id&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;int&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;generator&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;identity&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;generator&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;property&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;length&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;50&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;property&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;one-to-many&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;set&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employees&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;table&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Emp&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;inverse&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;cascade&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;key&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;one-to-many&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employee&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;hibernate-mapping&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div&gt;一般来说我们都习惯 &lt;/div&gt;&lt;p&gt;one端(department) inverse=&quot;true&quot;;（对应上面的department.hbm.xml） &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;many端(Employee) inverse=&quot;false&quot;;(对应上面的employee.hbm.xml)&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;这样我们就可以用department属性来维护二者的关系&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;测试结果&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;


&lt;div&gt;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse0.jpg&quot; height=&quot;197&quot; width=&quot;1034&quot; /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;生成了3条insert语句一条是插入department,另外两条是插入Employee的 &lt;span style=&quot;color: red;&quot;&gt;他们二者的关系是由&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Employee对象的department属性来维护的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;为什么我们一般都要这么做呢&lt;/p&gt;&lt;p&gt;第一：如果我们通过Department.Employee.add(emp对象) 这种关系来维护的话，那么当前部门下有N个employee lazy=&amp;#8220;true&amp;#8221;的时候 是不是很浪费资源？&lt;br /&gt;&lt;/p&gt;&lt;p&gt;第二：数据模型中 一般情况下 对象关系都是由子表体现出来（看department表中 只有DepId,DepName,而在employee表中可以看到外键depId).那么我们在对象模型中也推荐子对象来维护关系.&lt;/p&gt;&lt;p&gt;第三：期待补充.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Inverse属性在many-to-one中的应用&lt;/p&gt;&lt;p&gt;1.经测试。如果两端都设置为inverse=&quot;true&quot;那么两端都不会维护关系&lt;/p&gt;&lt;p&gt;2.两端都为inverse=&quot;false&quot;的情况下&lt;/p&gt;&lt;p&gt;3.one端为false,many端为true&lt;/p&gt;&lt;p&gt;4.one端为true,many端为false&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;围绕2 3 4 来说&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #008000;&quot;&gt;两端都为false&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为A组合&amp;nbsp;Employee对象来维护关系&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为B组合&amp;nbsp;Department对象来维护关系&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;department.Employees.Add(emp1);&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;department.Employees.Add(emp2);&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&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;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试结果&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse1.jpg&quot; height=&quot;201&quot; width=&quot;1034&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: red;&quot;&gt;代码中维持关系的是employee对象 或者说是employee对象下的Department属性&lt;/span&gt;&lt;/p&gt;&lt;p&gt;生成了3条语句 （3条insert 先插入department 然后通过插入department返回的ID 来插入2条employee） &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;将A组合切换B组合 &lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为A组合&amp;nbsp;Employee对象来维护关系&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为B组合&amp;nbsp;Department对象来维护关系&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;department.Employees.Add(emp1);&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;department.Employees.Add(emp2);&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;测试结果&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse2.jpg&quot; height=&quot;240&quot; width=&quot;1035&quot; /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;代码中维持关系的是Department对象 或者说是Department对象下的Employee属性&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;生成了5条语句 (三条insert语句 然后在把后来插入的两条insertEmp给update) [暂且不考虑效率]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;上面2个测试的例子说明 两端都为false的情况下 随意一端来维持关系都是可以的。&lt;/p&gt;&lt;p&gt;但是用department对象来关联要生成5条语句效率不敢恭维，而且department.employees.add 在lazy=&quot;true&quot;的时候也很吓人（上面有提到过）&lt;/p&gt;&lt;p&gt;结论1：尽量不要用department对象 也就是带有集合属性的一端去维持关系。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;one端为false,many端为true&lt;/span&gt;&lt;/div&gt;&lt;p&gt;one端&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;set&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employees&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;table&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Emp&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;inverse&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;key&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;one-to-many&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employee&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;many端&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;proxy&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;大家知道many端默认为inverse=&quot;false&quot;，怎么才能模拟出inverse=&quot;true&quot;.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;insert&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;update&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;proxy&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;many-to-one/&amp;gt;和&amp;lt;one-to-one/&amp;gt;没有inverse属性，可以用insert和update属性模拟出inverse=&quot;true&quot;，&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;加上insert=&quot;false&quot; ，update=&quot;false&quot; 两个默认都为true。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;这样就模拟出了inverse=&quot;true&quot;了&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: red;&quot;&gt;就是说 many端 不参与 关系维护，而one端参与关系维护 &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;测试代码利用A组合&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为A组合&amp;nbsp;Employee对象来维护关系&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为B组合&amp;nbsp;Department对象来维护关系&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;department.Employees.Add(emp1);&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;department.Employees.Add(emp2);&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试结果&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse5.jpg&quot; height=&quot;222&quot; width=&quot;1034&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;细心的同学会发现 这里的2 3条insert语句它们的Department外键并没有插入&lt;br /&gt;&lt;/p&gt;&lt;p&gt;说明他们的关系没有维护成功。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在来A组合换成B组合&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&amp;nbsp;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为A组合&amp;nbsp;Employee对象来维护关系&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为B组合&amp;nbsp;Department对象来维护关系&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;department.Employees.Add(emp1);&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;department.Employees.Add(emp2);&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试结果&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse6.jpg&quot; height=&quot;247&quot; width=&quot;1035&quot; /&gt; 同样生成了5条SQL 与上面两端为 false的B组测试情况一样&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;也就验证了 上面的话&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;就是说 many（Employee）端 不参与 关系维护，而one（Department）端参与关系维护 &lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;one端为true,many端为false&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这个不用测了吧？跟开篇的例子一样的。如果有兴趣的同学们可以自己测试一下另一种情况。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;到底在哪端设置inverse呢？&lt;/p&gt;&lt;p&gt;大部分我们都在没有集合的那一端设置inverse=&quot;false&quot;，如果用集合那端来维持关系。比如department.employees.add(上面提到过 lazy=&quot;true&quot;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;怎么去记这个东西。其实我也被这个东西困扰了20多个小时了。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;总结一下：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;nbsp;第一种从&amp;#8220;对象&amp;#8221;的角度去记&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当前xml文件里的class是employee对象,设置当前employee对象里的department属性inverse=&quot;false&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么当前employee就要参与关系维护&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么我们save的时候&amp;nbsp;就需要用Employee对象去维护关系&amp;nbsp;所有就有了&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&quot;xr&quot;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&quot;QQ&quot;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emp1.Department&amp;nbsp;=&amp;nbsp;department;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;employee的对象emp1来维护关系.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.Save(department);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.Save(emp1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;第二种从&amp;#8220;属性&amp;#8221;的角度去记&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inverse=&quot;false&quot;&amp;nbsp;这个是在Employee对象里Department的属性中标示的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么Department属性就要参与关系维护&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么我们save的时候就需要用employee对象的Department属性去维护关系&amp;nbsp;所有就有以下代码&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&quot;xr&quot;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&quot;QQ&quot;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emp1.Department&amp;nbsp;=&amp;nbsp;department;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;employee的对象emp1中的department属性维护关系.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.Save(department);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.Save(emp1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PS:综上两点所述：如果在employee的配置文件里设置Department属性为false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么要么就是employee对象去维护，要么就是employee对象下的Department属性去维护。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;第三种也是从第二种延伸的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inverse=&quot;false&quot;&amp;nbsp;字面理解就是&quot;镜像&quot;为false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么这个对象就是真实的对象.那么我们设置它的属性是有效的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;维护关系的时候就设置department属性即可&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emp1.Department&amp;nbsp;=&amp;nbsp;department;&amp;nbsp;这里就设置了department属性&amp;nbsp;因为这个属性是没有镜像&amp;nbsp;那么他就是真实的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PS:因为当前employee&amp;nbsp;也就是many端的inverse=&quot;false&quot;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么department就是one端的inverse=&quot;true&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;用第三种来理解就是department端里的employee属性是有镜像的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;镜像是什么意思呢？&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;department&amp;nbsp;下面有N个Employee对象（这里的employee对象是真实的）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果设置inverse=&quot;true&quot;那么这个employee对象就不是真实的了&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;就是没用的.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么就不能用department.employee&amp;nbsp;来维护关系（当前employee对象是镜像）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那就得用department属性来维护关系了&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;对于双向one-to-many或者many-to-one&lt;br /&gt;inverse=&quot;true&quot;被指定于集合端（one-to-many/many-to-many），很少被指定于引用端（many-to-one/one-to-one/any）(默认为inverse=&quot;false&quot;)。&lt;/div&gt;&lt;p&gt;如果集合端为&amp;lt;list&amp;gt;或&amp;lt;map&amp;gt;，并且子表中的index或key字段没有被作为普通属性映射，则必须让集合有效而在引用端使用inverse，其余一切情况，均强烈建议在集合上使用inverse&lt;br /&gt;&lt;br /&gt;对于两端都是集合的双向many-to-many&lt;br /&gt;有一端的集合可以任意地使用&amp;lt;set&amp;gt;, &amp;lt;bag&amp;gt;, &amp;lt;idbag&amp;gt;, &amp;lt;list&amp;gt;, &amp;lt;map&amp;gt;元素，而另外一段的集合则只能使用&amp;lt;set&amp;gt;或&amp;lt;bag&amp;gt;&lt;br /&gt;如果有一段是&amp;lt;idbag&amp;gt;, &amp;lt;list&amp;gt;或&amp;lt;map&amp;gt;，则inverse属性必须加载另外一端的&amp;lt;set&amp;gt;或&amp;lt;bag&amp;gt;上&lt;br /&gt;如果两端都为&amp;lt;set&amp;gt;或&amp;lt;bag&amp;gt;，则任意。但出于优化目的，尽量加在概率上长度比较大的集合端上&lt;/p&gt;&lt;p&gt;（比如，一个用户的角色可能只有几种，但是一种角色可能被授予很多用户，请在Role对象的Users集合上添加inverse=&quot;true&quot;）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;全文完。希望看完的同学能够掌握inverse这个怪物. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/Gavinzhao/aggbug/2194711.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/Gavinzhao/archive/2012/02/15/2194711.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>什么是inverse?通过inverse的设置来决定是由哪端来维护对象之间的关系的双向many-to-oneEmployee.hbm.xml&amp;lt;?xmlversion=&amp;quot;1.0&amp;quot;encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;lt;hibernate-mappingxmlns=&amp;quot;urn:nhibernate-mapping-2.2&amp;quot;namespace=&amp;quot;ZiyeNhi.Entities&amp;quot;assembly=&amp;quot;ZiyeNhi.Entities&amp;quot;&amp;gt;&amp;lt;classname=&amp;quot;Empl</description><content:encoded>&lt;p&gt;什么是inverse?&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;通过inverse的设置来决定是由哪端来维护对象之间的关系的&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;双向many-to-one&lt;/p&gt;
&lt;p&gt;Employee.hbm.xml&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #ff00ff;&quot;&gt;xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;utf-8&quot;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;hibernate-mapping&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;urn:nhibernate-mapping-2.2&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;namespace&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;ZiyeNhi.Entities&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;assembly&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;ZiyeNhi.Entities&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employee&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;table&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Emp&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;id&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EmpId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EmpId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;int&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;generator&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;identity&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;generator&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;property&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EmpName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;EmpName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;length&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;50&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;property&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;proxy&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;hibernate-mapping&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Department.hbm.xml&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;?&lt;/span&gt;&lt;span style=&quot;color: #ff00ff;&quot;&gt;xml&amp;nbsp;version=&quot;1.0&quot;&amp;nbsp;encoding=&quot;utf-8&quot;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;hibernate-mapping&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;xmlns&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;urn:nhibernate-mapping-2.2&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;namespace&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;ZiyeNhi.Entities&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;assembly&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;ZiyeNhi.Entities&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;class&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;table&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Dep&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;id&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;int&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;generator&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;identity&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;generator&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;property&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;string&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;length&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;50&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;property&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;one-to-many&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;set&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employees&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;table&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Emp&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;inverse&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;cascade&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;key&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;one-to-many&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employee&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;hibernate-mapping&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;div&gt;一般来说我们都习惯 &lt;/div&gt;&lt;p&gt;one端(department) inverse=&quot;true&quot;;（对应上面的department.hbm.xml） &lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;many端(Employee) inverse=&quot;false&quot;;(对应上面的employee.hbm.xml)&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;这样我们就可以用department属性来维护二者的关系&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;测试结果&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;


&lt;div&gt;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse0.jpg&quot; height=&quot;197&quot; width=&quot;1034&quot; /&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;生成了3条insert语句一条是插入department,另外两条是插入Employee的 &lt;span style=&quot;color: red;&quot;&gt;他们二者的关系是由&lt;/span&gt;&lt;span style=&quot;color: red;&quot;&gt;Employee对象的department属性来维护的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;为什么我们一般都要这么做呢&lt;/p&gt;&lt;p&gt;第一：如果我们通过Department.Employee.add(emp对象) 这种关系来维护的话，那么当前部门下有N个employee lazy=&amp;#8220;true&amp;#8221;的时候 是不是很浪费资源？&lt;br /&gt;&lt;/p&gt;&lt;p&gt;第二：数据模型中 一般情况下 对象关系都是由子表体现出来（看department表中 只有DepId,DepName,而在employee表中可以看到外键depId).那么我们在对象模型中也推荐子对象来维护关系.&lt;/p&gt;&lt;p&gt;第三：期待补充.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Inverse属性在many-to-one中的应用&lt;/p&gt;&lt;p&gt;1.经测试。如果两端都设置为inverse=&quot;true&quot;那么两端都不会维护关系&lt;/p&gt;&lt;p&gt;2.两端都为inverse=&quot;false&quot;的情况下&lt;/p&gt;&lt;p&gt;3.one端为false,many端为true&lt;/p&gt;&lt;p&gt;4.one端为true,many端为false&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;围绕2 3 4 来说&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #008000;&quot;&gt;两端都为false&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为A组合&amp;nbsp;Employee对象来维护关系&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为B组合&amp;nbsp;Department对象来维护关系&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;department.Employees.Add(emp1);&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;department.Employees.Add(emp2);&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&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;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试结果&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse1.jpg&quot; height=&quot;201&quot; width=&quot;1034&quot; /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: red;&quot;&gt;代码中维持关系的是employee对象 或者说是employee对象下的Department属性&lt;/span&gt;&lt;/p&gt;&lt;p&gt;生成了3条语句 （3条insert 先插入department 然后通过插入department返回的ID 来插入2条employee） &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;将A组合切换B组合 &lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为A组合&amp;nbsp;Employee对象来维护关系&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为B组合&amp;nbsp;Department对象来维护关系&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;department.Employees.Add(emp1);&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;department.Employees.Add(emp2);&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;测试结果&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse2.jpg&quot; height=&quot;240&quot; width=&quot;1035&quot; /&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;代码中维持关系的是Department对象 或者说是Department对象下的Employee属性&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;生成了5条语句 (三条insert语句 然后在把后来插入的两条insertEmp给update) [暂且不考虑效率]&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;上面2个测试的例子说明 两端都为false的情况下 随意一端来维持关系都是可以的。&lt;/p&gt;&lt;p&gt;但是用department对象来关联要生成5条语句效率不敢恭维，而且department.employees.add 在lazy=&quot;true&quot;的时候也很吓人（上面有提到过）&lt;/p&gt;&lt;p&gt;结论1：尽量不要用department对象 也就是带有集合属性的一端去维持关系。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;one端为false,many端为true&lt;/span&gt;&lt;/div&gt;&lt;p&gt;one端&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;set&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employees&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;table&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Emp&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;inverse&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;true&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;key&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;key&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;one-to-many&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Employee&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;many端&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;proxy&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;大家知道many端默认为inverse=&quot;false&quot;，怎么才能模拟出inverse=&quot;true&quot;.&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;name&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;class&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;Department&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;column&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;DepId&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;insert&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;update&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;false&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;nbsp;lazy&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;proxy&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;many-to-one&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;many-to-one/&amp;gt;和&amp;lt;one-to-one/&amp;gt;没有inverse属性，可以用insert和update属性模拟出inverse=&quot;true&quot;，&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;加上insert=&quot;false&quot; ，update=&quot;false&quot; 两个默认都为true。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;这样就模拟出了inverse=&quot;true&quot;了&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: red;&quot;&gt;就是说 many端 不参与 关系维护，而one端参与关系维护 &lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;测试代码利用A组合&lt;br /&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为A组合&amp;nbsp;Employee对象来维护关系&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为B组合&amp;nbsp;Department对象来维护关系&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;department.Employees.Add(emp1);&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;department.Employees.Add(emp2);&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试结果&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse5.jpg&quot; height=&quot;222&quot; width=&quot;1034&quot; /&gt;&lt;/div&gt;&lt;br /&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;细心的同学会发现 这里的2 3条insert语句它们的Department外键并没有插入&lt;br /&gt;&lt;/p&gt;&lt;p&gt;说明他们的关系没有维护成功。&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;在来A组合换成B组合&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&amp;nbsp;[Test]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt;&amp;nbsp;SaveDepartment()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt;&amp;nbsp;(ISession&amp;nbsp;session&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.sessionFactory.OpenSession())&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;{&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;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;xr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp2&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;wxr&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt;&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;QQ&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为A组合&amp;nbsp;Employee对象来维护关系&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;emp1.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;emp2.Department&amp;nbsp;=&amp;nbsp;department;&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;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;以下两句为B组合&amp;nbsp;Department对象来维护关系&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&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;department.Employees.Add(emp1);&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;department.Employees.Add(emp2);&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;ITransaction&amp;nbsp;transaction&amp;nbsp;=&amp;nbsp;session.BeginTransaction();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;try&lt;/span&gt;&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;{&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;session.Save(department);&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;session.Save(emp1);&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;session.Save(emp2);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;transaction.Commit();&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;color: #0000ff;&quot;&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;ex)&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;{&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;transaction.Rollback();&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;&lt;span style=&quot;color: #0000ff;&quot;&gt;throw&lt;/span&gt;&amp;nbsp;ex;&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;}&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试结果&lt;/p&gt;&lt;p&gt;&lt;img alt=&quot;&quot; src=&quot;http://images.cnblogs.com/cnblogs_com/gavinzhao/Inverse6.jpg&quot; height=&quot;247&quot; width=&quot;1035&quot; /&gt; 同样生成了5条SQL 与上面两端为 false的B组测试情况一样&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;也就验证了 上面的话&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: red;&quot;&gt;就是说 many（Employee）端 不参与 关系维护，而one（Department）端参与关系维护 &lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;one端为true,many端为false&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这个不用测了吧？跟开篇的例子一样的。如果有兴趣的同学们可以自己测试一下另一种情况。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;到底在哪端设置inverse呢？&lt;/p&gt;&lt;p&gt;大部分我们都在没有集合的那一端设置inverse=&quot;false&quot;，如果用集合那端来维持关系。比如department.employees.add(上面提到过 lazy=&quot;true&quot;)&lt;br /&gt;&lt;/p&gt;&lt;p&gt;怎么去记这个东西。其实我也被这个东西困扰了20多个小时了。 &lt;br /&gt;&lt;/p&gt;&lt;p&gt;总结一下：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;lt;!--&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;nbsp;第一种从&amp;#8220;对象&amp;#8221;的角度去记&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;当前xml文件里的class是employee对象,设置当前employee对象里的department属性inverse=&quot;false&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么当前employee就要参与关系维护&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么我们save的时候&amp;nbsp;就需要用Employee对象去维护关系&amp;nbsp;所有就有了&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&quot;xr&quot;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&quot;QQ&quot;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emp1.Department&amp;nbsp;=&amp;nbsp;department;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;employee的对象emp1来维护关系.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.Save(department);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.Save(emp1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;第二种从&amp;#8220;属性&amp;#8221;的角度去记&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inverse=&quot;false&quot;&amp;nbsp;这个是在Employee对象里Department的属性中标示的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么Department属性就要参与关系维护&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么我们save的时候就需要用employee对象的Department属性去维护关系&amp;nbsp;所有就有以下代码&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;emp1&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Employee()&amp;nbsp;{&amp;nbsp;EmpName&amp;nbsp;=&amp;nbsp;&quot;xr&quot;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;var&amp;nbsp;department&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Department()&amp;nbsp;{&amp;nbsp;DepName&amp;nbsp;=&amp;nbsp;&quot;QQ&quot;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emp1.Department&amp;nbsp;=&amp;nbsp;department;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;-&amp;gt;employee的对象emp1中的department属性维护关系.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;....&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.Save(department);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;session.Save(emp1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PS:综上两点所述：如果在employee的配置文件里设置Department属性为false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么要么就是employee对象去维护，要么就是employee对象下的Department属性去维护。&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;第三种也是从第二种延伸的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;inverse=&quot;false&quot;&amp;nbsp;字面理解就是&quot;镜像&quot;为false&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么这个对象就是真实的对象.那么我们设置它的属性是有效的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;维护关系的时候就设置department属性即可&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;emp1.Department&amp;nbsp;=&amp;nbsp;department;&amp;nbsp;这里就设置了department属性&amp;nbsp;因为这个属性是没有镜像&amp;nbsp;那么他就是真实的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PS:因为当前employee&amp;nbsp;也就是many端的inverse=&quot;false&quot;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么department就是one端的inverse=&quot;true&quot;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;用第三种来理解就是department端里的employee属性是有镜像的&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;镜像是什么意思呢？&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;department&amp;nbsp;下面有N个Employee对象（这里的employee对象是真实的）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;如果设置inverse=&quot;true&quot;那么这个employee对象就不是真实的了&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;就是没用的.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么就不能用department.employee&amp;nbsp;来维护关系（当前employee对象是镜像）&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;那就得用department属性来维护关系了&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div&gt;对于双向one-to-many或者many-to-one&lt;br /&gt;inverse=&quot;true&quot;被指定于集合端（one-to-many/many-to-many），很少被指定于引用端（many-to-one/one-to-one/any）(默认为inverse=&quot;false&quot;)。&lt;/div&gt;&lt;p&gt;如果集合端为&amp;lt;list&amp;gt;或&amp;lt;map&amp;gt;，并且子表中的index或key字段没有被作为普通属性映射，则必须让集合有效而在引用端使用inverse，其余一切情况，均强烈建议在集合上使用inverse&lt;br /&gt;&lt;br /&gt;对于两端都是集合的双向many-to-many&lt;br /&gt;有一端的集合可以任意地使用&amp;lt;set&amp;gt;, &amp;lt;bag&amp;gt;, &amp;lt;idbag&amp;gt;, &amp;lt;list&amp;gt;, &amp;lt;map&amp;gt;元素，而另外一段的集合则只能使用&amp;lt;set&amp;gt;或&amp;lt;bag&amp;gt;&lt;br /&gt;如果有一段是&amp;lt;idbag&amp;gt;, &amp;lt;list&amp;gt;或&amp;lt;map&amp;gt;，则inverse属性必须加载另外一端的&amp;lt;set&amp;gt;或&amp;lt;bag&amp;gt;上&lt;br /&gt;如果两端都为&amp;lt;set&amp;gt;或&amp;lt;bag&amp;gt;，则任意。但出于优化目的，尽量加在概率上长度比较大的集合端上&lt;/p&gt;&lt;p&gt;（比如，一个用户的角色可能只有几种，但是一种角色可能被授予很多用户，请在Role对象的Users集合上添加inverse=&quot;true&quot;）&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;全文完。希望看完的同学能够掌握inverse这个怪物. &lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;&amp;nbsp;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/Gavinzhao/aggbug/2194711.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/Gavinzhao/archive/2012/02/15/2194711.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 00:18:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/Gavinzhao/archive/2012/02/15/2194711.html</guid><dc:creator>子 夜.</dc:creator></item><item><title>【翻译】从头开始编写一个Orchard网上商店模块(1) - 介绍</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352003.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>瑞雪年</name><uri>http://www.cnblogs.com/zhongzf/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;原文地址：&lt;a href=&quot;http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1&quot;&gt;http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;介绍&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;在这个系列博客中，我们将共同经历从头开始构建一个Orchard模块的过程！&lt;br /&gt;虽然Orchard是一个了不起CMS（内容管理系统），有着强大的功能和令人振奋的架构，可以无限的扩展，但它可能需要花费一定时间，以充分了解它的架构，并能够定制您自己的主题的各个方面或甚至创造整个模块来集成Orchard所有的可扩展性点。&lt;br /&gt;&lt;br /&gt;我希望，你将受益于我前进的道路上所获得的知识，你会看到Orchard及其架构之美。它不仅只是在简单或高级的网站和博客方面表现很出色，同时它也是一个非常基础的平台，用于创建各种基于Web的应用，如电子商务后端,&amp;nbsp; CRM的投票系统，项目管理，社区网站，学习管理系统等等。基本上你打算从头创建的任何应用都应考虑使用Orchard创建。Orchard实际上是一个可扩展的框架，它不仅仅&amp;ldquo;只是&amp;rdquo;一个CMS。你可以通过插件方式做任何常规ASP.NET MVC应用可以做的事，同时Orchard还拥有一套丰富的功能和兼容概念，你可以获得额外的好处。&lt;br /&gt;&lt;br /&gt;本播客系列主要面向刚刚接触Orchard的ASP.NET MVC开发人员，在开始深入这前，如果您还没有阅读过下面文章，我强烈建议您先阅读以下文章：&lt;br /&gt;&lt;a href=&quot;http://docs.orchardproject.net/Documentation/How-Orchard-works&quot;&gt;http://docs.orchardproject.net/Documentation/How-Orchard-works&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/hh708754.aspx&quot;&gt;http://msdn.microsoft.com/en-us/magazine/hh708754.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;网上商店功能&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们的网上商店模块将启用以下功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理员将能够将任意ContentType(内容类型)通过附加到ProductPart上，从而把它变成产品。&lt;/li&gt;
&lt;li&gt;网站访客（顾客）将能够把产品添加到购物篮，通过网站注册，并成为注册用户。&lt;/li&gt;
&lt;li&gt;用户将能够进行结算和通过在线支付服务提供商（PSP）支付（在我们的演示，我们将使用Ogone模拟PSP）选定的产品。&lt;/li&gt;
&lt;li&gt;在客户被重定向到PSP之前，系统将创建一个Order(订单)记录，及其OrderDetail (订单明细)记录。&lt;/li&gt;
&lt;li&gt;在客户支付订单后，我们需要处理的产品交付。在实物产品的情况下，我们可能要通知一些航运伙伴。在虚拟产品的情况下，我们可能要产生类似于票据，或其他近似的产品。为了这种灵活性，我们将实现某种接口IShippingProvider，我们将创建两个简单的实现：一个是发送电子邮件通知托运人，另一个会产生票据。&lt;/li&gt;
&lt;li&gt;管理后台，使管理员能够管理客户以及订单。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;（注意: 关于嵌入截图, 出现一些截图太小，你只需拖动图片到您的浏览器的地址栏中，查看其原始大小的图片。）&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;好吧，就让我们开始创建Orchard Webshop Module(网店模块)！&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a href=&quot;http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352003.html&quot;&gt;第1部分 - 简介（本篇）&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352010.html&quot;&gt;第2部分&amp;nbsp;- 配置您的Orchard开发环境&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352015.html&quot;&gt;第3部分 - 创建Orchard.Webshop模块项目&lt;/a&gt;&lt;br /&gt;第4部分 - 创建ProductPart&lt;br /&gt;第5部分 - 创建和渲染ProductCatalog的内容类型&lt;br /&gt;第6部分 - 创建购物车服务和控制器&lt;br /&gt;第7部分 - 渲染ShoppingCart和ShoppingCartWidget&lt;br /&gt;第8部分 - 注册新客户与网站&lt;br /&gt;第9部分 - 创建订单和与PSP通信&lt;br /&gt;第10部分 - 客户和订单管理后端&lt;br /&gt;第11部分&amp;nbsp;- 在内容列表中定制产品和类别的：DisplayTypes&lt;br /&gt;第12部分 - 与ERP系统集成&lt;br /&gt;第13部分 - 处理运费和税费&lt;br /&gt;第14部分 - 实施付款方式：Google Checkout&lt;br /&gt;第15部分 - 实施付款方式：PayPal&lt;br /&gt;&lt;br /&gt;点击&lt;a href=&quot;http://demos.skywalkersoftwaredevelopment.net/Orchard-Webshop-Demo&quot;&gt;这里&lt;/a&gt;查看演示！&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/zhongzf/aggbug/2352003.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352003.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>原文地址：http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1介绍在这个系列博客中，我们将共同经历从头开始构建一个Orchard模块的过程！虽然Orchard是一个了不起CMS（内容管理系统），有着强大的功能和令人振奋的架构，可以无限的扩展，但它可能需要花费一定时间，以充分了解它的架构，并能够定制您自己的主题的各个方面或甚至创造整个模块来集成Orchard所有的可扩展性点。我希望，你将受益于我前进的道路上所获得的知识，你会看到Orchard及其架构之美</description><content:encoded>&lt;p&gt;原文地址：&lt;a href=&quot;http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1&quot;&gt;http://skywalkersoftwaredevelopment.net/blog/writing-an-orchard-webshop-module-from-scratch-part-1&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 16px;&quot;&gt;介绍&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;在这个系列博客中，我们将共同经历从头开始构建一个Orchard模块的过程！&lt;br /&gt;虽然Orchard是一个了不起CMS（内容管理系统），有着强大的功能和令人振奋的架构，可以无限的扩展，但它可能需要花费一定时间，以充分了解它的架构，并能够定制您自己的主题的各个方面或甚至创造整个模块来集成Orchard所有的可扩展性点。&lt;br /&gt;&lt;br /&gt;我希望，你将受益于我前进的道路上所获得的知识，你会看到Orchard及其架构之美。它不仅只是在简单或高级的网站和博客方面表现很出色，同时它也是一个非常基础的平台，用于创建各种基于Web的应用，如电子商务后端,&amp;nbsp; CRM的投票系统，项目管理，社区网站，学习管理系统等等。基本上你打算从头创建的任何应用都应考虑使用Orchard创建。Orchard实际上是一个可扩展的框架，它不仅仅&amp;ldquo;只是&amp;rdquo;一个CMS。你可以通过插件方式做任何常规ASP.NET MVC应用可以做的事，同时Orchard还拥有一套丰富的功能和兼容概念，你可以获得额外的好处。&lt;br /&gt;&lt;br /&gt;本播客系列主要面向刚刚接触Orchard的ASP.NET MVC开发人员，在开始深入这前，如果您还没有阅读过下面文章，我强烈建议您先阅读以下文章：&lt;br /&gt;&lt;a href=&quot;http://docs.orchardproject.net/Documentation/How-Orchard-works&quot;&gt;http://docs.orchardproject.net/Documentation/How-Orchard-works&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/magazine/hh708754.aspx&quot;&gt;http://msdn.microsoft.com/en-us/magazine/hh708754.aspx&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;font-size: 15px;&quot;&gt;网上商店功能&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我们的网上商店模块将启用以下功能：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;管理员将能够将任意ContentType(内容类型)通过附加到ProductPart上，从而把它变成产品。&lt;/li&gt;
&lt;li&gt;网站访客（顾客）将能够把产品添加到购物篮，通过网站注册，并成为注册用户。&lt;/li&gt;
&lt;li&gt;用户将能够进行结算和通过在线支付服务提供商（PSP）支付（在我们的演示，我们将使用Ogone模拟PSP）选定的产品。&lt;/li&gt;
&lt;li&gt;在客户被重定向到PSP之前，系统将创建一个Order(订单)记录，及其OrderDetail (订单明细)记录。&lt;/li&gt;
&lt;li&gt;在客户支付订单后，我们需要处理的产品交付。在实物产品的情况下，我们可能要通知一些航运伙伴。在虚拟产品的情况下，我们可能要产生类似于票据，或其他近似的产品。为了这种灵活性，我们将实现某种接口IShippingProvider，我们将创建两个简单的实现：一个是发送电子邮件通知托运人，另一个会产生票据。&lt;/li&gt;
&lt;li&gt;管理后台，使管理员能够管理客户以及订单。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;（注意: 关于嵌入截图, 出现一些截图太小，你只需拖动图片到您的浏览器的地址栏中，查看其原始大小的图片。）&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;好吧，就让我们开始创建Orchard Webshop Module(网店模块)！&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;a href=&quot;http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352003.html&quot;&gt;第1部分 - 简介（本篇）&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352010.html&quot;&gt;第2部分&amp;nbsp;- 配置您的Orchard开发环境&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352015.html&quot;&gt;第3部分 - 创建Orchard.Webshop模块项目&lt;/a&gt;&lt;br /&gt;第4部分 - 创建ProductPart&lt;br /&gt;第5部分 - 创建和渲染ProductCatalog的内容类型&lt;br /&gt;第6部分 - 创建购物车服务和控制器&lt;br /&gt;第7部分 - 渲染ShoppingCart和ShoppingCartWidget&lt;br /&gt;第8部分 - 注册新客户与网站&lt;br /&gt;第9部分 - 创建订单和与PSP通信&lt;br /&gt;第10部分 - 客户和订单管理后端&lt;br /&gt;第11部分&amp;nbsp;- 在内容列表中定制产品和类别的：DisplayTypes&lt;br /&gt;第12部分 - 与ERP系统集成&lt;br /&gt;第13部分 - 处理运费和税费&lt;br /&gt;第14部分 - 实施付款方式：Google Checkout&lt;br /&gt;第15部分 - 实施付款方式：PayPal&lt;br /&gt;&lt;br /&gt;点击&lt;a href=&quot;http://demos.skywalkersoftwaredevelopment.net/Orchard-Webshop-Demo&quot;&gt;这里&lt;/a&gt;查看演示！&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/zhongzf/aggbug/2352003.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352003.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 00:17:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/zhongzf/archive/2012/02/15/2352003.html</guid><dc:creator>瑞雪年</dc:creator></item><item><title>Ubuntu下 FileZilla安装历险记</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/bylikai/archive/2012/02/15/2351999.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>怕虫的瞌睡虫</name><uri>http://www.cnblogs.com/bylikai/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;以前在学校的时候经常使用FileZilla 下载资源，觉得挺好的；但是工作以后再也没有用过；最近需要做了一些网页想上传到网站中，于是下载了FileZilla_3.5.3_src.tar.bz2 源码，然后进行编译：提示没有wxWidgets 所以又接着下载 wxWidgets ,&amp;nbsp; 于是从 http://www.wxwidgets.org/&amp;nbsp; 下载了最新版 wxWidgets-2.9.3.tar.bz2&amp;nbsp; ，解压安装， 安装完成之后；再来编译FileZilla.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;不料又提示： configure: error: idna.h not found which is part of GNU libidn.&lt;/p&gt;
&lt;p&gt;晕菜了............&lt;/p&gt;
&lt;p&gt;只能打开 configure 看看这个Shell脚本：其中有这么一段：&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;# Libidn checks
  # -------------

  ac_fn_c_check_header_mongrel &quot;$LINENO&quot; &quot;idna.h&quot; &quot;ac_cv_header_idna_h&quot; &quot;$ac_includes_default&quot;
if test &quot;x$ac_cv_header_idna_h&quot; = xyes; then :

else

    as_fn_error $? &quot;idna.h not found which is part of GNU libidn.&quot; &quot;$LINENO&quot; 5

fi&lt;/pre&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;checking &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; wxWidgets version &amp;gt;= &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;12&lt;/span&gt; (--unicode=yes --universal=no)... yes (version &lt;span style=&quot;color: #800080;&quot;&gt;2.9&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;checking &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; wxWidgets &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; library... no&lt;br /&gt;configure: error: You need to use wxWidgets &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.x to compile &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt; program.&lt;/pre&gt;
&lt;/div&gt;
&lt;pre &gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;这提示 Libidn 库没有安装，那么安装吧：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;sudo apt-&lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt; install  libidn*&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;想想这下应该OK了吧》&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;始料未及的是 提示&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;checking &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; wxWidgets version &amp;gt;= &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;12&lt;/span&gt; (--unicode=yes --universal=no)... yes (version &lt;span style=&quot;color: #800080;&quot;&gt;2.9&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;checking &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; wxWidgets &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; library... no&lt;br /&gt;configure: error: You need to use wxWidgets &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.x to compile &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt; program.&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;我晕，我的版本可是 2.9.3耶， 远高于2.8.x ;&amp;nbsp; 那只能修改 Shell脚本了 ： configure&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$wx_config_major_version&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; -gt &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; || test &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$wx_config_minor_version&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; -gt &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    as_fn_error $? &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;You need to use wxWidgets 2.8.x to compile this program.&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LINENO&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  fi&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;原来版本还不能高于2.8&amp;nbsp; 将 8 改成9； 然后将以下2.8 全部改成 2.9.*就 OK了。&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LIBGNUTLS_CFLAGS&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    pkg_cv_LIBGNUTLS_CFLAGS=&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LIBGNUTLS_CFLAGS&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;br /&gt; elif test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$PKG_CONFIG&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$PKG_CONFIG&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &amp;amp;&amp;amp; \&lt;br /&gt;    { { $as_echo &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \&quot;gnutls &amp;gt;= 2.8.3\&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; } &amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  ($PKG_CONFIG --exists --print-errors &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;gnutls &amp;gt;= 2.8.3&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;) &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;&amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  ac_status=$?&lt;br /&gt;  $as_echo &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$as_me:${as_lineno-$LINENO}: \$? = $ac_status&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  test $ac_status = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;; }; then&lt;br /&gt;  pkg_cv_LIBGNUTLS_CFLAGS=`$PKG_CONFIG --cflags &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;gnutls &amp;gt;= 2.8.3&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;&amp;gt;/dev/&lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;`&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;  pkg_failed=yes&lt;br /&gt;fi&lt;br /&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;    pkg_failed=untried&lt;br /&gt;fi&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LIBGNUTLS_LIBS&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    pkg_cv_LIBGNUTLS_LIBS=&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LIBGNUTLS_LIBS&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;br /&gt; elif test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$PKG_CONFIG&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$PKG_CONFIG&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &amp;amp;&amp;amp; \&lt;br /&gt;    { { $as_echo &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \&quot;gnutls &amp;gt;= 2.8.3\&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; } &amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  ($PKG_CONFIG --exists --print-errors &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;gnutls &amp;gt;= 2.8.3&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;) &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;&amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  ac_status=$?&lt;br /&gt;  $as_echo &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$as_me:${as_lineno-$LINENO}: \$? = $ac_status&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  test $ac_status = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;; }; then&lt;br /&gt;  pkg_cv_LIBGNUTLS_LIBS=`$PKG_CONFIG --libs &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;gnutls &amp;gt;= 2.8.3&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;&amp;gt;/dev/&lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;`&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;  pkg_failed=yes&lt;br /&gt;fi&lt;br /&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;    pkg_failed=untried&lt;br /&gt;fi&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;总结： 在安装一个软件之前一定要看相关文档： INSTALL， README 等；里面会提供软件依赖情况，如FileZilla 的 INSTALL&amp;nbsp; 的 &amp;nbsp;Requirements：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #800080;&quot;&gt;8&lt;/span&gt; FileZilla depends on the following libraries:&lt;br /&gt;  &lt;span style=&quot;color: #800080;&quot;&gt;9&lt;/span&gt; - wxWidgets &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;12&lt;/span&gt; or greater&lt;br /&gt; &lt;span style=&quot;color: #800080;&quot;&gt;10&lt;/span&gt; - libidn&lt;br /&gt; &lt;span style=&quot;color: #800080;&quot;&gt;11&lt;/span&gt; - GnuTLS &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt; or greater&lt;br /&gt; &lt;span style=&quot;color: #800080;&quot;&gt;12&lt;/span&gt; - libdbus on *nix&lt;br /&gt; &lt;span style=&quot;color: #800080;&quot;&gt;13&lt;/span&gt; - sqlite3 &lt;span style=&quot;color: #800080;&quot;&gt;3.7&lt;/span&gt; or greater&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;在编译或使用的过程中得查看 configure 文件。如果还是搞不定，那就GOOGLE吧。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/bylikai/aggbug/2351999.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/bylikai/archive/2012/02/15/2351999.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>以前在学校的时候经常使用FileZilla 下载资源，觉得挺好的；但是工作以后再也没有用过；最近需要做了一些网页想上传到网站中，于是下载了FileZilla_3.5.3_src.tar.bz2 源码，然后进行编译：提示没有wxWidgets 所以又接着下载 wxWidgets , 于是从 http://www.wxwidgets.org/ 下载了最新版 wxWidgets-2.9.3.tar.bz2 ，解压安装， 安装完成之后；再来编译FileZilla.不料又提示： configure: error: idna.h not found which is part of GNU libidn.</description><content:encoded>&lt;p&gt;以前在学校的时候经常使用FileZilla 下载资源，觉得挺好的；但是工作以后再也没有用过；最近需要做了一些网页想上传到网站中，于是下载了FileZilla_3.5.3_src.tar.bz2 源码，然后进行编译：提示没有wxWidgets 所以又接着下载 wxWidgets ,&amp;nbsp; 于是从 http://www.wxwidgets.org/&amp;nbsp; 下载了最新版 wxWidgets-2.9.3.tar.bz2&amp;nbsp; ，解压安装， 安装完成之后；再来编译FileZilla.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;不料又提示： configure: error: idna.h not found which is part of GNU libidn.&lt;/p&gt;
&lt;p&gt;晕菜了............&lt;/p&gt;
&lt;p&gt;只能打开 configure 看看这个Shell脚本：其中有这么一段：&lt;/p&gt;
&lt;div &gt;
&lt;pre &gt;# Libidn checks
  # -------------

  ac_fn_c_check_header_mongrel &quot;$LINENO&quot; &quot;idna.h&quot; &quot;ac_cv_header_idna_h&quot; &quot;$ac_includes_default&quot;
if test &quot;x$ac_cv_header_idna_h&quot; = xyes; then :

else

    as_fn_error $? &quot;idna.h not found which is part of GNU libidn.&quot; &quot;$LINENO&quot; 5

fi&lt;/pre&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;checking &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; wxWidgets version &amp;gt;= &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;12&lt;/span&gt; (--unicode=yes --universal=no)... yes (version &lt;span style=&quot;color: #800080;&quot;&gt;2.9&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;checking &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; wxWidgets &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; library... no&lt;br /&gt;configure: error: You need to use wxWidgets &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.x to compile &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt; program.&lt;/pre&gt;
&lt;/div&gt;
&lt;pre &gt;&lt;br /&gt;
&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;这提示 Libidn 库没有安装，那么安装吧：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;sudo apt-&lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt; install  libidn*&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;想想这下应该OK了吧》&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;始料未及的是 提示&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;checking &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; wxWidgets version &amp;gt;= &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;12&lt;/span&gt; (--unicode=yes --universal=no)... yes (version &lt;span style=&quot;color: #800080;&quot;&gt;2.9&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt;)&lt;br /&gt;checking &lt;span style=&quot;color: #0000ff;&quot;&gt;for&lt;/span&gt; wxWidgets &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; library... no&lt;br /&gt;configure: error: You need to use wxWidgets &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.x to compile &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt; program.&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;我晕，我的版本可是 2.9.3耶， 远高于2.8.x ;&amp;nbsp; 那只能修改 Shell脚本了 ： configure&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$wx_config_major_version&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; -gt &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; || test &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$wx_config_minor_version&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; -gt &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;8&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    as_fn_error $? &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;You need to use wxWidgets 2.8.x to compile this program.&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LINENO&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  fi&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;原来版本还不能高于2.8&amp;nbsp; 将 8 改成9； 然后将以下2.8 全部改成 2.9.*就 OK了。&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LIBGNUTLS_CFLAGS&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    pkg_cv_LIBGNUTLS_CFLAGS=&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LIBGNUTLS_CFLAGS&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;br /&gt; elif test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$PKG_CONFIG&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$PKG_CONFIG&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &amp;amp;&amp;amp; \&lt;br /&gt;    { { $as_echo &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \&quot;gnutls &amp;gt;= 2.8.3\&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; } &amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  ($PKG_CONFIG --exists --print-errors &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;gnutls &amp;gt;= 2.8.3&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;) &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;&amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  ac_status=$?&lt;br /&gt;  $as_echo &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$as_me:${as_lineno-$LINENO}: \$? = $ac_status&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  test $ac_status = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;; }; then&lt;br /&gt;  pkg_cv_LIBGNUTLS_CFLAGS=`$PKG_CONFIG --cflags &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;gnutls &amp;gt;= 2.8.3&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;&amp;gt;/dev/&lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;`&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;  pkg_failed=yes&lt;br /&gt;fi&lt;br /&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;    pkg_failed=untried&lt;br /&gt;fi&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LIBGNUTLS_LIBS&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    pkg_cv_LIBGNUTLS_LIBS=&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$LIBGNUTLS_LIBS&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;br /&gt; elif test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$PKG_CONFIG&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; then&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; test -n &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$PKG_CONFIG&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &amp;amp;&amp;amp; \&lt;br /&gt;    { { $as_echo &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \&quot;gnutls &amp;gt;= 2.8.3\&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;; } &amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  ($PKG_CONFIG --exists --print-errors &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;gnutls &amp;gt;= 2.8.3&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;) &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;&amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  ac_status=$?&lt;br /&gt;  $as_echo &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;$as_me:${as_lineno-$LINENO}: \$? = $ac_status&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &amp;gt;&amp;amp;&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;&lt;br /&gt;  test $ac_status = &lt;span style=&quot;color: #800080;&quot;&gt;0&lt;/span&gt;; }; then&lt;br /&gt;  pkg_cv_LIBGNUTLS_LIBS=`$PKG_CONFIG --libs &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;gnutls &amp;gt;= 2.8.3&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;color: #800080;&quot;&gt;2&lt;/span&gt;&amp;gt;/dev/&lt;span style=&quot;color: #0000ff;&quot;&gt;null&lt;/span&gt;`&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;  pkg_failed=yes&lt;br /&gt;fi&lt;br /&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;br /&gt;    pkg_failed=untried&lt;br /&gt;fi&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;总结： 在安装一个软件之前一定要看相关文档： INSTALL， README 等；里面会提供软件依赖情况，如FileZilla 的 INSTALL&amp;nbsp; 的 &amp;nbsp;Requirements：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #800080;&quot;&gt;8&lt;/span&gt; FileZilla depends on the following libraries:&lt;br /&gt;  &lt;span style=&quot;color: #800080;&quot;&gt;9&lt;/span&gt; - wxWidgets &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;12&lt;/span&gt; or greater&lt;br /&gt; &lt;span style=&quot;color: #800080;&quot;&gt;10&lt;/span&gt; - libidn&lt;br /&gt; &lt;span style=&quot;color: #800080;&quot;&gt;11&lt;/span&gt; - GnuTLS &lt;span style=&quot;color: #800080;&quot;&gt;2.8&lt;/span&gt;.&lt;span style=&quot;color: #800080;&quot;&gt;3&lt;/span&gt; or greater&lt;br /&gt; &lt;span style=&quot;color: #800080;&quot;&gt;12&lt;/span&gt; - libdbus on *nix&lt;br /&gt; &lt;span style=&quot;color: #800080;&quot;&gt;13&lt;/span&gt; - sqlite3 &lt;span style=&quot;color: #800080;&quot;&gt;3.7&lt;/span&gt; or greater&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;在编译或使用的过程中得查看 configure 文件。如果还是搞不定，那就GOOGLE吧。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/bylikai/aggbug/2351999.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/bylikai/archive/2012/02/15/2351999.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 00:09:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/bylikai/archive/2012/02/15/2351999.html</guid><dc:creator>怕虫的瞌睡虫</dc:creator></item><item><title>ASP.NET jQuery 食谱23 (jQuery AJAX实现调用页面后台方法和web服务定义的方法)</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/iamlixin/archive/2012/02/15/2352000.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>KenLee</name><uri>http://www.cnblogs.com/iamlixin/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;&lt;strong&gt;这节我们来看下如何实现AJAX调用页面后台方法和web服务定义的方法，下面通过验证用户的例子，先讲解如何调用页面后台方法，具体实现步骤如下：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.新建Recipe23.aspx页面。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;2.在该页面的后台文件Recipe23.aspx.cs中添加引用&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Web.Services;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;3.定义静态数组和初始化数据&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;[] userNameArrray;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Page_Load(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        userNameArrray = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;[&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;] { &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee01&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee02&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee03&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee04&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee05&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; };&lt;br /&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;4.定义验证用户名合法性的静态方法&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 验证用户是否合法&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; AJAX如果要直接调用该方法，需要添加[WebMethod()]，并定义为静态方法&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;sUserName&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;用户名&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;返回结果&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    [WebMethod()]&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; CheckUserName(&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; sUserName)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果用户存在，就验证合法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (userNameArrray.Contains(sUserName))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;5.在Recipe.aspx里面实现界面结构代码如下&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;form &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;form1&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; runat&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;asp:TextBox &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;txtUserName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; runat&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;asp:TextBox&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;asp:Button &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;btnCheck&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; runat&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; Text&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;验证用户&quot;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;6.在Recipe.aspx里面实现AJAX调用页面后台用户验证方法CheckUserName的脚本代码如下&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;script &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;text/javascript&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&lt;br /&gt;        $(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; () {&lt;br /&gt;            $(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;#btnCheck&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;).click(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; (e) {&lt;br /&gt;                e.preventDefault();&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 首先判断用户名是否为空，并给出提示&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; ($(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;#txtUserName&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;).val() &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;) {&lt;br /&gt;                    alert(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;请输入用户名！&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;);&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; {&lt;br /&gt;                    sendData($(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;#txtUserName&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;).val());&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 定义一个AJAX请求方法&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;            function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; sendData(sUserName) {&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 访问页面后台方法&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f5f5f5;&quot;&gt;                var loc = window.location.href;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5;&quot;&gt;&lt;br /&gt;                $.ajax({&lt;br /&gt;                    type: &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;POST&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    url: loc &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;/CheckUserName&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; sUserName要跟请求方法CheckUserName定义的参数名称要保持一致&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;                    //&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; json数据格式是由一对键值构成，如{&quot;name1&quot;:&quot;value1&quot;, &quot;name2&quot;:&quot;value2&quot;}&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;                    data: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;{ &quot;sUserName&quot;: &quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;'&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; sUserName &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;}&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 发送信息至服务器时内容编码类型&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;                    contentType: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;application/json; charset=utf-8&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    dataType: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    success: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; (msg) {&lt;br /&gt;                        &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; AJAX响应被包装到一个d对象里，如{&quot;d&quot;:true}, &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;                        //&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 因此需要用到msg.d来获取请求返回的布尔值&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;                        if&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; (msg.d) {&lt;br /&gt;                            alert(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;验证用户成功！&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;);&lt;br /&gt;                        }&lt;br /&gt;                        &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; {&lt;br /&gt;                            alert(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;验证用户失败！&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;);&lt;br /&gt;                        }&lt;br /&gt;                    },&lt;br /&gt;                    error: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; (xhr, textStatus, errorThrown) {&lt;br /&gt;                        alert(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;AJAX错误：&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; errorThrown);&lt;br /&gt;                    }&lt;br /&gt;                });&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;7.运行程序后显示页面如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423383392.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;8.输入用户名KenLee10:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423441739.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;9.输入用户名KenLee01:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423444235.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;10.还可以通过Firebug观察AJAX请求响应的数据，请求数据如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423473839.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;11.请求响应的JSON数据：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423485040.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423485976.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下面再来看下AJAX如何调用Web服务：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.创建Web服务用户验证的文件UserNameWS.asmx，必须添加[System.Web.Script.Services.ScriptService]，实现用户验证代码如下：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Web.Services;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;UserNameWS 的摘要说明&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;[WebService(Namespace = &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;http://tempuri.org/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;)]&lt;br /&gt;[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务，请取消对下行的注释。 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;[System.Web.Script.Services.ScriptService]&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; UserNameWS : System.Web.Services.WebService {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; UserNameWS () {&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;如果使用设计的组件，请取消注释以下行 &lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;InitializeComponent(); &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 验证用户是否合法&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; AJAX如果要直接调用该方法，需要添加[WebMethod()]，并定义为静态方法&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;sUserName&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;用户名&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;返回结果&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    [WebMethod]&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; CheckUserName(&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; sUserName)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;[] userNameArrray = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;[&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;] { &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee01&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee02&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee03&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee04&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee05&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; };&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果用户存在，就验证合法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (userNameArrray.Contains(sUserName))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;2.修改Recipe23.aspx的脚本代码sendData函数,只需修改loc访问地址：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 定义一个AJAX请求方法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; sendData(sUserName) {&lt;br /&gt;  &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 访问页面后台方法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; var loc = window.location.href;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 访问Web服务&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt; loc = &quot;UserNameWS.asmx&quot;;&lt;br /&gt;........&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;简单完成上面两步，就可以直接调用web服务里面定义的方法了。具体显示的效果图，和上面介绍的AJAX访问页面方法的效果图是一样的，这里就不用重复写了。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/iamlixin/aggbug/2352000.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/iamlixin/archive/2012/02/15/2352000.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>这节我们来看下如何实现AJAX调用页面后台方法和web服务定义的方法，下面通过验证用户的例子，先讲解如何调用页面后台方法，具体实现步骤如下：1.新建Recipe23.aspx页面。2.在该页面的后台文件Recipe23.aspx.cs中添加引用using System.Web.Services;3.定义静态数组和初始化数据 public static string[] userNameArrray; protected void Page_Load(object sender, EventArgs e) { userNameArrray = new string...</description><content:encoded>&lt;p&gt;&lt;strong&gt;这节我们来看下如何实现AJAX调用页面后台方法和web服务定义的方法，下面通过验证用户的例子，先讲解如何调用页面后台方法，具体实现步骤如下：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1.新建Recipe23.aspx页面。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;2.在该页面的后台文件Recipe23.aspx.cs中添加引用&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Web.Services;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;3.定义静态数组和初始化数据&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;[] userNameArrray;&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Page_Load(&lt;span style=&quot;color: #0000ff;&quot;&gt;object&lt;/span&gt; sender, EventArgs e)&lt;br /&gt;    {&lt;br /&gt;        userNameArrray = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;[&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;] { &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee01&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee02&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee03&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee04&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee05&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; };&lt;br /&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;4.定义验证用户名合法性的静态方法&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 验证用户是否合法&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; AJAX如果要直接调用该方法，需要添加[WebMethod()]，并定义为静态方法&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;sUserName&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;用户名&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;返回结果&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    [WebMethod()]&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; CheckUserName(&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; sUserName)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果用户存在，就验证合法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (userNameArrray.Contains(sUserName))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;5.在Recipe.aspx里面实现界面结构代码如下&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;form &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;form1&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; runat&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;asp:TextBox &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;txtUserName&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; runat&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;asp:TextBox&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;asp:Button &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;btnCheck&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; runat&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;server&quot;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt; Text&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;验证用户&quot;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;div&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;form&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;6.在Recipe.aspx里面实现AJAX调用页面后台用户验证方法CheckUserName的脚本代码如下&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;script &lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;=&quot;text/javascript&quot;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&lt;br /&gt;        $(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; () {&lt;br /&gt;            $(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;#btnCheck&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;).click(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; (e) {&lt;br /&gt;                e.preventDefault();&lt;br /&gt;&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 首先判断用户名是否为空，并给出提示&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;                if&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; ($(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;#txtUserName&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;).val() &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;) {&lt;br /&gt;                    alert(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;请输入用户名！&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;);&lt;br /&gt;                }&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; {&lt;br /&gt;                    sendData($(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;#txtUserName&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;).val());&lt;br /&gt;                }&lt;br /&gt;            });&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 定义一个AJAX请求方法&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;            function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; sendData(sUserName) {&lt;br /&gt;                &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 访问页面后台方法&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;background-color: #f5f5f5;&quot;&gt;                var loc = window.location.href;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5;&quot;&gt;&lt;br /&gt;                $.ajax({&lt;br /&gt;                    type: &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;POST&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    url: loc &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;/CheckUserName&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; sUserName要跟请求方法CheckUserName定义的参数名称要保持一致&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;                    //&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; json数据格式是由一对键值构成，如{&quot;name1&quot;:&quot;value1&quot;, &quot;name2&quot;:&quot;value2&quot;}&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;                    data: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;{ &quot;sUserName&quot;: &quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;'&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; sUserName &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;+&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;}&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;'&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 发送信息至服务器时内容编码类型&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;                    contentType: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;application/json; charset=utf-8&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    dataType: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;json&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;,&lt;br /&gt;                    success: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; (msg) {&lt;br /&gt;                        &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; AJAX响应被包装到一个d对象里，如{&quot;d&quot;:true}, &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;                        //&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt; 因此需要用到msg.d来获取请求返回的布尔值&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;                        if&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; (msg.d) {&lt;br /&gt;                            alert(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;验证用户成功！&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;);&lt;br /&gt;                        }&lt;br /&gt;                        &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; {&lt;br /&gt;                            alert(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;验证用户失败！&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;);&lt;br /&gt;                        }&lt;br /&gt;                    },&lt;br /&gt;                    error: &lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #0000ff;&quot;&gt;function&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; (xhr, textStatus, errorThrown) {&lt;br /&gt;                        alert(&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;AJAX错误：&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;&quot;&lt;/span&gt; &lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;background-color: #f5f5f5; color: #000000;&quot;&gt; errorThrown);&lt;br /&gt;                    }&lt;br /&gt;                });&lt;br /&gt;            }&lt;br /&gt;        });&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;7.运行程序后显示页面如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423383392.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;8.输入用户名KenLee10:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423441739.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;9.输入用户名KenLee01:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423444235.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;10.还可以通过Firebug观察AJAX请求响应的数据，请求数据如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423473839.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;11.请求响应的JSON数据：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423485040.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://pic002.cnblogs.com/images/2012/59199/2012021423485976.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;下面再来看下AJAX如何调用Web服务：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1.创建Web服务用户验证的文件UserNameWS.asmx，必须添加[System.Web.Script.Services.ScriptService]，实现用户验证代码如下：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Collections.Generic;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Linq;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;using&lt;/span&gt; System.Web.Services;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;UserNameWS 的摘要说明&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;[WebService(Namespace = &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;http://tempuri.org/&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;)]&lt;br /&gt;[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]&lt;br /&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务，请取消对下行的注释。 &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;[System.Web.Script.Services.ScriptService]&lt;br /&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; UserNameWS : System.Web.Services.WebService {&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; UserNameWS () {&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;如果使用设计的组件，请取消注释以下行 &lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;InitializeComponent(); &lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 验证用户是否合法&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;remarks&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; AJAX如果要直接调用该方法，需要添加[WebMethod()]，并定义为静态方法&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/remarks&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;param name=&quot;sUserName&quot;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;用户名&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;///&lt;/span&gt; &lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;返回结果&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #808080;&quot;&gt;&lt;br /&gt;&lt;/span&gt;    [WebMethod]&lt;br /&gt;    &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;bool&lt;/span&gt; CheckUserName(&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; sUserName)&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;[] userNameArrray = &lt;span style=&quot;color: #0000ff;&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt;[&lt;span style=&quot;color: #800080;&quot;&gt;5&lt;/span&gt;] { &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee01&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee02&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee03&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee04&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;, &lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;KenLee05&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt; };&lt;br /&gt;        &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 如果用户存在，就验证合法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; (userNameArrray.Contains(sUserName))&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;true&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;false&lt;/span&gt;;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;2.修改Recipe23.aspx的脚本代码sendData函数,只需修改loc访问地址：&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot;&gt;
&lt;pre&gt;&lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 定义一个AJAX请求方法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;function&lt;/span&gt; sendData(sUserName) {&lt;br /&gt;  &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 访问页面后台方法&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; var loc = window.location.href;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style=&quot;color: #008000;&quot;&gt;//&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; 访问Web服务&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&lt;br /&gt;&lt;/span&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;var&lt;/span&gt; loc = &quot;UserNameWS.asmx&quot;;&lt;br /&gt;........&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;简单完成上面两步，就可以直接调用web服务里面定义的方法了。具体显示的效果图，和上面介绍的AJAX访问页面方法的效果图是一样的，这里就不用重复写了。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/iamlixin/aggbug/2352000.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/iamlixin/archive/2012/02/15/2352000.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Wed, 15 Feb 2012 00:09:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/iamlixin/archive/2012/02/15/2352000.html</guid><dc:creator>KenLee</dc:creator></item><item><title>【面试】——不能搞混这些概念</title><id xmlns="http://www.w3.org/2005/Atom">http://www.cnblogs.com/laov/archive/2012/02/14/2351983.html</id><author xmlns="http://www.w3.org/2005/Atom"><name>weifield</name><uri>http://www.cnblogs.com/laov/</uri></author><content xmlns="http://www.w3.org/2005/Atom" type="html">&lt;p&gt;类、结构、构造函数、抽象类这么多的概念一点一点的加++&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;1、定义一个类&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('436c4426-e2e2-401d-b4fa-13db120886f3')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_436c4426-e2e2-401d-b4fa-13db120886f3&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; Person&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; _name;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; Name&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; _name; }&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt; { _name = value; }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; _age;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; Age&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; _age; }&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt; { _age = value; }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SayHi()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Hi~~~&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;①类前面和类内部，可以用修饰符private，public，internal，protected来修饰，限制方位域范围。如果类的成员不写访问修饰符则默认为private。如果类前面不写访问修饰符默认为internal。&lt;/p&gt;
&lt;p&gt;②类，内部可以定义属性，方法亦可设置虚方法，或将方法重载。&lt;/p&gt;
&lt;p&gt;③类，可以继承，但是是单继承。&lt;/p&gt;
&lt;p&gt;④类成员在使用前必须赋初值。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;2、接口&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('f238984d-d33c-4cee-a760-35a6dbaacffa')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_f238984d-d33c-4cee-a760-35a6dbaacffa&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;interface&lt;/span&gt; ICanFly&lt;br /&gt;{&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Fly();&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;①接口可以多继承，前面可以用public,internal,protected，来修饰，在不写任何修饰符的时候，默认为internal。当然你也可以写成private来修饰，但是这显然没有什么意义，其他程序集都不能访问。&lt;/p&gt;
&lt;p&gt;②接口内可以写方法，事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意：C#中不能包含任何静态成员。&lt;/p&gt;
&lt;p&gt;③接口内部设置的方法Fly，不能有实现；前面不能有修饰符。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;3、构造函数&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('2b98bb19-f9eb-44de-bca0-df6e7633688c')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_2b98bb19-f9eb-44de-bca0-df6e7633688c&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; Person(&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; name,&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; age,&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; gender)&lt;br /&gt;{&lt;br /&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.name=name;&lt;br /&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.age=age;&lt;br /&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.gender=gender;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;①方法名称和类名必须保持一致。&lt;/p&gt;
&lt;p&gt;②方法没有返回值。连void也不能有。方法的访问修饰符默认为public&lt;/p&gt;
&lt;p&gt;③构造函数也可以方法重载。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;4、结构&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('cf04608c-36ee-4f19-8f5e-19501b580cc0')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_cf04608c-36ee-4f19-8f5e-19501b580cc0&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; Person&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; _name;&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; Name1&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; _name; }&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt; { _name = value; }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SayHi()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Hello...&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/pre&gt;
&lt;/div&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;①class是引用类型，继承自system.object，而struct是值类型，继承自system.valuetype。不具有多态性。注意system.valuetype是引用类型。&lt;/p&gt;
&lt;p&gt;②class支持继承，而struct没有继承性。&lt;/p&gt;
&lt;p&gt;③数据量比较小，的时候使用结构&lt;/p&gt;
&lt;p&gt;④结构可以实现接口，但结构不能继承（可以通过反编译查看，int32类型，可以看到实现了很多接口）&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;5、抽象类&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('99b709f5-4f20-47c0-a54b-2db977d7314c')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_99b709f5-4f20-47c0-a54b-2db977d7314c&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; Person&lt;br /&gt;{&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; Name&lt;br /&gt;   {&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt;;&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; Age&lt;br /&gt;   {&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt;;&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; Email&lt;br /&gt;   {&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt;;&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; sbstract &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SayHi();&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;①抽象类不能实例化，类继承此抽象类必须实现方法。&lt;/p&gt;
&lt;p&gt;②当用抽象关键字标记方法有关键字，abstract标记方法的时候，方法不能有任何方法体&lt;/p&gt;
&lt;p&gt;③如果这个类中有一个成语为抽象的，则整个类也是抽象的。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/laov/aggbug/2351983.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/laov/archive/2012/02/14/2351983.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content><description>类、结构、构造函数、抽象类这么多的概念一点一点的加++1、定义一个类类 public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } private int _age; public int Age { get { return _age; } ...</description><content:encoded>&lt;p&gt;类、结构、构造函数、抽象类这么多的概念一点一点的加++&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;1、定义一个类&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('436c4426-e2e2-401d-b4fa-13db120886f3')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_436c4426-e2e2-401d-b4fa-13db120886f3&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; Person&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; _name;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; Name&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; _name; }&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt; { _name = value; }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; _age;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; Age&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; _age; }&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt; { _age = value; }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;virtual&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SayHi()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Hi~~~&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;①类前面和类内部，可以用修饰符private，public，internal，protected来修饰，限制方位域范围。如果类的成员不写访问修饰符则默认为private。如果类前面不写访问修饰符默认为internal。&lt;/p&gt;
&lt;p&gt;②类，内部可以定义属性，方法亦可设置虚方法，或将方法重载。&lt;/p&gt;
&lt;p&gt;③类，可以继承，但是是单继承。&lt;/p&gt;
&lt;p&gt;④类成员在使用前必须赋初值。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;2、接口&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('f238984d-d33c-4cee-a760-35a6dbaacffa')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_f238984d-d33c-4cee-a760-35a6dbaacffa&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;interface&lt;/span&gt; ICanFly&lt;br /&gt;{&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Fly();&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;①接口可以多继承，前面可以用public,internal,protected，来修饰，在不写任何修饰符的时候，默认为internal。当然你也可以写成private来修饰，但是这显然没有什么意义，其他程序集都不能访问。&lt;/p&gt;
&lt;p&gt;②接口内可以写方法，事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意：C#中不能包含任何静态成员。&lt;/p&gt;
&lt;p&gt;③接口内部设置的方法Fly，不能有实现；前面不能有修饰符。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;3、构造函数&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('2b98bb19-f9eb-44de-bca0-df6e7633688c')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_2b98bb19-f9eb-44de-bca0-df6e7633688c&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; Person(&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; name,&lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; age,&lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; gender)&lt;br /&gt;{&lt;br /&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.name=name;&lt;br /&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.age=age;&lt;br /&gt;  &lt;span style=&quot;color: #0000ff;&quot;&gt;this&lt;/span&gt;.gender=gender;&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;①方法名称和类名必须保持一致。&lt;/p&gt;
&lt;p&gt;②方法没有返回值。连void也不能有。方法的访问修饰符默认为public&lt;/p&gt;
&lt;p&gt;③构造函数也可以方法重载。&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;4、结构&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('cf04608c-36ee-4f19-8f5e-19501b580cc0')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_cf04608c-36ee-4f19-8f5e-19501b580cc0&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;struct&lt;/span&gt; Person&lt;br /&gt;    {&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; _name;&lt;br /&gt;&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; Name1&lt;br /&gt;        {&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt; { &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; _name; }&lt;br /&gt;            &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt; { _name = value; }&lt;br /&gt;        }&lt;br /&gt;        &lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SayHi()&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;Hello...&lt;/span&gt;&lt;span style=&quot;color: #800000;&quot;&gt;&quot;&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/pre&gt;
&lt;/div&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;①class是引用类型，继承自system.object，而struct是值类型，继承自system.valuetype。不具有多态性。注意system.valuetype是引用类型。&lt;/p&gt;
&lt;p&gt;②class支持继承，而struct没有继承性。&lt;/p&gt;
&lt;p&gt;③数据量比较小，的时候使用结构&lt;/p&gt;
&lt;p&gt;④结构可以实现接口，但结构不能继承（可以通过反编译查看，int32类型，可以看到实现了很多接口）&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;5、抽象类&lt;/p&gt;
&lt;div style=&quot;background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;&quot; onclick=&quot;cnblogs_code_show('99b709f5-4f20-47c0-a54b-2db977d7314c')&quot;&gt;
&lt;div id=&quot;cnblogs_code_open_99b709f5-4f20-47c0-a54b-2db977d7314c&quot; &gt;
&lt;pre&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;abstract&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; Person&lt;br /&gt;{&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; Name&lt;br /&gt;   {&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt;;&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;int&lt;/span&gt; Age&lt;br /&gt;   {&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt;;&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;string&lt;/span&gt; Email&lt;br /&gt;   {&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;get&lt;/span&gt;;&lt;br /&gt;      &lt;span style=&quot;color: #0000ff;&quot;&gt;set&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt; sbstract &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; SayHi();&lt;br /&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;①抽象类不能实例化，类继承此抽象类必须实现方法。&lt;/p&gt;
&lt;p&gt;②当用抽象关键字标记方法有关键字，abstract标记方法的时候，方法不能有任何方法体&lt;/p&gt;
&lt;p&gt;③如果这个类中有一个成语为抽象的，则整个类也是抽象的。&lt;/p&gt;&lt;img src=&quot;http://www.cnblogs.com/laov/aggbug/2351983.html?type=1&quot; width=&quot;1&quot; height=&quot;1&quot; alt=&quot;&quot;/&gt;&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/laov/archive/2012/02/14/2351983.html&quot; target=&quot;_blank&quot;&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content:encoded><pubDate>Tue, 14 Feb 2012 23:56:00 +0800</pubDate><guid isPermaLink="false">http://www.cnblogs.com/laov/archive/2012/02/14/2351983.html</guid><dc:creator>weifield</dc:creator></item></channel></rss>
