<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_地球人</title><subtitle type="text">-- 做好才有价值!</subtitle><id>http://feed.cnblogs.com/blog/u/31928/rss</id><updated>2012-05-09T02:27:47Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/31928/rss"/><entry><id>http://www.cnblogs.com/cbcye/archive/2012/05/09/2491273.html</id><title type="text">再谈自主开发与企业IT管理</title><summary type="text">前两天写《自主开发与带兵打仗》分析了一下自主开发的利与弊，得到了园内不少朋友的反馈，但我觉得还有很多东西没有交待清楚，可能有很多朋友也跟我一样在公司的IT部门，有自己的研发团队也有很多外购的系统或产品。IT部门其实很多情况下对于一个公司其实很多情况下是一个很尴尬的部门，更多情况下在老板的印象里是一个管管机器、管管系统的部门，而所谓的做出点成绩却是要投入大量的成本，而所谓的创新更是无稽之谈。因此我觉得对于一个IT部门来在研发方面很遇到很多问题，而这些问题可能更多跟公司的行业、决策者对于信息化的认知等息息相关的。</summary><published>2012-05-09T02:11:00Z</published><updated>2012-05-09T02:11:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2012/05/09/2491273.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2012/05/09/2491273.html"/><content type="html">&lt;p&gt;前两天写《&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/05/07/2488852.html"&gt;自主开发与带兵打仗&lt;/a&gt;》分析了一下自主开发的利与弊，得到了园内不少朋友的反馈，但我觉得还有很多东西没有交待清楚，可能有很多朋友也跟我一样在公司的IT部门，有自己的研发团队也有很多外购的系统或产品。IT部门其实很多情况下对于一个公司其实很多情况下是一个很尴尬的部门，更多情况下在老板的印象里是一个管管机器、管管系统的部门，而所谓的做出点成绩却是要投入大量的成本，而所谓的创新更是无稽之谈。因此我觉得对于一个IT部门来在研发方面很遇到很多问题，而这些问题可能更多跟公司的行业、决策者对于信息化的认知等息息相关的。&lt;/p&gt;  &lt;p&gt;其实作为集团下属IT公司的研发团队组建到现在超过三年的时间了（公司的时间要更长点），我刚好有幸经历过了这三年大变革的阶段，从最初的纯PHP团队到纯JAVA团队再到JAVA+.NET团队几乎每年都会有大的调整，大的人员结构变化，可以说在这三年的时候里栽了不少跟斗，而我们自己的印象是公司老在调整，不管是目标还是人员，老板的印象是投了那么多钱却没有什么效益产出。&lt;/p&gt;  &lt;p&gt;来看看集团IT的场景吧：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;老板：&lt;/strong&gt;你看咱们有这么多公司，有这么多需求是吧，你们IT这边搞出些系统把这些解决了，对于你们来讲以后就有自己独立发展的可能了，内部公司就作为你们的第一批客户是吧。另外现在市场是有这么多开源的产品你把这些产品整合整合起来不就是自己的系统了嘛。现有很多东西都不需要自主开发了，你搞出一个平台来了有很多人能帮你来开发，说着说着就手起手上的iPad跟我们说上，你看iPad有这么多软件这些都是苹果写的吗？不是，那都是别人帮苹果写的，所以说世界上有这么多聪明的人，你不可能把这些都招聘过来工作，但是如果你有平台的话那么他们就有可能在你的平台上来为你服务，你还不需要给他们付钱，是吧。好吧，咱们就做个平台，这个平台要包含XX、XX、XX、XX、XX、XX、XX、XX、XX、XX、XX，你看你们多久可以搞出来嘛。。。。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;IT：&lt;/strong&gt; 老板这个我们得评估系统功能、工作量、人员，对了还有一部分人在您上次交待的项目上得做完了才能抽出来。。。&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;老板：&lt;/strong&gt;我跟你们说你们这种工作方式是不行的，你做不完的工作你可以拆分成任务包嘛，是吧，你可以把这个任务包指派给别人，还可以定一个价格，以后咱们公司就通过任务包来统计工资跟绩效。至于上次那个项目嘛先别做了，现在这是大的概念做好了就可以把上次那个给涵盖到了。所以那个项目的人员从现在开始就调过来好吧。还有工作包的事我觉得这样也不要太久，7天！好吧。为啥七天呢因为上帝创靠人类是用了7天的。所以以后每个工作都要拆成七天。&lt;/p&gt;  &lt;p&gt;两个月后，老板又通知IT开会，那个。。咱们现在要搞一个大的XX平台，这个平台可以OOXXOOXXOOXX。。。。，你们看你们IT把人员的都组织一下从现在就开始做这项工作，每周跟我汇报。。。&lt;/p&gt;  &lt;p&gt;一年后，老板要求IT提交年度分析报告，汇报刚到一半老板就开始说我投了这么多钱养你们这些几百号人，也没搞出几个像样的产品来出。。。过年前半个月公司开始裁员，开春老板又想了一个新的平台，又开始招人倒腾起来了。。。。&lt;/p&gt;  &lt;p&gt;其实我觉得这里面的矛盾有点类似于&amp;#8220;我国现阶段的主要矛盾是人民群众日益增长的物业文件需求与社会生产对相对落后的矛盾。&amp;#8221;，以上的场景里老板提了很多目前主流的思想，比如：项目产品化、平台接口化、分包、互联网化等等概念。因为随着技术、产品、概念更新得越来越快，很多时候作为公司内部IT已经很难再跟上主流的技术、产品、管理方式。但是由于主流技术或产品又传播得太快导致了IT部门越来越难满足老板的胃口，比如老板刚买了个iPad就想要在上面办公了，而之前的系统其实有很多是不兼容的，修改起来费时费力。当然除了IT部门的原因我觉得很多情况下公司文化主要是决策者（老板）的认识是有很多关系的。我觉得作为内部研发团队会有以下几个问题：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. 投资不够&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;其实从一个需求自主开发到一个成熟是一个相对漫长的过程，而在此期间又需要不断的投入以对人员、产品进行调整以优化。但很多情况下作为公司决策者或者业务部门只看到眼前的利益。一个项目如果超过半年以上的话就很难再得到有效的支持了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. 团队素质&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;我们大家都知道&amp;#8220;一分钱一分货&amp;#8221;，作项目的团队跟做产品的其实从人员技能要求来讲是有很大差距的，但是很多公司往往又无法投入如此大的资源来构建产品团队，更多情况下在严格的成本控制下面很难招到能满足&amp;#8220;产品化&amp;#8221;要求的人员，如果人员不能满足的话那么就无从谈起产品化了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.没有主导权&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;IT部门在公司里面基本都是&amp;#8220;二流&amp;#8221;部门，所以很难避免受到公司或者业务部门战略调整的影响，很多IT项目或者人员不得不因为调整而调整。而有时候如果IT部门觉得跟些解决方案其实可以的为业务部门服务，但得不到业务支持的话其实很多情况下也会半途而废。&lt;/p&gt;  &lt;p&gt;当然作为IT部门的我们肯定也希望起走这样的困境，毕竟信息化的价值谁都不敢否定，这也是为什么存在的基本理由。初步考虑我觉得以下的一些方面是不是可供参考或借鉴的：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. 自主开发决策原则&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;如《&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/05/07/2488852.html"&gt;自主开发与带兵打仗&lt;/a&gt;》里讲到的，其实我们并不是所有的产品或系统是需要自主开发的或者说是值得自主开发的，我觉得如果要决定自主开发来做的话主要是考虑是不是主要的业务方向以便能获取长期的支持，也能积累和提升相应的业务经验与价值，至于这个系统自己有没有能力做或者性价比高不高我觉得倒是其次的了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.基础与积累很重要&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;公司很多项目都需要开发，那么开发的话我觉得不需要一个一个的重头开始做，更不能从PHP、JAVA、.NET整批整批的换，这样的代价太高了。要找准主要方向，管理好相关的代码、文档，当然最重要的还是团队要稳健。还有我最近在考虑要不要用一些像微软的Sharepoint 之类的产品来提高基础平台的能力。这样很多时候开发就不会从头开始了。但是SP的人员成本还满高的可能有待商榷，不过应该是一个方向。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.新事务要小而快&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;除了日常的IT及研发工作之后还要对于新事务要采取&amp;#8220;小而快&amp;#8221;的原则，觉得值得试一试就要快速的组建一个小团队快速的发布成果，并在公司内部培养。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4.规划很重要&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;很多公司的IT都没有什么规划，或者有的话就只有一年的规划，其实IT建设是一个相对漫长的过程。我觉得主要的规划以三年为一个周期比较合适，然后每年还有一个相对详细的规划。并且这个规划一定要得到决策者的支持。规划里面除了IT和研发的事项之外其实还要考虑到非IT人员的培训、软、硬件重要的升级等事项。比如全员升级到Win7之类的。不然你以后开发系统体魄得考虑IE6的问题。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5.开源值得尝试吗&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;公司内部的项目除了使用一些开源的解决方案之外有没有办法可以把自己的研发成果开源出去，以便构建社区，提高产品化的可能性。这种方式在互联网公司里面比较普遍，不知道这个否适合于企业研发领域。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;好了，我觉得我了解到的还有我的想法交待得差不多了，以上只是个人的小观点，可能有很多夸大或者不考谱的成份，等着拍砖。。。。&lt;/p&gt;   &lt;img src="http://www.cnblogs.com/cbcye/aggbug/2491273.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/05/09/2491273.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2012/05/07/2488852.html</id><title type="text">自主开发与带兵打仗</title><summary type="text">自主开发与带兵打仗两个好似毫不相干的东西在最近的工作中越来越觉得两者有着越来越多的相似之处。好吧说说目前的情况，我公司是个集团下属的IT公司，有几十名自己的研发团队。有比较多自主开发失败的情况，所以公司内部老是在讨论我们到底是应该自己开发还是直接外购系统或外包出去。刚好前一段时间看了《三国》，想想自主开发跟带兵打仗还是有很多相似的地方。</summary><published>2012-05-07T12:53:00Z</published><updated>2012-05-07T12:53:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2012/05/07/2488852.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2012/05/07/2488852.html"/><content type="html">&lt;p&gt;自主开发与带兵打仗两个好似毫不相干的东西在最近的工作中越来越觉得两者有着越来越多的相似之处。好吧说说目前的情况，我公司是个集团下属的IT公司，有几十名自己的研发团队。有比较多自主开发失败的情况，所以公司内部老是在讨论我们到底是应该自己开发还是直接外购系统或外包出去。刚好前一段时间看了《三国》，想想自主开发跟带兵打仗还是有很多相似的地方。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. 成本高&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;俗话说&amp;#8220;养兵千日，用兵一时&amp;#8221;，要培养一支训练有素的军队不容易，它要花费很长时间和大量物力。在企业里面也是一样，一个研发人员的待遇一般可以养得起2－3个业务/行政之类的人员了，因此研发团队成本对一个企业来说是一个不小的负担，对于管理水平低的企业来说更是如此。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. 风险高&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;一但决定了要自主开发了那么就需要人力、物力、精力不断的往里投，而且还不见得能能搞出来，搞不好可能搞了百千万进去了最后也没搞出个像样的东西，然后团队一解散,竟然只给公司剩下几台&amp;#8220;破&amp;#8221;电脑（所谓的代码如果没有人的驾驭是没有价值的，暂且忽略）。打仗也一样，&amp;#8220;兵马未动，粮草先行&amp;#8221;，仗还没开始打呢就要先运吃穿住的东西了，而且有时投了很大的力气，仗却打败了。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3.心态是一样的&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;我觉得研发人员很像古代的将士，即所谓的&amp;#8220;一将功成万骨枯&amp;#8221;，作为将士只有&amp;#8220;战死沙场&amp;#8221;方显英雄本色，作为研发团队的我们肯定也是通过一个个成功的项目、一个个成功的产品来实现自己的价值，（当然失败的项目和产品大家一般都不会说的，至少在简历里是这样的，呵呵）遇到什么问题很喜欢通过自主开发的方式来解决，当然非研发人员其实更倾向于成熟的产品（如果市面上并且价格还能接受的话），也就是所谓的&amp;#8220;外交渠道&amp;#8221;来解决问题。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4.相似的&amp;#8220;政治&amp;#8221;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;小时候看故事的时候经常会有这样的情节就是：将帅（主角）在前线拼死拼活的打仗，但是背后朝廷里却有不少人在告状，最终导致&amp;#8220;出师未捷身先死，长使英雄泪满襟！&amp;#8221;，虽然在企业里没有那么残酷，但是由于不同人员他们所站的位置是不一样的，因此导致了不同的价值观及事情的判断，如果项目进度再遇到点问题那么这种反面的声音就会越来越强烈，而老板可能也会想投了这么多钱却没出啥成果干脆Close掉得了，导致了项目的失败。&lt;/p&gt;  &lt;p&gt;以上列举了这么多弊端，凡事都是有两面性的，其实大家是多少有点明白的，不然也不会有这么多的公司有着自己的研发团队，下面来说说好处吧。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1.枪杆子里面出政权&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;众所周知，如今要在信息化高速发展的信息里如果没有自己靠得住的研发团队的话是很难在激烈的竞争中取得优势的，特别是对于产品或研发型的公司。所谓的&amp;#8220;枪杆子里面出政权&amp;#8221;，就是&amp;#8220;只有掌握自己的武装力量才能以革命的武装反对反革命的武装&amp;#8221;，你看那些成功的大的公司哪家没有几百上千号人的研发团队，他们能在本行业的信息化、互联网化当中不断的取得先机与主动，拼的就是的研发啊！所谓的外包、最佳实践都是忽悠的，信息化走在前头的公司都清楚，其实这些都是只能参考而以，本行业的信息化还是自己最清楚。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2.打下来的才是牢靠的&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;从很多故事里我们了解打的要比谈的靠谱，如果产品是自己研发出来的那么肯定也比直接外购的考谱（当然我说的是投入是差不多一个水平上的，你别说是光投了2个开发的就要跟人家MS的产品去比较）。有源码在手，又是专门定制开发的，团队还能够比较清楚的了解系统。以后想整合的话想改哪就改哪，做过企业应用整合项目的肯定对此都深有体会。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;其实之前很多情况下我也是比较主张自主开发的，但是有一次看了一家公司的产品（特定行业），功能无比强大，价格还无比便宜（小几万块钱）。想想之前我们自己开发的一些产品的经验。如果我们想要做出同样功能的话起码成本得贵上十几倍，而且可能还需要有一个相对长点的迭代周期。所以其实无论是自己开发还是外购，其实主要还是要看自己的需求与市场上产品的满足程度，如果确实有很成熟的产品了那么其实外购也无可厚非，如果再想稳妥点的话能把源码给谈下来更好了。那么如果是决定自己开发的话也别什么都是自己做，其实IT真的很贵，用不好会伤身的，当然用得好了可以强身健体。呵呵！&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cbcye/aggbug/2488852.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/05/07/2488852.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2012/05/07/2487779.html</id><title type="text">MVC3+EntityFramework实践笔记</title><summary type="text">最近项目想做一个员工统一工号生成的系统，本来可以直接让别的同事来做的，不过大家都在项目上忙不开，刚好也可以练练手于是就接过这个项目。之前虽然一直对MVC和Entity Framework有点了解，但是实际使用的时候还是有很多问题。本文是记录在项目开发过程中遇到的第一手问题及解决办法。</summary><published>2012-05-07T09:51:00Z</published><updated>2012-05-07T09:51:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2012/05/07/2487779.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2012/05/07/2487779.html"/><content type="html">&lt;p&gt;最近项目想做一个员工统一工号生成的系统，本来可以直接让别的同事来做的，不过大家都在项目上忙不开，刚好也可以练练手于是就接过这个项目。之前虽然一直对MVC和Entity Framework有点了解，但是实际使用的时候还是有很多问题。本文是记录在项目开发过程中遇到的第一手问题及解决办法。&amp;nbsp; &lt;/p&gt;&lt;p&gt;1. &lt;strong&gt;DataContext的选择&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750472304.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201205/20120507175047385.png" width="606" height="443" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;遇到的第一个问题就是DtaContext的选择，之前以为根据生成的EDMX就可以直接选择Model生成Controller及View了。 不知道还需要Data context。好吧，初步查了一下Data Context是相关的底层数据连接、数据集定义的。&lt;/p&gt;&lt;p&gt;所以在生成Controller 的时候就选择表的类及创建时生成的Entity即可。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2. 数据校验&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;MVC提供了比较多的数据校验功能，但是很多提示是英文的&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Required(ErrorMessage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;必填&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[DataType(DataType.Text)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[IDCardCheck]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;[Display(Name&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;身份证号&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&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="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;nbsp;PersonalID&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;p&gt;一个简单办法就是声明ErrorMessage值，输入中文的错误提示信息。 &lt;/p&gt;&lt;p&gt;如果需要自定义的验证的话，如上代码中的IDCardCheck,可以继承ValidationAttribute来实现&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;[AttributeUsage(AttributeTargets.Field&amp;nbsp;|&amp;nbsp;AttributeTargets.Property,&amp;nbsp;AllowMultiple&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;,&amp;nbsp;Inherited&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&amp;nbsp;IDCardCheckAttribute&amp;nbsp;:&amp;nbsp;ValidationAttribute&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;CheckHelper&amp;nbsp;checkHelper&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;CheckHelper();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SSOEntities&amp;nbsp;SSODB&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&amp;nbsp;SSOEntities();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt;&amp;nbsp;IsValid(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;nbsp;value)&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="color: #0000ff;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&amp;nbsp;==&amp;nbsp;value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: #0000ff;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;false&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="color: #0000ff;"&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;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: #0000ff;"&gt;string&lt;/span&gt;&amp;nbsp;personalID&amp;nbsp;=&amp;nbsp;value.ToString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: #0000ff;"&gt;if&lt;/span&gt;&amp;nbsp;(checkHelper.CheckIDCard(personalID))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;nbsp;count&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #0000ff;"&gt;from&lt;/span&gt;&amp;nbsp;p&amp;nbsp;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&amp;nbsp;SSODB.t_UserInfo&amp;nbsp;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&amp;nbsp;p.PersonalID&amp;nbsp;==&amp;nbsp;personalID&amp;nbsp;&lt;span style="color: #0000ff;"&gt;select&lt;/span&gt;&amp;nbsp;p).Count();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: #0000ff;"&gt;if&lt;/span&gt;&amp;nbsp;(count&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: #800080;"&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;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ErrorMessage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;该身份证号码已存在！&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&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;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;false&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: #0000ff;"&gt;else&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;ErrorMessage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;请输入正确的身份证号码&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&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;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;false&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;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: #0000ff;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;true&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;br /&gt;&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="color: #0000ff;"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;exp)&lt;br /&gt;&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;ErrorMessage&amp;nbsp;=&amp;nbsp;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;请输入正确的身份证号码&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&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;span style="color: #0000ff;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;false&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;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;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3. 映射存储过程&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;EDMX支持将存储过程映射到实体类的添加、删除、修改中。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750477910.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750483482.png" width="412" height="232" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750481879.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750489088.png" width="545" height="335" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;映射之后调用的时候还是可以用类似于SSODB.t_UserInfo.AddObject(xxx);这种方式来调用但是实际执行的时候是执行存储过程了。&lt;/p&gt;&lt;p&gt;3. 导入存储过程方法&lt;/p&gt;&lt;p&gt;如果你想在存储过程里直接使用存储过程的方法，那么可以在Model Brower里的 Function Imports里导入存储过程。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750484977.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750494138.png" width="206" height="121" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在代码里直接使用：&lt;/p&gt;&lt;p&gt;SSODB.DeleteEmployee(id, currentUser);&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4. CodeFirst 实现&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;EF4.1 开始引入了Model First/Database First/Code First 等功能，由于这个项目是在之前项目的项目上改过来的。所以没有完全用Code First来做。不过在找解决办法的过程中还是试了一下Code First。以下为 Code First相应的Model Class及Data Class的代码:&lt;/p&gt;&lt;int&gt;&lt;system.datetime&gt;&lt;int&gt;&lt;useridinfo&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&amp;nbsp;UserIDInfo&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;[Key]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;nbsp;UserId&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;nbsp;Name&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;System.DateTime&amp;nbsp;CreateTime&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;Nullable&amp;nbsp;CreateUser&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;nbsp;status&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;nbsp;Sex&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;nbsp;PersonalID&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&amp;nbsp;StaffNumber&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;Nullable&amp;nbsp;EntryDate&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;Nullable&amp;nbsp;SequenceNumber&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&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="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&amp;nbsp;UserIDContext&amp;nbsp;:&amp;nbsp;DbContext&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="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;UserIDContext()&lt;br /&gt;&amp;nbsp;&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="color: #0000ff;"&gt;base&lt;/span&gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;UserIDInfoConnect&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&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;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&amp;nbsp;DbSet&amp;nbsp;UserIDInfos&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/useridinfo&gt;&lt;/int&gt;&lt;/system.datetime&gt;&lt;/int&gt;&lt;p&gt;Web.Config的配置&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;connectionstrings&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;add&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="UserIDInfoConnect"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;connectionstring&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="data&amp;nbsp;source=.\SQLEXPRESS;Integrated&amp;nbsp;Security=SSPI;initial&amp;nbsp;catalog=SSO;User&amp;nbsp;Instance=true"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;providername&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="System.Data.SqlClient"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;connectionstrings&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5. 代码云存储&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;特别需要说明的是这次使用酷盘+TFS的方式来管理代码。因为我在公司和家里总共有两台电脑，家里的网络又连不到TFS，因此需要代码同步，但是用U盘拷来拷去的太不方便了。因此想到了用酷盘作为代码文件的同步。当然我把数据库文件也作为同步的项了。这样在公司写完代码如果还想回家写的话直接到家打开电脑即可。还有最重要的一点是酷盘有版本控制的功能。这个项目里由于我脱离了TFS开发了好长时间，后来想把最新的代码迁到TFS上，倒腾了半天把好几个重要的文件都给弄丢了。还好在酷盘的已删除里找到了，不然就白努力了。&lt;/p&gt;&lt;p&gt;因此推荐给大家这个工具 访问地址：&lt;a title="http://kb.vc/qCgf" href="http://kb.vc/qCgf"&gt;&lt;strong&gt;http://kb.vc/qCgf&lt;/strong&gt;&lt;/a&gt; （通过该链接访问我可以增长点免费空间，感谢您的支持！），我使用过Dropbox/SkyDrive/微盘/快盘等几个工具，觉得在国内访问速度还有空间还是酷盘最好。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750497551.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201205/201205071750497584.png" width="720" height="318" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;不过有一点需要提醒的是光有酷盘可能还是行。因为你无法为代码生成结构化的版本，比较打标签之类的。因此还要结合TFS来做代码的管理。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6.总结&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;通过小一周的开发体验觉得MVC+Entity Framework对于.NET 的Web开发来说还是强大了不少，当然由于开发时间紧以上的概念之外我可能说得不太准确，欢迎大家批评指证，以后得继续努力学习。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cbcye/aggbug/2487779.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/05/07/2487779.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2012/02/07/2341053.html</id><title type="text">Word邮件合并-IT男必备技能</title><summary type="text">一天HR的MM找我，说公司最近有一批人事任命在Excel表格中存着，但是下发的时候需要使用Word形式的，模板她都做好了，但是如果一个一个敲的话太费劲了，问我看有没有什么办法可以批量的办法来根据Excel数据生成Word版的任命书。最郁闷的是她竟然拿出了另外一个人已经做好的Word来给我看，说“你看你就照着他的做就成了”。。。。。。</summary><published>2012-02-07T03:36:00Z</published><updated>2012-02-07T03:36:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2012/02/07/2341053.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2012/02/07/2341053.html"/><content type="html">&lt;p&gt;一天HR的MM找我，说公司最近有一批人事任命在Excel表格中存着，但是下发的时候需要使用Word形式的，模板她都做好了，但是如果一个一个敲的话太费劲了，问我看有没有什么办法可以批量的办法来根据Excel数据生成Word版的任命书。最郁闷的是她竟然拿出了另外一个人已经做好的Word来给我看，说&amp;#8220;你看你就照着他的做就成了&amp;#8221;。。。。。。&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071135579504.jpg"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="6685770-300x419" border="0" alt="6685770-300x419" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071135587194.jpg" width="304" height="423" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;无奈之前由于根本没有接触过这个东西，虽然有已经成型的东西研究但是没有什么头绪。因此在她脑上倒腾了一会就落荒而逃。回来之后痛定思痛，潜心研究。好在有Google的帮助，在更换了数个关键词之后终于找到了解决办法－其实就是office03就已经有的&lt;strong&gt;邮件合并&lt;/strong&gt;功能。考虑到众多单身的IT同仁，不敢独享，故有此文。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;准备工作&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;首先备一份Word文档，内容如下所示。（不用考虑什么数据域、Word控件之类的我之前在上面绕了点弯路）&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/20120207113559358.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136013837.png" width="577" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;其次准备一个Excel数据源,内容如下所示：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/20120207113601523.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136023097.png" width="250" height="132" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;开始合并&lt;/p&gt;  &lt;p&gt;1.打开word文档，点击功能区域的邮件，在&amp;#8220;开始邮件合并&amp;#8221;中选择&amp;#8220;邮件合并分步向导&amp;#8221;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136046119.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136077595.png" width="351" height="306" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;2.在右侧的功能区域中选择文档类型为信函&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136081249.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136081315.png" width="202" height="168" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;3. 开始文档中选择当前文档&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136097793.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136105907.png" width="201" height="129" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;4. 在选择收件人中选择准备的Excel数据源&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136113498.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136113041.png" width="203" height="222" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;5.在撰写信函中选择其他项目&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136121711.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136132126.png" width="203" height="229" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;6.将合并的域名插入到文章中指定的位置&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136169076.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136194913.png" width="515" height="355" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;7.预览信函中，可以查看到已经合并好的信函&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136207803.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/20120207113620377.png" width="202" height="149" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136228591.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/20120207113623708.png" width="564" height="207" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;8.点击完成合并，再在合并选择中选择编辑单个信函&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136241886.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136255017.png" width="204" height="229" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;9.在合并到新文档的对话框中选择全部，就可以看到根据数据源生成的多份任命书。保存新文档即可。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136268148.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136274659.png" width="489" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;好了，以上就是邮件合并的功能。希望某天哪位IT兄弟能用上&lt;img class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://images.cnblogs.com/cnblogs_com/cbcye/201202/201202071136275805.png" /&gt;&amp;nbsp;&lt;a href="http://files.cnblogs.com/cbcye/Word_envelope.zip"&gt; 示例下载&lt;/a&gt;&lt;/p&gt;   &lt;img src="http://www.cnblogs.com/cbcye/aggbug/2341053.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/02/07/2341053.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2012/02/06/2340590.html</id><title type="text">外包项目的内外部管理</title><summary type="text">今天下午又开了一次项目例会，对于已经延期了一个多月的模块外包厂商竟然还提需要给他们什么材料再回去研究研究，实在忍无可忍。感叹作为甲方来说，对于外包出去的项目来说如果遇到了九流的厂商，然后再加上没有什么实质效果的管理办法，真是哑巴吃黄连-&gt;有苦说不出。</summary><published>2012-02-06T13:25:00Z</published><updated>2012-02-06T13:25:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2012/02/06/2340590.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2012/02/06/2340590.html"/><content type="html">&lt;p&gt;今天下午又开了一次项目例会，对于已经延期了一个多月的模块外包厂商竟然还提需要给他们什么材料再回去研究研究，实在忍无可忍。感叹作为甲方来说，对于外包出去的项目来说如果遇到了九流的厂商，然后再加上没有什么实质效果的管理办法，真是哑巴吃黄连-&amp;gt;有苦说不出。&lt;/p&gt;  &lt;p&gt;事情还得从一年前说起，一年前公司老板看到分布在全国各地的人力管理工作效率特别低，做个工资、绩效什么的特别慢，想因此要求IT部门为人力部门提供eHR方面的系统，来提高工作效率。在通过前期调研、自制采购分析、招投标下来就选定了其中一家。为了让项目后续的工作更加顺利，我们还让厂商在未签约前先进行需求分析、产品试用等工作，直至最终的签约及项目实施。刚开始项目实施的还相对顺利，但是随着时间的推进，人员的调整，慢慢的两边的节奏就合不到一起了，不是因为甲方业务部门的问题就是外包团队的问题。而我们作为IT部门的项目管理人员来说也就是开始头疼的时候了，一个小几十万的实施项目实施周期竟然能够比计划的多两倍！当然这里面的问题是多方面的，总结出一些外包项目管理的教训或经验来与大家分享。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;内部管理&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;1. 主次需分明&lt;/p&gt;  &lt;p&gt;本来实施个系统是为了给人力部门使用的，老板却让IT部门牵头来搞这个项目。虽然老板不久后在我们的&amp;#8220;要求&amp;#8221;下陆续指派了不同的人力部门人员来&amp;#8220;负责&amp;#8221;这个项目，但是指派来的人要嘛就是职位太高太忙无暇顾及，要嘛就是小虾米无法调动其部门内的人员。因此项目具体实施时的业务部门很难真正调动起来。&lt;/p&gt;  &lt;p&gt;2. 良好的项目执行环境&lt;/p&gt;  &lt;p&gt;由于公司的产业较多，人员调动本身就比较频繁，再加上公司人力制度的缺失人员流动很大，因此作为人力部门本身其实并没有一个长期的规划，包括IT方面的规划。因此在系统部署的时候有时候刚培训好了人员，过不了多久就离职或者调动了。对项目的造成很大影响。&lt;/p&gt;  &lt;p&gt;3. 良好的高层沟通&lt;/p&gt;  &lt;p&gt;项目的问题或需求可以尽快的传递到高层领导上，以获得他们的支持。虽然有时候事情实际执行的效果也并不好，但有了高层的支付至少能使项目更顺利一点。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;外包团队管理&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;1. 选择很重要&lt;/p&gt;  &lt;p&gt;选择一家合适的公司很重要，如果选错了那么后面不仅要多花很多时间和精力还有可能把事情给搞砸了！同样的外包项目我们另外一个项目与另外一个公司就合作得很愉快，基本上只需要定期检查一下成果做一些沟通就可以了。&lt;/p&gt;  &lt;p&gt;2. 实施团队很重要&lt;/p&gt;  &lt;p&gt;之前提到了我们为了减少项目实际执行过程中的问题已经提前让厂商的人员过来进行需求调研和配合产品试用等工作，但是在项目实施过程中外包团队的几个主要人员却离职了，直接导致了外包厂商一直无法给我们提供合适的人员来继续后续的项目工作。&lt;/p&gt;  &lt;p&gt;3. 现场很重要&lt;/p&gt;  &lt;p&gt;由于我们是购买产品，然后少量模块需要定制开发，因此厂商就直接在他们的公司进行开发了，但后来在项目实施过程中自定义模块的开发工作根本控制不了。所以如果说能要求厂商现场开发的话最好还是现场开发。&lt;/p&gt;  &lt;p&gt;4. 合同很重要&lt;/p&gt;  &lt;p&gt;其实很多问题都体现在合同上，项目出现问题的时候我就会去找合同，但可惜之前很多地方并没有约定，比如实施团队变更的确认及赔偿问题、现场开发问题、违约、赔偿的定义等。因此在最好把很多问题都约定在合同里，当然还要包括衡量标准，别约定了却执行不了。&lt;/p&gt;  &lt;p&gt;5.其他 实际项目管理中的&amp;#8220;术&amp;#8221;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp; a. &lt;u&gt;要求符合要求的实施人员&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 这一点看似理所当然，但是在我中途接手该项目之前却没有人明确向厂商提及这个问题。厂商也是只派一个小兵天天呆在我们公司做些不着边际的工作而以。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp; b.&lt;u&gt;制定有效的项目计划&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有问题的项目一般项目计划也有问题，因此有必要重新制定一个有效的项目计划包括清晰的目标、明确的责任人、完成时间和交付物，然后通过不断跟踪与修正该计划来达到项目监控的目的。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp; c.&lt;u&gt;缩短项目汇报时间&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 原来项目只是每周一次例会，现在改为一天一次例会，如果有人员不在现场则需要电话拨进参与每日例会，汇报本日的工作成果及明日的项目安排。参会人员包括业务、实施、IT等各类人员，会议的时候不需要很长，十几分钟到半小时之内即可，这种办法对于短期内尽快推进项目工作有良好的效果。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; d.&lt;u&gt;统一沟通渠道&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 原来项目上很多工作是通过口头、QQ来完成的，经常会遇到&amp;#8220;我早就给你了！&amp;#8221;、&amp;#8220;我还没有得到啊！&amp;#8221;这样的争论，那么就需要统一沟通渠道，比如QQ讨论群组、邮件及文件服务器（FTP、SVN）或其他项目管理工具。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; e.&lt;u&gt;培训\教育&lt;/u&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有时这个听来很荒谬我们是请他们来教我们的，我们是花了钱让他们来实施的，但有时你要是碰上七、八流的公司的话没办法还得时不时的教他们一些基础的工作方法，比如&amp;#8220;能在会下解决的问题尽量在会下解决&amp;#8221;、&amp;#8220;项目计划不单单是工作列表&amp;#8221;等等&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;项目自身的管理&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;1. 沟通很重要&lt;/p&gt;  &lt;p&gt;沟通在项目管理中占了大部分的工作，那么在多个团队的管理中沟通尤为重要，同时需要注意在沟通中发现问题并及早解决。&lt;/p&gt;  &lt;p&gt;2. 替代方案&lt;/p&gt;  &lt;p&gt;作为项目经理在你手上最好永远有替代方案，比如外包厂商时间延迟很长时间搞不定了，你可以其他办法或人员来实现，所产生的费用从外包厂商的尾款中扣除。&lt;/p&gt;  &lt;p&gt;3.考虑撤退方案&lt;/p&gt;  &lt;p&gt;如果项目实在搞不下去了，那么最好提前考虑撤退方案，比如该如何做项目收尾，如何向老板交待甚至如何打官司（这一点可以提前跟法务部门沟通）。&lt;/p&gt;  &lt;p&gt;2. 最后排除自身责任&lt;/p&gt;  &lt;p&gt;虽然项目经理最终是为目标为项目负责的，但有时公司无法给你提供相应的&amp;#8220;权力&amp;#8221;，也就是你努力争取又搞不定的时候一定就要把自己的责任给摘清楚，重要的沟通需要保留&amp;#8220;证据&amp;#8221;，别老板一怪罪下来你成了替罪羊了！&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;好吧，以上就是一点作为甲方来讲对于外包项目管理中的一点认识，欢迎拍砖！&lt;/p&gt; &lt;img src="http://www.cnblogs.com/cbcye/aggbug/2340590.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/02/06/2340590.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2012/02/05/2339150.html</id><title type="text">三年项目管理，三个阶段</title><summary type="text">算年头的话项目管理已经做了三年了，作为技术出身的我，在这三年感觉自己经历的三个不同的阶段。也对项目管理有一个进一步的了解。与大家分享一下自己认为的三年三个阶段。</summary><published>2012-02-05T09:38:00Z</published><updated>2012-02-05T09:38:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2012/02/05/2339150.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2012/02/05/2339150.html"/><content type="html">&lt;p&gt;算年头的话项目管理已经做了三年了，作为技术出身的我，在这三年感觉自己经历的三个不同的阶段。也对项目管理有一个进一步的了解。与大家分享一下自己认为的三年三个阶段。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;跟项目&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;刚从一家公司的程序员跳到另一家公司当项目经理，对我的挑战有两点一个是不同的公司，二是全新的身份。虽然之前也一直在项目里工作。但是项目管理的工作对我来说还是片断的。&lt;/p&gt;  &lt;p&gt;因此刚到公司，分配给我的项目我不断的从我的领导和同事那里去学习项目管理方面的知识，而公司分给我的项目（子项目）上我只能&amp;#8220;跟&amp;#8221;进项目：安排会议、记录会议既要、发布项目周报、汇报项目进度。对于时间、范围、成本、质量等还很控制，由于在互联网公司项目管理还是相对新鲜的，有时我甚至不知道该不该去争取一些权力、事情没人做我就自己去做了。&lt;/p&gt;  &lt;p&gt;在&amp;#8220;跟&amp;#8221;了几个项目之后我就对我的工作有了一个更好的认识，而此时我也在谋划来考一个PMP的认证，刚开始主要的动机其实是要有一个&amp;#8220;证&amp;#8221;，但是学习过程中我逐渐对项目管理的工作有了一个更加系统的认识，在PMP学习的时间里我不知不觉的到了下一下阶段。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;带项目&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在第二个年头里，公司也对项目管理逐渐的重视起来。我由于有了PMP理论的一些基础也可以在公司项目管理改革中提出一些相对专业的见解，自己也能独立负责一些项目全生命周期的管理，包含一些外部厂商的谈判、项目组建、招投标、项目验收等工作。&lt;/p&gt;  &lt;p&gt;能够主动的为项目执行争取合适的外部环境，能够对项目成员的工作起到促进的工作。能够知道如何剔除一些不利于项目目标的成员，能够清楚如何做项目的成本管理。大概项目的方方面面管理工作在这个阶段有了较大的提高。有了几个成功的项目交付也更有自信去负责项目或者争取条件，有时手头上有五、六个项目也应付自如。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;项目价值管理&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;第三个年头逐渐感觉成功完成或交付一个项目在很多情况下并不能为公司或业务部门创造价值，业务部门在IT项目或互联网项目有一种&amp;#8220;别人有我也需要&amp;#8221;这样的误区，其实在如今竞争如此激烈的环境下光有别人的功能还是不行的。因此公司有很多项目在交付之后根本没有运营走来或者说等于进入了&amp;#8220;立项－&amp;gt;交付-&amp;gt;死亡-&amp;gt;立项&amp;#8221;这样的怪圈。&lt;/p&gt;  &lt;p&gt;因此目前很大部分的工作会在项目立项的前期与业务部门进行沟通，帮他们策划项目，立项什么项目、实现什么功能、达到什么目标、后续如何操作这样的工作。而这些对我来说更具挑战性，对项目本身及公司的投资来讲也更有意义。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;以上是我三个年头，三个阶段的项目管理心得体会，与大家分享。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cbcye/aggbug/2339150.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/02/05/2339150.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2012/02/05/2339125.html</id><title type="text">项目管理－自上而下还是自下而上的沟通？</title><summary type="text">项目经理喜欢在做沟通之前做一些假设，比如假设资源（员工）本人是愿意参与项目工作的或者是同意调整的，双比如TA的部门领导或者大老板是同意协调的。但是在实际执行的时候可能会遇到问题。举几个沟通失败的例子探讨一下。</summary><published>2012-02-05T09:00:00Z</published><updated>2012-02-05T09:00:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2012/02/05/2339125.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2012/02/05/2339125.html"/><content type="html">&lt;p&gt;项目管理过程中经常需要向职能型部门协调资源或者为项目成员争取一些利益，这些活动有些涉及到项目成员本身，有些为项目管理团队又有些是项目以外的公司领导。那么是采用自上而下还是自下而上的沟通呢？&lt;/p&gt;  &lt;p&gt;项目经理喜欢在做沟通之前做一些假设，比如假设资源（员工）本人是愿意参与项目工作的或者是同意调整的，双比如TA的部门领导或者大老板是同意协调的。但是在实际执行的时候可能会遇到这样或那样的问题。举几个沟通失败的例子。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1. 协调人员，领导们都同意了员工却不干&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;作为项目经理经常需要到职能部门去协调资源来参与项目工作，但是这次协调却遇到问题了。事情是这样的，我们有一个女的PHP开发工师怀孕了，之前请了一段时间的假，春节后过来上班。而此时我手头上刚好有一个项目需要一个PHP开发工程师完成一个二到三周的活。&lt;/p&gt;  &lt;p&gt;刚开始我以为她应该会很乐意接受我给她找的项目，因为这个项目她只需要把原来的代码改一改就可以用于新的网站了。于是我找了她的领导（技术经理）沟通，同意了；另外还听说她的合同好像有调整，有可能要调到集团下的其他子公司，于是我又去找了公司总经理，也同意。最后我把这个消息告诉她时，她却说现在怀孕不太方便，不太想干编程的活，想让公司给她安排一些其他的活。&lt;/p&gt;  &lt;p&gt;我白跑了一趟！一方面公司的领导会想着这个资源在我手头上工作，另一方面她又不想做项目的工作，就算我跟她说我已经跟领导协调好了，她去再去跟领导讲一下她的想法的话，也很难挽回沟通失败的损失。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2. 私人关系好直接干活，领导不干了！&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;这个几年前的事情了，我当时是A项目里的一名开发工程师，由于A项目的项目经理不经常跟我们在一起，因此我们的工作相对自由点。这时B项目的一个项目经理找到了我，想让我给B项目干点活，由于我跟B项目的项目经理私人关系还行，而且B项目里我也能学到不少东西，因此我偶尔&amp;#8220;请假&amp;#8221;去干B项目的活，后来B项目想把我给调过去，找A项目的项目经理时，A项目的项目经理死活不肯，为此他们两个还大闹了起来。A项目的项目经理还把之前我&amp;#8220;帮&amp;#8221;B项目干活的事情给抖落出来。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3. 给试用员工提前转正，他却提出离职&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;项目成功交付，我打了费了好大劲给项目团队的一员成员提前转正，本来是想给该名团队成员一个&amp;#8220;惊喜&amp;#8221;（提前转正在我们公司比较少见），但是当然把这个消息告诉TA时，他说考虑一下，过会儿就找我说要辞职！说是来公司时HR谈的待遇太低（其实是市场水平），转正后待遇又没有提升因此考虑了还是要辞职！我跟他说如果要涨薪的话我可以再跟公司谈，但是他说一方面刚来没多久（三个月）做的贡献也是不是很突出因此现在跟公司谈涨薪也不太合适，主要是他自己还是觉得待遇低了因此还是要辞职。&lt;/p&gt;  &lt;p&gt;由于他是试用期员工提前三天通知就可以离开公司了，他的离开会使我项目后期的维护工作遇到非常大的麻烦，我的上司也觉得我没有事前跟他沟通给TA涨点薪就好了（其实公司是不会给涨的）！&lt;/p&gt;  &lt;p&gt;后来跟他沟通了解到如果我不主动给他涨薪的话他可能会呆到试用期（6个月）结束，如果公司能给他涨一点的话他更加感激了。而我吃力不讨好的给项目上带来了麻烦。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;可见项目管理中沟通不仅重要，沟通的顺序与方式也需要考虑。而沟通方式与顺序是依赖于干系人分析，具体采用自下而下还是自下而上沟通需要看各个关系人对沟通目的的影响力来判断。&lt;/p&gt;  &lt;p&gt;第一个例子中，沟通的目的是协调该名员工参与项目工作，但是我是在做假设的基础上去做的沟通。其实直接跟目标员工的沟通是最简单、成本最低的，可能只需要一句话就可以了。&lt;/p&gt;  &lt;p&gt;第二个例子中，虽然B项目的项目经理虽然是采用自下而上的沟通，但却忽略的干系人及沟通时机，因此导致最后大家不愉快！虽然有可能B项目的项目经理在做了沟通之后可能也根本不能让我过去帮忙，但至少这样做是比较专业的做法。&lt;/p&gt;  &lt;p&gt;第三个例子中，沟通的目的是需要该成员更好的为后续的项目工作服务，基于这个目的考虑到提前给该名员工转正的奖励行动，但由于这个行动由于没有得到干系人（该名成员）的认可，后续的沟通工作注定就是失败的。因此无论采用哪一种沟通方式都是不可行的，而是要项目经理需要在项目执行过程中不断的关注项目干系人的需求。因此失败的主要原因是干系人的需求没有识别出来。&lt;/p&gt;  &lt;p&gt;另外有些沟通或者最终的目的达成是是项目内部无法控制的，需要项目外的公司给营造好的组织环境，以保证项目的有效沟通。比如第三个例子中的涨薪问题，最好有HR能给予配合就好了。&lt;/p&gt;  &lt;img src="http://www.cnblogs.com/cbcye/aggbug/2339125.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/02/05/2339125.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2012/01/08/2316514.html</id><title type="text">知难而退，抢张硬座回家过年。。。</title><summary type="text">真是很惭愧。看到网上那多哥们如何如何用自己写的工具、脚本，买到了回家的车票至少还是都是卧铺的。但是我水平不行，只买到了硬座的（已完成支付，收到了12306的短信通知但未换纸质车票）。既然只买到硬座的而以还有啥好说的呢？更何况这是博客园首页啊！其实我只想说我其实也做了不少工作，可能算是技术不行、也可能是绕了很多弯路、还有可能就是12306或95105105虽然很烂但其实他们也是在不断的改进的，今天找到的方法说不定明天效果就不好。</summary><published>2012-01-08T10:03:00Z</published><updated>2012-01-08T10:03:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2012/01/08/2316514.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2012/01/08/2316514.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 真是很惭愧。看到网上那多哥们如何如何用自己写的工具、脚本，买到了回家的车票至少还是都是卧铺的。但是我水平不行，只买到了硬座的（已完成支付，收到了12306的短信通知但未换纸质车票）。既然只买到硬座的而以还有啥好说的呢？更何况这是博客园首页啊！其实我只想说我其实也做了不少工作，可能算是技术不行、也可能是绕了很多弯路、还有可能就是12306或95105105虽然很烂但其实他们也是在不断的改进的，今天找到的方法说不定明天效果就不好。&lt;/p&gt;  &lt;p&gt;首先讲讲做了哪些工作：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;12306.cn&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 第一次访问了该网站之后我就想应该可以写一个自动化的工具，可以自动帮我去进行查票、订票。最开始的时候想的前面几步都是手工实现的，然后通过构造发送最终的订票数据。来模拟提交。但不是很理想，虽然把本地所有的cookie信息都模拟提交了但还是返回不了正确的订票信息。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 于是就想写WinForm之类的工具，遇到了验证码。考虑过用人工的方式但还是想着如果能够破解图形验证码的话效果应该更好。无奈花了一、两天的时间来搞验证码，做一过比如把图片信息变为0和1分布的矩阵，通过查找相对位置的办法来识别，但是识别效果并不好，因此放弃。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802242049.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802244524.png" width="487" height="322" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最近这两天在网站方面已经不考虑再写什么工具了，注册了三个账户，把要买的人员全部加为联系人，在查票的时候挂上如下简单的脚本，进行自动刷新而以。&lt;/p&gt;  &lt;p&gt;setInterval(" this.document.getElementById('main').contentWindow.document.getElementById('submitQuery').click();",10000)&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;95105105&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 虽然电话订票的渠道知道的时间要比网上稍晚点，但网上看了一些文章好像用电话订票的成功率要高点似的。刚开始想的也是自动来实现的，但是订票环节中加了个验证码，全流程的自动化暂时是行不通了。但是由于之前接触过Skype相关的API，因此还是写了一个简单的外挂，进行自动化重拨和身份证输入等功能。写这个外挂过程中我还特决购买了800多分钟的skype套餐（还有一半未使用完）。&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802256128.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802252507.png" width="664" height="428" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Skype通话录音与尽快重拨代码(需要安装Skype4COM)&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('08cc463f-546d-4303-9328-770034a8a9e0')"&gt;&lt;img style="display: none;" id="code_img_opened_08cc463f-546d-4303-9328-770034a8a9e0" class="code_img_opened" onclick="cnblogs_code_hide('08cc463f-546d-4303-9328-770034a8a9e0',event)" src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;div id="cnblogs_code_open_08cc463f-546d-4303-9328-770034a8a9e0" class="cnblogs_code_hide"&gt;&lt;div&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&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="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;nbsp;忙重拨&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="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&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="color: rgb(128, 128, 128);"&gt;///&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;param&amp;nbsp;name="phoneNum"&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;电话号码，例如:01095105105&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(128, 128, 128);"&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="color: rgb(0, 0, 255);"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;void&lt;/span&gt;&amp;nbsp;ReDial(&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;&amp;nbsp;phoneNum)&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="color: rgb(0, 0, 255);"&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;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objSkpe&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&amp;nbsp;Skype();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objSkpe.Attach(&lt;span style="color: rgb(128, 0, 128);"&gt;7&lt;/span&gt;,&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;true&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objCall&amp;nbsp;=&amp;nbsp;objSkpe.PlaceCall(phoneNum);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;设置声音文件输出目录&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;&lt;span style="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;&amp;nbsp;outPutFolder&amp;nbsp;=&amp;nbsp;System.Environment.CurrentDirectory&amp;nbsp;+&amp;nbsp;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;\\audio\\&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&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;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(!Directory.Exists(outPutFolder))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;Directory.CreateDirectory(outPutFolder);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: rgb(0, 0, 255);"&gt;string&lt;/span&gt;&amp;nbsp;waveFile&amp;nbsp;=&amp;nbsp;outPutFolder&amp;nbsp;+&amp;nbsp;phoneNum&amp;nbsp;+&amp;nbsp;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;_&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;DateTime.Now.ToString(&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;yyyyMMdd_hhmmss&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;)&amp;nbsp;+&amp;nbsp;&lt;span style="color: rgb(128, 0, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;.wav&lt;/span&gt;&lt;span style="color: rgb(128, 0, 0);"&gt;"&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;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;录音&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;objCall.set_OutputDevice(TCallIoDeviceType.callIoDeviceTypeFile,&amp;nbsp;waveFile);&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;WriteLog("拨号中...");&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;TimeSpan&amp;nbsp;startTime&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&amp;nbsp;TimeSpan(DateTime.Now.Ticks);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;循环直到通话中&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;&lt;span style="color: rgb(0, 0, 255);"&gt;while&lt;/span&gt;&amp;nbsp;(objCall.Status&amp;nbsp;!=&amp;nbsp;TCallStatus.clsInProgress)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;判断拨号超时&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(objCall.Status&amp;nbsp;==&amp;nbsp;TCallStatus.clsRouting)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.Sleep(&lt;span style="color: rgb(128, 0, 128);"&gt;1000&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;TimeSpan&amp;nbsp;stopTime&amp;nbsp;=&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;new&lt;/span&gt;&amp;nbsp;TimeSpan(DateTime.Now.Ticks);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TimeSpan&amp;nbsp;val&amp;nbsp;=&amp;nbsp;stopTime.Subtract(startTime).Duration();&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;&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="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(val.TotalSeconds&amp;nbsp;&amp;gt;&amp;nbsp;&lt;span style="color: rgb(128, 0, 128);"&gt;30&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;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objCall.Finish();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;continue&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;&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;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;忙或关闭等各种状态重播&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(objCall.Status&amp;nbsp;==&amp;nbsp;TCallStatus.clsBusy&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;||&amp;nbsp;objCall.Status&amp;nbsp;==&amp;nbsp;TCallStatus.clsFailed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;||&amp;nbsp;objCall.Status&amp;nbsp;==&amp;nbsp;SKYPE4COMLib.TCallStatus.clsFinished&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;||&amp;nbsp;objCall.Status&amp;nbsp;==&amp;nbsp;SKYPE4COMLib.TCallStatus.clsCancelled&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;||&amp;nbsp;objCall.Status&amp;nbsp;==&amp;nbsp;SKYPE4COMLib.TCallStatus.clsEarlyMedia&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;||&amp;nbsp;objCall.Status&amp;nbsp;==&amp;nbsp;SKYPE4COMLib.TCallStatus.clsRinging&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;如果是忙音，则需要先挂断再重拨&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 0, 255);"&gt;if&lt;/span&gt;&amp;nbsp;(objCall.Status&amp;nbsp;==&amp;nbsp;SKYPE4COMLib.TCallStatus.clsEarlyMedia&amp;nbsp;||&amp;nbsp;objCall.Status&amp;nbsp;==&amp;nbsp;SKYPE4COMLib.TCallStatus.clsRinging)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objCall.Finish();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;WriteLog("忙重拨...");&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.Sleep(&lt;span style="color: rgb(128, 0, 128);"&gt;1000&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;ReDial(phoneNum);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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;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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;&amp;nbsp;WriteLog("通话中...");&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;br /&gt;&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="color: rgb(0, 0, 255);"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;exp)&lt;br /&gt;&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="color: rgb(0, 128, 0);"&gt;//&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;WriteLog("Error:"&amp;nbsp;+&amp;nbsp;exp.Message);&lt;/span&gt;&lt;span style="color: rgb(0, 128, 0);"&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;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;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 虽然流程自动化系统比较难实现，但其实我也在这方面做了一些努力，比如动用了微软的SpeechSDK来参与我的抢票工作，以下是调用SppechSDK识别声音到文本的结果展示。&amp;nbsp; &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802256934.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802262997.png" width="637" height="406" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;但是由于目前还未找到直接将Skype的流转为SpeechSDK可以识别的流，因此该方案目前暂无进展。&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;12306.cn&amp;nbsp; 本文标题所指的硬座其实写的工具都没有派上用场，最后还是通过&amp;#8220;人工&amp;#8221;的方法来订到的，可惜提交了不少于50次的卧铺订单但还是无法成功订到。&lt;/p&gt;  &lt;p&gt;95105105&amp;nbsp; 开发了不少功能，但是最实是实用的还是自动重播那一项，该渠道于昨天（1月18日）帮一朋友买到了临客的卧铺，也还算是聊以慰籍。本来今天还想给我自己订的无奈很不给力两个Skype从7:58开始拨到8:30才拨通不说，好几次都确认订票信息了，系统直接给我提示&amp;#8220;系统繁忙，订票请按1&amp;#8221;，崩溃了。。。。(不更早一点拨号是因为之前发现7点多拨的号到8点以后还是订不了最新预售期内的票，网站好像也有这个问题。他是根据登录时间来定的而不是当前时间，所以早拨也没用。）&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;总结一下：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;网站和电话其实这两个方向我都了相应的探索但基本都属于无功而返，反思这次做为一个程序员的的抢票行动，我觉得有以下几点是需要考虑的：&lt;/p&gt;  &lt;p&gt;1. 开发工作脱离目标&lt;/p&gt;  &lt;p&gt;目标虽然很清晰，但是在实际开发过程中很容易进了死胡同里，特别是感觉如果解决了很有成就感的技术问题。当然还有可能是由于技术水平有限，应该有高手早就解决了我遇到的这些问题了。&lt;/p&gt;  &lt;p&gt;2.少即是多，准备的东西太多，抢票时手忙脚乱的。看看我的工作台快照&lt;img class="wlEmoticon wlEmoticon-smile" alt="Smile" src="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802262441.png" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802311879.png"&gt;&lt;img style="border-width: 0px; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/cbcye/201201/201201081802359465.png" width="644" height="484" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;无论怎样。我觉得此次抢票行动比起在车站排除买票，还是意思的多的。最后,&lt;strong&gt;&lt;font color="#ff0000" size="5"&gt;祝大家都能买到中意的车票平安回家，新年快乐！&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;    &lt;img src="http://www.cnblogs.com/cbcye/aggbug/2316514.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2012/01/08/2316514.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2011/12/19/2293103.html</id><title type="text">BizTalk2010动手实验（九）业务规则引擎使用</title><summary type="text">1 课程简介 通过本课程熟悉业务规则引擎（BRE）的使用（本环境为Windows 2008 32位操作系统环境 + Visual Studio 2010 + BizTalk 210）2 准备工作 1. 熟悉BizTalk Schema,Orchestration相关开发技术3 演示 1. 创建BizTalk项目 2. 新建Schema，新建product(string类型),quantity(int类型),price(double类型)个字段，如下图所示 3. 创建Orchestration并配置相应的流程、消息及端口。 4. 打开规则管理器...</summary><published>2011-12-19T03:41:00Z</published><updated>2011-12-19T03:41:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2011/12/19/2293103.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2011/12/19/2293103.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1 课程简介&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;    &lt;p&gt;通过本课程熟悉业务规则引擎（BRE）的使用（本环境为Windows 2008 32位操作系统环境 + Visual Studio 2010 + BizTalk 210）&lt;/p&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;2 准备工作&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;    &lt;p&gt;1. 熟悉BizTalk Schema,Orchestration相关开发技术&lt;/p&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;3 演示&lt;/strong&gt;&lt;/p&gt;&lt;ol&gt;    &lt;p&gt;1. 创建BizTalk项目&lt;/p&gt;    &lt;p&gt;2. 新建Schema，新建product(string类型),quantity(int类型),price(double类型)个字段，如下图所示&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141138186.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image001" border="0" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141143792.png" width="159" height="108" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;3. 创建Orchestration并配置相应的流程、消息及端口。&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141154480.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/20111219114116119.png" width="481" height="383" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;4. 打开规则管理器&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141176630.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image003" border="0" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141184221.png" width="298" height="254" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;5. 在Version 1.0中新建IPad Price&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141183731.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image004" border="0" alt="clip_image004" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141191288.png" width="236" height="81" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;6. 在事实浏览器中打开项目中的Schema&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141199403.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image005" border="0" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141203057.png" width="288" height="191" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;7. 在条件表达式中添加相应的产品和数量的条件&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/20111219114121614.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141219044.png" width="528" height="196" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;8. 将Schema中的Price拖入在THEN操作窗中的ACTION操作下&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141229634.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image007" border="0" alt="clip_image007" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141225796.png" width="293" height="76" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;9. 保存当前版本，并且部署（保存之后即可在Orchestration查看到，但如果需要在运行时被执行的话则需要部署）。&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141234226.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image008" border="0" alt="clip_image008" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141231468.png" width="284" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;10. 修改orchestration，将CALL Rule形状拖入Orchestration中，点击获取相应的规则并设置相应的参数。&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141246866.png"&gt;&lt;img style="border: 0px currentColor; padding-top: 0px; padding-right: 0px; padding-left: 0px; display: inline;background-image: none;" title="clip_image009" border="0" alt="clip_image009" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191141253029.png" width="543" height="369" /&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;11. 生成并部署项目&lt;/p&gt;    &lt;p&gt;12. 在BizTalk控制台配置相应的输入输出端口&lt;/p&gt;    &lt;p&gt;13. 基于PO Schema生成的XML实例构造测试消息，查看当product字段为ipad并且quantity字段值大于 100时,price字段的值是否跟设定的一样。&lt;/p&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;/ol&gt;&lt;img src="http://www.cnblogs.com/cbcye/aggbug/2293103.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2011/12/19/2293103.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cbcye/archive/2011/12/19/2293092.html</id><title type="text">BizTalk2010动手实验（八）消息路由</title><summary type="text">1 课程简介通过本课程熟悉BizTalk消息由的机制2 准备工作1. 熟悉XML、XML Schema、XSLT等相关XML开发技术2. 新建BizTalk空项目3 演示3.1 动态消息路由1. 新建Schema，添加targetEndPoint及notes两字段并且升级为可分辨字段2. 新建Orchestration,构建流程图如下图所示3. 创建发送逻辑端口，在选择端口绑定类型时选择动态，Send Pipeine选择passthough管道4. 新建InMsg和OutMsg消息，其类型都为刚创建的Schema5. 将以下代码添加到构造消息表达式中，并设置构造消息表达式的构造消息为OutM.</summary><published>2011-12-19T03:37:00Z</published><updated>2011-12-19T03:37:00Z</updated><author><name>Gary Zhang</name><uri>http://www.cnblogs.com/cbcye/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cbcye/archive/2011/12/19/2293092.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cbcye/archive/2011/12/19/2293092.html"/><content type="html">&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1 课程简介&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;通过本课程熟悉BizTalk消息由的机制&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2 准备工作&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1. 熟悉XML、XML Schema、XSLT等相关XML开发技术&lt;/p&gt;&lt;p&gt;2. 新建BizTalk空项目&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3 演示&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.1 动态消息路由&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1. 新建Schema，添加targetEndPoint及notes两字段并且升级为可分辨字段&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136069698.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image001" border="0" alt="clip_image001" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/20111219113606287.png" width="162" height="73" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2. 新建Orchestration,构建流程图如下图所示&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136076798.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image002" border="0" alt="clip_image002" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136086025.png" width="443" height="376" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;3. 创建发送逻辑端口，在选择端口绑定类型时选择动态，Send Pipeine选择passthough管道&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136096440.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image003" border="0" alt="clip_image003" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136109604.png" width="576" height="452" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;4. 新建InMsg和OutMsg消息，其类型都为刚创建的Schema&lt;/p&gt;&lt;p&gt;5. 将以下代码添加到构造消息表达式中，并设置构造消息表达式的构造消息为OutMsg&lt;table border="1" cellspacing="0" cellpadding="0"&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td valign="top" width="568"&gt;            &lt;p&gt;OutMsg = InMsg;&lt;/p&gt;            &lt;p&gt;OutMsg.notes = &amp;quot;Dynamic Route by Orchestration&amp;quot;;&lt;/p&gt;            &lt;p&gt;Port_2(Microsoft.XLANGs.BaseTypes.Address)=OutMsg.targetEndPoint;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;6. 设置第一个接收形状的激活属性为true&lt;/p&gt;&lt;p&gt;7. 配置完成之后的流程图&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136143131.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image005" border="0" alt="clip_image005" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136186526.jpg" width="580" height="314" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;8. 生成并部署项目&lt;/p&gt;&lt;p&gt;9. 配置MessageRoute应用程序，绑定物理接收端口到Orchestration，接收端口的pipeline选择XMLReceive&lt;/p&gt;&lt;p&gt;10. 在MessageRoute项目文件夹中创建多个输出目录以进行测试,测试文件采用Schema生成的文件。消息内容如下所示：&lt;table border="1" cellspacing="0" cellpadding="0"&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td valign="top" width="568"&gt;            &lt;p&gt;&amp;lt;ns0:Root xmlns:ns0=&amp;quot;http://MessageRoute.Schema1&amp;quot;&amp;gt;&lt;/p&gt;            &lt;p&gt;&amp;lt;notes&amp;gt;notes_0&amp;lt;/notes&amp;gt;&lt;/p&gt;            &lt;p&gt;&amp;lt;targetEndPoint&amp;gt;file://D:\Samples\MessageRoute\Out1\File_%MessageID%.xml&amp;lt;/targetEndPoint&amp;gt;&lt;/p&gt;            &lt;p&gt;&amp;lt;/ns0:Root&amp;gt;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;11. 可以发现通过修改不同的输出目录，消息会自动发送到相应的目录。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.2 基于属性字段的路由&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1. 新添加属性Schema&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136225875.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image006" border="0" alt="clip_image006" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136268256.png" width="498" height="533" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2. 在属性字段中新增EndPointName的字段&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/20111219113626482.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image007" border="0" alt="clip_image007" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136275531.png" width="162" height="74" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;3. 在原有消息Schema中添加一个endPointName的字段，并将其升级为属性字段(升级前需要先选择属性字段的Schema)&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136284027.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image009" border="0" alt="clip_image009" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136313452.jpg" width="580" height="356" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;4. 生成并部署项目。&lt;/p&gt;&lt;p&gt;5. 新建一个发送端口，选择文件适配器，在发送端口的订阅位置可以看到新创建的属性类型，设置判断条件为&amp;#8221; MessageRoute.EndPointName == Out3&amp;#8221;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136328917.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image011" border="0" alt="clip_image011" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136331000.jpg" width="580" height="195" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;6. 使用Schema生成的测试消息进行测试，并将endPointName字段的属性值设置为out3。&lt;/p&gt;&lt;p&gt;7. 此时可以在适配器对应的目录里看到相应的输出消息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.3 Orchestration订阅&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1. 构造流程图如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136343259.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image012" border="0" alt="clip_image012" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136355833.png" width="195" height="383" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;2. 创建接收和发送逻辑端口，注意端口类型都选择Direct&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/20111219113640265.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image013" border="0" alt="clip_image013" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136414891.png" width="575" height="453" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136442646.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image014" border="0" alt="clip_image014" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136457762.png" width="574" height="454" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;3. 同样新建InMsg和OutMsg，两消息类型均为Schema_1。&lt;/p&gt;&lt;p&gt;4. 绑定InMsg到Receive, OutMsg到Send,将构造模块的构造消息选择为Outmsg&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136469497.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image016" border="0" alt="clip_image016" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136471581.jpg" width="580" height="308" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;5. 将以下代码添加到构造消息表达式中&lt;table border="1" cellspacing="0" cellpadding="0"&gt;    &lt;tbody&gt;        &lt;tr&gt;            &lt;td valign="top" width="568"&gt;            &lt;p&gt;OutMsg = InMsg;&lt;/p&gt;            &lt;p&gt;OutMsg.notes=&amp;quot;Direct Route From MessageBox&amp;quot;;&lt;/p&gt;            &lt;p&gt;OutMsg(MessageRoute.EndPointName)=&amp;quot;Out3&amp;quot;;&lt;/p&gt;            &lt;/td&gt;        &lt;/tr&gt;    &lt;/tbody&gt;&lt;/table&gt;&lt;/p&gt;&lt;p&gt;6. 右击Receive，点击编辑订阅表达式&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136488649.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image017" border="0" alt="clip_image017" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/20111219113649700.png" width="346" height="238" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;7. 在表达式编辑窗口中配置如下条件（注意：在Orchestration中配置订阅条件如是是字符串的需要加双引号）&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136504354.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image018" border="0" alt="clip_image018" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136504976.png" width="550" height="166" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;8. 生成、部署并配置Orchestration2,重启BizTalk实例&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136525457.jpg"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="clip_image020" border="0" alt="clip_image020" src="http://images.cnblogs.com/cnblogs_com/cbcye/201112/201112191136535589.jpg" width="580" height="403" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;9. 使用3.2的测试数据，将endPointName字段改为Orch。当数据被BizTalk接收之后将会在Out3文件夹中出现相应的数据。如果文件夹中同时出现多个文件，是因为与3.1的Orchestration实例订阅条件相冲突。可以先将Orchestration1执行Unenlist操作。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cbcye/aggbug/2293092.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cbcye/archive/2011/12/19/2293092.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
