<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_深蓝居</title><subtitle type="text">关注SQL Server 2008,关注数据模型，开始BI生涯</subtitle><id>http://feed.cnblogs.com/blog/u/5526/rss</id><updated>2012-01-10T10:07:12Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/5526/rss"/><entry><id>http://www.cnblogs.com/studyzy/archive/2012/01/10/2318400.html</id><title type="text">网上买火车票网站的Bug，实在是留给程序员的福利</title><summary type="text">年关将近，又到了春运时间，火车票自然是这段期间最紧俏的资源了。与以往几十年不同的是，今年开通了网络购票、电话订票和真正的实名制功能。其中最让码农眼前一亮的就是网络购票功能了。写了那么多年的程序，终于有用武之地了。</summary><published>2012-01-10T10:02:00Z</published><updated>2012-01-10T10:02:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2012/01/10/2318400.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2012/01/10/2318400.html"/><content type="html">&lt;p&gt;年关将近，又到了春运时间，火车票自然是这段期间最紧俏的资源了。与以往几十年不同的是，今年开通了网络购票、电话订票和真正的实名制功能。其中最让码农眼前一亮的就是网络购票功能了。写了那么多年的程序，终于有用武之地了。&lt;/p&gt;&#xD;
&lt;p&gt;我作为一个码农，写这方面的程序，算下来已经有7年历史了吧。最早的时候是在大学做选课程序（准确的说应该是抢课程序），后来帮同学做刷票程序，再到后来做WebGame的外挂，各种抓包分析程序，一个个网络应用程序还是让我记忆犹新。现在买火车票也能够通过网络实现，那么当然也可以写个程序实现登录、查询车票、下订单这些功能了。&lt;/p&gt;&#xD;
&lt;p&gt;最近项目刚上线，Bug一堆，工作比较忙，再加上我是坐飞机回家，不买火车票，所以也没有那么大的动力和那么多的时间来开发这个程序了。程序写了一半，登录实现，查询实现，就剩下下订单功能和支付功能了，不过支付功能我觉得可能有难度，具体还没有试过，毕竟这东西是需要在IE下真的付款，然后抓包分析的，所以也不好调试。&lt;/p&gt;&#xD;
&lt;p&gt;我的程序虽然没有完成，不过网上已经有不少码农放出了自己完成的程序，比如这几个&lt;/p&gt;&#xD;
&lt;p&gt;GoHome：&lt;a href="http://code.google.com/p/go-home/"&gt;http://code.google.com/p/go-home/&lt;/a&gt; &lt;br /&gt;德广火车票助手：&lt;a href="http://www.appinn.com/12306-auto-login-client/"&gt;http://www.appinn.com/12306-auto-login-client/&lt;/a&gt; &lt;br /&gt;12306 订票助手：&lt;a href="https://github.com/zzdhidden/12306"&gt;https://github.com/zzdhidden/12306&lt;/a&gt; &lt;br /&gt;12306.cn 网络购票助手：&lt;a href="http://www.u-tide.com/fish/soft/44/"&gt;http://www.u-tide.com/fish/soft/44/&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;等等。&lt;/p&gt;&#xD;
&lt;p&gt;我个人比较推荐的是12306 订票助手：&lt;a href="https://github.com/zzdhidden/12306"&gt;https://github.com/zzdhidden/12306&lt;/a&gt; 这个程序其实很简单，是基于JQuery的一个JS文件，在Chrome中运行效果很好，正好我用的也是Chrome。&lt;/p&gt;&#xD;
&lt;p&gt;这些程序其实原来都是差不多的，主要的还是利用了12306系统中的一个Bug，实现了不断重试提交数据，直到成功。这个Bug就是在用户提交验证码进行比对的时候，没有在比对后重置验证码，导致接下来重新提交数据时，使用同一个验证码就验证通过了。这个Bug其实修复起来很简单，我在3年多前的博客中就已经提到过该Bug和修正，参见：&lt;a href="http://www.cnblogs.com/studyzy/archive/2008/06/04/1213192.html"&gt;http://www.cnblogs.com/studyzy/archive/2008/06/04/1213192.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;另外还有一个问题就是现在的验证码实在太简单了，没有什么混淆，很容易通过程序识别出来。&lt;/p&gt;&#xD;
&lt;p&gt;毕竟这也是铁道部第一次做电子商务，虽然有很多不足之处，但是能够主动改变现状，还是让人感到欣慰。希望网络购票的这个Bug一直保留着，下次我买票的时候也可以利用这个Bug刷票，这真是铁道部留给广大程序员门的一点福利！最终大家有家都能回！&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/2318400.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2012/01/10/2318400.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2011/11/19/2255490.html</id><title type="text">使用SharpZipLib压缩打包多个内存中的文件</title><summary type="text">SharpZipLib是C#写的开源压缩解压缩组件，最近项目上遇到一个需求：根据用户选择的项目生成CSV文件并下载，后来改为同时生成2个CSV文件下载下来。想到的解决办法就是将2个CSV文件打包成一个Zip文件，然后供用户下载。 SharpZipLib可以通过很简单的代码就将多个文件打包成一个zip包，形如： using (ZipFile zip = ZipFile.Create(@&amp;quot;E:\t...</summary><published>2011-11-19T12:31:00Z</published><updated>2011-11-19T12:31:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2011/11/19/2255490.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2011/11/19/2255490.html"/><content type="html">SharpZipLib是C#写的开源压缩解压缩组件，最近项目上遇到一个需求：根据用户选择的项目生成CSV文件并下载，后来改为同时生成2个CSV文件下载下来。想到的解决办法就是将2个CSV文件打包成一个Zip文件，然后供用户下载。  &lt;p&gt;SharpZipLib可以通过很简单的代码就将多个文件打包成一个zip包，形如：&lt;/p&gt;  &lt;p&gt;using (ZipFile zip = ZipFile.Create(@&amp;quot;E:\test.zip&amp;quot;))   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.BeginUpdate();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; ZipEntry e=new ZipEntry(&amp;quot;a&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //添加文件    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.Add(@&amp;quot;E:\a.csv&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.Add(@&amp;quot;E:\b.csv&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.CommitUpdate();    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;但是这里的问题是，zip.Add方法允许添加文件，但是不允许直接添加字符串或者byte[]，但是我们做的是WebApplication，不希望是在Web服务器上把两个CSV文件生成后保存到硬盘上，然后调用上面的方法压缩硬盘上的文件。我们的文件应该都是在内存中生成，在内存中打包，然后直接把生成的zip文件的二进制流返回给用户，让用户下载。幸好该方法提供了一个IStaticDataSource接口参数，该接口有个返回Stream的GetSource方法，我们可以实现该接口，从而支持字符串文件的打包。&lt;/p&gt;  &lt;p&gt;class StringDataSource : IStaticDataSource   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; public string Str { get; set; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public StringDataSource(string str)   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; this.Str = str;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; } &lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160; public Stream GetSource()   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; {    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Stream s = new MemoryStream(Encoding.Default.GetBytes(Str));    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return s;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; }    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;实现了该接口后，那么我们压缩两个String成两个文本文件的包，代码就十分简单了：&lt;/p&gt;  &lt;p&gt;using (ZipFile zip = ZipFile.Create(@&amp;quot;E:\test2.zip&amp;quot;))   &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.BeginUpdate();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; StringDataSource d1 = new StringDataSource(&amp;quot;this a test1&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; StringDataSource d2 = new StringDataSource(&amp;quot;压缩文件2的内容&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //添加文件    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.Add(d1, &amp;quot;Test1.txt&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.Add(d2, &amp;quot;Test2.txt&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.CommitUpdate();    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;上面的代码还是在硬盘上生成了test2.zip，幸好ZipFile.Create方法支持Stream参数，于是可以将代码改为：&lt;/p&gt;  &lt;p&gt;MemoryStream stream=new MemoryStream();   &lt;br /&gt;using (ZipFile zip = ZipFile.Create(stream))    &lt;br /&gt;{    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.BeginUpdate();    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; StringDataSource d1 = new StringDataSource(&amp;quot;this a test1&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; StringDataSource d2 = new StringDataSource(&amp;quot;压缩文件2的内容&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; //添加文件    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.Add(d1, &amp;quot;Test1.txt&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.Add(d2, &amp;quot;Test2.txt&amp;quot;);    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; zip.CommitUpdate();    &lt;br /&gt;}&lt;/p&gt;  &lt;p&gt;然后将stream继续Render给用户即可。&lt;/p&gt;  &lt;p&gt;同样的方式，如果是在内存中生成了二进制文件，也可以使用实现IStaticDataSource接口的方式来打包。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/2255490.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2011/11/19/2255490.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2011/08/16/2140675.html</id><title type="text">对象的继承关系在数据库中的实现方式和PowerDesigner设计</title><summary type="text">在面向对象的编程中，使用对象的继承是一个非常普遍的做法，但是在关系数据库管理系统RDBMS中，使用的是外键表示实体（表）之间的关系，那么对于继承关系，该怎么在RDBMS中表示呢？一般来说有3种实现方式： Concrete Table Inheritance（具体表继承） Single Table Inheritance（单表继承） Class Table Inheritance（类表继承） 比如在...</summary><published>2011-08-16T07:30:00Z</published><updated>2011-08-16T07:30:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2011/08/16/2140675.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2011/08/16/2140675.html"/><content type="html">&lt;p&gt;在面向对象的编程中，使用对象的继承是一个非常普遍的做法，但是在关系数据库管理系统RDBMS中，使用的是外键表示实体（表）之间的关系，那么对于继承关系，该怎么在RDBMS中表示呢？一般来说有3种实现方式：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Concrete Table Inheritance（具体表继承）&lt;/li&gt;    &lt;li&gt;Single Table Inheritance（单表继承）&lt;/li&gt;    &lt;li&gt;Class Table Inheritance（类表继承）&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;比如在一个教务系统中，有老师学生2个对象，这两个对象都是“人”对象的子类，所以我们可以建立一个Person表，该表有人的公共属性：姓名、性别等，还有就是数据的唯一标识，一个ID。而教师对象有教师的特有属性，比如职称，学生有学生的特有属性，比如学号。所以我们可以建立Person、Teacher、Student3个表，其关系在PowerDesigner中如图所示：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161529499985.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161529538750.png" width="411" height="224" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;1.具体表继承。&lt;/p&gt;  &lt;p&gt;不建立父对象，将父对象的所有属性转移到子对象中，为每个子对象建立对于的表。如果使用这种方法，那么就只需要建立Teacher表和Student表，不需要Person表，在PowerDesigner中，双击继承节点，打开属性窗口，取消“Generate Parent”选项，选中“Generate children”并选择“Inherit all attributes”，如图所示：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201108/20110816152954537.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161529566783.png" width="521" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;生成的数据库表将如图所示：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161529572781.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161529577175.png" width="383" height="72" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;2.单表继承。&lt;/p&gt;  &lt;p&gt;在一个宽表中列出所有父对象和子对象的属性，同时用一个标识列表示该行数据存储的是哪个子类的数据。在PowerDesigner中，修改继承节点的属性，取消“Generate children”，选中“Generate parent”，然后在下面添加一个标识列，叫PersonType，如图所示：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161529591993.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161530006288.png" width="521" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;生成的数据库表，在一个宽表中表示如图所示：&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161530015383.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161530029188.png" width="180" height="98" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;可以看到Person中的列集成了Person、Teacher、Student这3个表的所有列，同时还多了一个列PersonType，这个列就是用来区分这行数据到底表示的是一个学生还是一个老师。&lt;/p&gt;  &lt;p&gt;3.类表继承。&lt;/p&gt;  &lt;p&gt;对父对象和每个子对象建立一个对应的表，然后在子表中设置该子表的主键为与父表关联的外键。在PowerDesigner中，对于继承节点的属性，允许生成父和子表，另外，将“Inherit only primary attributes”选中。如图所示：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161530043450.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201108/20110816153008479.png" width="521" height="373" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;生成的数据库表如图所示：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161530181026.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201108/201108161530197306.png" width="448" height="261" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;这里可以看到，Teacher的主键和Student的主键同时又是该表的外键，连接到Person表。&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;PS：如果使用NHibernate进行编程，那么可以参考&lt;a href="http://www.cnblogs.com/RicCC/archive/2011/01/26/897880.html" target="_blank"&gt;这篇文章&lt;/a&gt;，介绍了NHibernate对这三种继承的配置方法。&lt;/p&gt;  &lt;p&gt;如果使用Entity Framework进行编程，那么可以参考&lt;a href="http://www.cnblogs.com/Barton131420/archive/2009/09/04/1560237.html" target="_blank"&gt;这篇文章&lt;/a&gt;。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/2140675.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2011/08/16/2140675.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2011/07/10/2102078.html</id><title type="text">深蓝词库转换1.5发布</title><summary type="text">经过了漫长的修改，终于把深蓝词库转换1.5完成了。这次修改注意包括以下改进： 1.增加百度输入法bdict词库导出的功能。 百度输入法也推出了自己的分类词库，词库格式为bdict，这个词库格式比较简单，用户如果喜欢某个词库，可以将该百度分类词库转换为自己习惯的输入法。比如我们觉得百度分类词库中的动漫作品词汇这个词库不错，但是用的又是搜狗输入法，所以需要将该词库转换为搜狗输入法。 2.增加拖拽选择词库功能。 用户在文件夹中选中单个或者多个词库文件，然后拖拽到窗口上方，系统将会把用户选中的文件显示在词库路径文本框中。 3.增加命令行支持。 有些高级用户需要使用命令行或者批处理的方式，该功能可以帮助</summary><published>2011-07-09T16:32:00Z</published><updated>2011-07-09T16:32:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2011/07/10/2102078.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2011/07/10/2102078.html"/><content type="html">&lt;p&gt;经过了漫长的修改，终于把深蓝词库转换1.5完成了。这次修改注意包括以下改进：&lt;/p&gt;  &lt;p&gt;1.增加百度输入法bdict词库导出的功能。&lt;/p&gt;  &lt;p&gt;百度输入法也推出了自己的分类词库，词库格式为bdict，这个词库格式比较简单，用户如果喜欢某个词库，可以将该百度分类词库转换为自己习惯的输入法。比如我们觉得百度分类词库中的动漫作品词汇这个词库不错，但是用的又是搜狗输入法，所以需要将该词库转换为搜狗输入法。&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201107/201107100032246066.png" width="557" height="449" /&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;输入-?可以查看使用方法和词库的简码。&lt;/p&gt;  &lt;p&gt;比如要将一个百度的分类词库转换为拼音加加的词库，那么对应的命令行为：&lt;/p&gt;  &lt;p&gt;深蓝词库转换.exe -i:bdict F:\a.bdict -o:pyjj F:\jj.txt&lt;/p&gt;  &lt;p&gt;4.增加触宝输入法词库导出功能。&lt;/p&gt;  &lt;p&gt;这个功能其实是1.4版的功能，但是我分析了很久，也只是实现了将触宝手机输入法的备份词库文件解析出来，而将其他词库格式生成触宝输入法备份词库却有点问题，生成后可能导致触宝输入法报错，所以我最终没有把生成触宝输入法词库的功能放出来。&lt;/p&gt;  &lt;p&gt;QQ分类词库的格式还是没分析出来，所以还是没办法支持qpyd格式QQ分类词库的导出。如果有网友有办法的话，还希望能够提供点帮助。&lt;/p&gt;  &lt;p&gt;1.6版还不知道该做些什么了。&lt;/p&gt;&lt;p&gt;深蓝词库转换是一个开源程序，项目网站地址：&lt;a href="http://code.google.com/p/imewlconverter/"&gt;http://code.google.com/p/imewlconverter/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;1.5版下载地址为：&lt;a href="http://imewlconverter.googlecode.com/files/imewlconverter_1_5.zip"&gt;http://imewlconverter.googlecode.com/files/imewlconverter_1_5.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/2102078.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2011/07/10/2102078.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2011/06/13/2079758.html</id><title type="text">如何将数据库从SQL Server迁移到MySQL</title><summary type="text">一、迁移Database Schema。 首先使用Sybase Powerdesigner的逆向工程功能，逆向出SQL Server数据库的物理模型。具体操作是在Powerdesigner中选择“File”，“Reverse Engine”再选择Database，将DBMS选择为SQL Server，如图： 然后选择数据源，也就是要具体连接到的SQL Server数据库服务器，然后选择要逆向的数据...</summary><published>2011-06-13T07:32:00Z</published><updated>2011-06-13T07:32:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2011/06/13/2079758.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2011/06/13/2079758.html"/><content type="html">&lt;p&gt;&lt;strong&gt;一、迁移Database Schema。&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;首先使用Sybase Powerdesigner的逆向工程功能，逆向出SQL Server数据库的物理模型。具体操作是在Powerdesigner中选择“File”，“Reverse Engine”再选择Database，将DBMS选择为SQL Server，如图：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531228698.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image001[11]" border="0" alt="clip_image001[11]" src="http://images.cnblogs.com/cnblogs_com/studyzy/201106/20110613153122716.png" width="550" height="290" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然后选择数据源，也就是要具体连接到的SQL Server数据库服务器，然后选择要逆向的数据库名，比如选中“WSS_Content_80”如图所示：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531233847.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image002[4]" border="0" alt="clip_image002[4]" src="http://images.cnblogs.com/cnblogs_com/studyzy/201106/20110613153124881.png" width="494" height="348" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;单击确定即可生成物理模型图：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531251536.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image004[4]" border="0" alt="clip_image004[4]" src="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531265539.jpg" width="554" height="485" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然后单击“Database”菜单下的Change Current DBMS修改当前的DBMS，改为MySQL 5.0，&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531263097.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image005[4]" border="0" alt="clip_image005[4]" src="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531278703.png" width="400" height="334" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;单击确定后即可生成MySQL的物理模型 然后单击“Database”菜单下的“Generate Database”生成数据库脚本文件。&lt;/p&gt;  &lt;p&gt;接下来是手工修改下生成的脚本的内容。&lt;/p&gt;  &lt;p&gt;将其中的dbo.全部替换成空&lt;/p&gt;  &lt;p&gt;将create user这样的语句删除掉。&lt;/p&gt;  &lt;p&gt;如果有些字符在MySQL中是关键字，那么必须使用“`”（键盘上数字1左边那个符合）符合框起来。&lt;/p&gt;  &lt;p&gt;加上MySQL所需要的存储引擎比如每个建表语句后跟上：&lt;/p&gt;  &lt;p&gt;ENGINE = INNODB CHARACTER SET utf8 COLLATE utf8_general_ci;&lt;/p&gt;  &lt;p&gt;将生成的脚本在MySQL中去运行一次即可创建数据库。&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;二、迁移数据内容&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;数据内容只能通过生成INSERT语句的方式来做。&lt;/p&gt;  &lt;p&gt;首先使用SSMS的“生成脚本”功能（在数据库上右键，选择“任务”“生成脚本”选项），可以为SQL Server数据库中的数据生成插入脚本。&lt;/p&gt;  &lt;p&gt;首先选择要迁移数据的表，这里我们全选所有的表：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531284658.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image007[4]" border="0" alt="clip_image007[4]" src="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531287788.jpg" width="554" height="474" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然后单击下一步，选择将脚本保存到新的查询窗口：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531298967.jpg"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image009[4]" border="0" alt="clip_image009[4]" src="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531308510.jpg" width="554" height="474" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;单击“高级”选项，在高级选项窗口中选择“要编写脚本的数据的类型”为仅限数据：&lt;/p&gt;  &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531314988.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="clip_image010[4]" border="0" alt="clip_image010[4]" src="http://images.cnblogs.com/cnblogs_com/studyzy/201106/201106131531311150.png" width="471" height="383" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;然后“确定”再下一步下一步即可生成INSERT脚本文件。&lt;/p&gt;  &lt;p&gt;修改生成的脚本文件，主要有以下几项修改：&lt;/p&gt;  &lt;p&gt;使用批量替换的方式去掉[ ]这是SQL Server的符合，在MySQL中不用这个。&lt;/p&gt;  &lt;p&gt;使用批量替换的方式去掉dbo.&lt;/p&gt;  &lt;p&gt;有些单词在MySQL中是关键字的，那么需要使用“`”引起来。&lt;/p&gt;  &lt;p&gt;关于Datetime类型的数据，需要手工修改下，SQL Server默认生成的是这样的语句，在MySQL中是没办法解析的：&lt;/p&gt;  &lt;p&gt;CAST(0x00009EEF00000000 AS DateTime)&lt;/p&gt;  &lt;p&gt;为每一行添加一个;表示一个插入语句结束。这个分号在SQL Server中可以不需要，但是在MySQL中是必须的。简单的方法是使用高级的文本编辑器（比如Notepad++），将\r\n替换为;\r\n即可。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/2079758.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2011/06/13/2079758.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2011/05/31/2064820.html</id><title type="text">NHibernate中对同一个对象的Lazyload要设置一致</title><summary type="text">在NHibernate中出于性能的考虑，经常使用Lazyload的方式来加载关联的对象，关于什么是Lazyload，以及怎么使用，可以参见博客园中的文章，比如：http://www.cnblogs.com/lyj/archive/2008/10/28/1321494.html 常用NHibernate.ByteCode.Castle动态代理来实现Lazyload，使用该程序集会在运行时创建实体对应...</summary><published>2011-05-31T08:26:00Z</published><updated>2011-05-31T08:26:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2011/05/31/2064820.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2011/05/31/2064820.html"/><content type="html">&lt;p&gt;在NHibernate中出于性能的考虑，经常使用Lazyload的方式来加载关联的对象，关于什么是Lazyload，以及怎么使用，可以参见博客园中的文章，比如：&lt;a href="http://www.cnblogs.com/lyj/archive/2008/10/28/1321494.html"&gt;http://www.cnblogs.com/lyj/archive/2008/10/28/1321494.html&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;常用NHibernate.ByteCode.Castle动态代理来实现Lazyload，使用该程序集会在运行时创建实体对应的代理类，如果实体使用了继承关系，并通过NHibernate来映射，那么动态代理类在类型转换时会有问题。&lt;/p&gt;  &lt;p&gt;比如在C#中定义了一个Node类，然后有个State类继承自Node类，然后有Flow.Node引用了这个类，同时我还在Task.Node中引用了这个类。并且在默认情况下启用了Lazyload。在通过Flow对象获得Node对象时，会返回'Castle.Proxies.NodeProxy'对象，而这个对象是没办法转换成State对象的，所以会抛出如下的异常：&lt;/p&gt;  &lt;p&gt;Unable to cast object of type 'Castle.Proxies.NodeProxy' to type 'Xxx.Core.Model.Definition.State'.&lt;/p&gt;  &lt;p&gt;那么怎么办呢，只有不使用Lazyload，所以我将Flow.Node的加载方式改为立即加载，然后这个异常就没有了。但是今天在调用另外的方法，然后在调用Flow.Node时，又出现了这个异常，这让我十分郁闷，我明明指定了Flow.Node是立即加载的，那么怎么还是会被系统转换为NodeProxy了呢？&lt;/p&gt;  &lt;p&gt;经过研究发现，应该是Task.Node没有被设置为立即加载的原因。我在调用Flow.Node之前，调用了Task对象，所以NHibernate根据Task的Mapping设置，将Node设置为动态代理类，同时将Node缓存到了Session中，然后再调用Flow.Node时，系统就会先从缓存中查找是否有对应的Node对象，结果正好有NodeProxy的缓存，所以就直接返回NodeProxy给Flow.Node了，系统根本没有检查Flow.Node是不是立即加载还是懒加载。&lt;/p&gt;  &lt;p&gt;所以要解决这个异常的话，有两个办法，一种是将Task.Node也设置成为立即加载，那么就不会有NodeProxy对象在缓存中。另外一种办法就是不在Task中引用Node对象，我采用的是第二种方法，在Task中，其实我只需要Task.NodeId就够了，不需要再加载Node对象进来。&lt;/p&gt;  &lt;p&gt;总的来说，如果在NHibernate中用到了继承类，如果同时用到了Lazyload，那么在转换类型时就可能抛出异常。解决办法就是将Lazyload取消，改为立即加载。如果有多个实体引用了该对象，那么就需要将这个对象的引用的Lazyload方式设置为一致的，对不使用Lazyload或者减少对对象的引用。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/2064820.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2011/05/31/2064820.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2011/05/20/2051612.html</id><title type="text">在企业应用开发中遵循开源协议</title><summary type="text">最近看到一个关于开源协议的图，想到我们平时在企业应用开发中也在大量使用开源软件，那么我们应该怎么对待这些开源软件呢，所以简单的写下了这篇博客。 在企业应用开发中，为了提高开发效率，经常可能会用到一些开源的软件、项目、组件。在使用这些开源项目的时候，必须要先看好其开源协议，免得被Challenge。网上有很多文章介绍各种开源协议以及其进行比较的，我就不在此老生常谈了，我只说是该怎么用。 这里指的企业...</summary><published>2011-05-19T18:10:00Z</published><updated>2011-05-19T18:10:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2011/05/20/2051612.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2011/05/20/2051612.html"/><content type="html">&lt;p&gt;最近看到一个关于开源协议的图，想到我们平时在企业应用开发中也在大量使用开源软件，那么我们应该怎么对待这些开源软件呢，所以简单的写下了这篇博客。&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201105/201105200209347010.png" width="793" height="483" /&gt;&lt;/p&gt;  &lt;p&gt;在企业应用开发中，为了提高开发效率，经常可能会用到一些开源的软件、项目、组件。在使用这些开源项目的时候，必须要先看好其开源协议，免得被Challenge。网上有很多文章介绍各种开源协议以及其进行比较的，我就不在此老生常谈了，我只说是该怎么用。&lt;/p&gt;  &lt;p&gt;这里指的企业应用开发，主要是希望实现尽量闭源以保护自己的知识成果，尽量免费以降低成本。&lt;/p&gt;  &lt;p&gt;对于Apache Licence、BSD、MIT这几种协议的开源项目，可以直接基于项目的源代码进行二次开发，也可以引用项目编译出来的Dll或其他，这些协议都是对企业友好的，我们的项目不需要开源，不需要付钱购买许可。只需要在版权声明文档中注明原项目的License信息。&lt;/p&gt;  &lt;p&gt;对于LGPL，其要求是对源代码的修改需要开源，但是只是引用的话就可以不用开源。所以一般我们直接使用LGPL协议的程序集，而不使用其源代码进行二次开发，比如我们常用使用的NHibernate就是LGPL协议的，只需要在开发中引用NHibernate程序集就可以了，我们的代码仍然是闭源的。但是这里有一个问题是，如果现有的LGPL协议的开源项目能够满足我们的大部分需求，但是仍然有一小部分需求必须要修改源代码，或者原项目中有Bug，我们必须要修改源代码进行修正。对于这种必须修改源代码的情况，我的做法是基于该源代码，专门新建一个项目，在这个项目中补充我们需要的功能和修复发现的Bug，然后将这个项目以LGPL协议开源并将项目编译好的Dll用于我们的企业应用开发中。这样既满足了我们必须修改源代码的需求，也保护了我们自己的项目，同时仍然满足其协议的要求。&lt;/p&gt;  &lt;p&gt;总之，LGPL协议主要还是以类库的方式使用，不建议在LGPL协议的项目上直接进行二次开发。在不得已必须修改开源项目源代码时新建一个开源项目，在该项目上进行修改。&lt;/p&gt;  &lt;p&gt;MPL也是和LGPL差不多，对于类库的引用是比较友好的，但是要是对源代码进行了二次开发，那么修改后的版权就归原MPL项目的作者了，所以处理方法也是在必须修改源代码的情况下，新建一个开源项目来修改，修改好后以类库的形式引用。另外MPL需要对修改之处提供说明文档。&lt;/p&gt;  &lt;p&gt;接下来说说GPL协议，这是个对企业不友好的协议，其变态之处在于，你哪怕是引用了GPL协议的类库，那么你的项目也必须开源。所以在企业应用中，能不用GPL的就尽量不用GPL的，大家说GPL协议像是病毒，所有使用了GPL项目的新项目都被传染成了开源的GPL项目。所以对于病毒，我们想不被传染，变成开源的GPL项目，处理方法除了尽量避免使用GPL外，如果必须使用，找不到合适的替代产品，那么我们就应该尽量隔离使用GPL项目的那个模块。比如我们的项目有10个模块，而其中有1个模块要使用GPL项目，那么可以尽量把我们的项目拆分成2个项目，一个项目是完全闭源的包含9个模块的项目，另一个项目是开源的GPL项目。这样至少可以隔离开GPL与我们其他不相关模块的代码，免得被传染。&lt;/p&gt;  &lt;p&gt;另外还有一个隔离办法是将GPL项目与闭源项目并列，不存在引用关系。比如A项目中需要使用到GPL项目B，那么我们可以先建立项目A1，在其中完成我们的核心逻辑处理，然后以闭源的形式发布A1，接下来再建立开源项目A，A引用了项目A1和B，将这两个项目结合起来完成相应的功能。总之尽量减少对GPL项目的使用范围，做到最低限度的开源，满足企业应用开发的需要。&lt;/p&gt;  &lt;p&gt;PS：所有的开源协议列表：&lt;a href="http://www.opensource.org/licenses/alphabetical"&gt;http://www.opensource.org/licenses/alphabetical&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/2051612.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2011/05/20/2051612.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2011/03/11/1981682.html</id><title type="text">Oracle数据库需要修改默认的Profiles，避免用户密码过期</title><summary type="text">今天Oracle数据库遇到一个问题，用户在用客户端登陆数据库时，抛出异常： ORA-00020: maximum number of processes (150) exceeded 从表面上看是Oracle连接的用户过多，但是这是一个开发环境，没有什么系统在使用，就我们几个开发人员用，之前从来没有出现过这个异常，所以也不知道怎么回事。于是在网上Google了一下，解决办法就是把数值设置的大一点，于是我重启了服务器，设置成了300，执行了如下命令。 SQL&amp;gt; alter system set processes=300 scope=spfile; 过来一会儿服务器又提示同样的异常了。于是</summary><published>2011-03-11T09:40:00Z</published><updated>2011-03-11T09:40:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2011/03/11/1981682.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2011/03/11/1981682.html"/><content type="html">&lt;p&gt;今天Oracle数据库遇到一个问题，用户在用客户端登陆数据库时，抛出异常：&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ORA-00020: maximum number of processes (150) exceeded&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;从表面上看是Oracle连接的用户过多，但是这是一个开发环境，没有什么系统在使用，就我们几个开发人员用，之前从来没有出现过这个异常，所以也不知道怎么回事。于是在网上Google了一下，解决办法就是把数值设置的大一点，于是我重启了服务器，设置成了300，执行了如下命令。&lt;/p&gt;  &lt;p&gt;SQL&amp;gt; alter system set processes=300 scope=spfile;&lt;/p&gt;  &lt;p&gt;过来一会儿服务器又提示同样的异常了。于是又重启了服务器，结果发现另外的一个刚才没有注意到的问题，informatica无法使用了。这个时候仔细研究，发现原来是informatica的密码过期了，可能是informatica不断的试着使用过期的密码去连接数据库，导致数据库的连接被占用完，所以其他系统都无法使用数据库了。&lt;/p&gt;  &lt;p&gt;原来，Oracle里面在创建用户是我使用的是Default Profile，而这个默认的配置里面，密码的过期策略是180天过期，一看我有好几个数据库用户都要在这两天内过期。解决的办法是修改Default Profile，把密码过期策略改为永不过期。执行的脚步就是：&lt;/p&gt;  &lt;div&gt;   &lt;pre&gt;ALTER PROFILE "&lt;span style="color: #8b0000"&gt;DEFAULT&lt;/span&gt;" LIMIT&#xD;
  SESSIONS_PER_USER UNLIMITED&#xD;
  CPU_PER_SESSION UNLIMITED&#xD;
  CPU_PER_CALL UNLIMITED&#xD;
  CONNECT_TIME UNLIMITED&#xD;
  IDLE_TIME UNLIMITED&#xD;
  LOGICAL_READS_PER_SESSION UNLIMITED&#xD;
  LOGICAL_READS_PER_CALL UNLIMITED&#xD;
  COMPOSITE_LIMIT UNLIMITED&#xD;
  PRIVATE_SGA UNLIMITED&#xD;
  FAILED_LOGIN_ATTEMPTS 10&#xD;
  PASSWORD_LIFE_TIME UNLIMITED&#xD;
  PASSWORD_REUSE_TIME UNLIMITED&#xD;
  PASSWORD_REUSE_MAX UNLIMITED&#xD;
  PASSWORD_LOCK_TIME 1&#xD;
  PASSWORD_GRACE_TIME 7&#xD;
  PASSWORD_VERIFY_FUNCTION NULL;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&#xD;
&lt;br /&gt;&#xD;
&#xD;
&lt;p&gt;对于已经密码过期的用户，那么就需要重新启用这个用户，设置下密码了，对于快过期而没有过期的用户，那么就不要修改了，都会变成永不过期。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;所以建议在安装Oracle数据库后，修改一下Default Profile，把密码改为不过期，毕竟以后很多服务都要不断的定期修改密码很麻烦的，虽然定期修改密码是个好习惯。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/1981682.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2011/03/11/1981682.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2011/01/19/1939270.html</id><title type="text">动态Linq的逻辑与和逻辑或的条件查询</title><summary type="text">最近在做一个数据检索的工作，对一个数据库中的宽表进行多个条件的检索。为了简单方便快捷的完成这个功能，我使用LINQ to SQL+ReportView的方式来完成。首先需要做的是一个查询界面和写一个数据库查询方法。用户在输入框中输入多个指标，将根据指标的格式生成LINQ的Where语句。这个很容易实现，比如输入“2003 北京 人口”，那么就根据空格将这个字符串分成3个字符串，第一个字符串格式是年份，所以用表中的Year字段进行匹配，第二个字段是地区，所以再用表中的Location进行匹配，第三个是指标，那么就用指标进行匹配，具体的C#代码就是：这个功能还简单，毕竟多个指标之间都是与的关系，但</summary><published>2011-01-19T07:54:00Z</published><updated>2011-01-19T07:54:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2011/01/19/1939270.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2011/01/19/1939270.html"/><content type="html">&lt;p&gt;最近在做一个数据检索的工作，对一个数据库中的宽表进行多个条件的检索。为了简单方便快捷的完成这个功能，我使用LINQ to SQL+ReportView的方式来完成。&lt;/p&gt;&#xD;
&lt;p&gt;首先需要做的是一个查询界面和写一个数据库查询方法。用户在输入框中输入多个指标，将根据指标的格式生成LINQ的Where语句。这个很容易实现，比如输入&amp;#8220;2003 北京 人口&amp;#8221;，那么就根据空格将这个字符串分成3个字符串，第一个字符串格式是年份，所以用表中的Year字段进行匹配，第二个字段是地区，所以再用表中的Location进行匹配，第三个是指标，那么就用指标进行匹配，具体的C#代码就是：&lt;/p&gt;&lt;pre&gt;public static List&amp;lt;Data2010&amp;gt; SearchData(string itemName)&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;&amp;nbsp;&amp;nbsp; using (DataClassesDataContext dc = new DataClassesDataContext())&lt;br /&gt;&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; var data = from d in dc.Data2010s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select d;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] items = itemName.Split(' ');&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; foreach (string item in items)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; if (IsYear(item))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; int year = Convert.ToInt32(item);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = data.Where(d =&amp;gt; d.Year ==year);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; else if (IsLocation(item))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; string location=item;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = data.Where(d =&amp;gt; d.Location == location);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; string keyword=item;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = data.Where(d =&amp;gt; d.Indicator.Contains(keyword));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; }&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; return data.ToList();&lt;br /&gt;&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; }&lt;/pre&gt;&#xD;
&lt;p&gt;这个功能还简单，毕竟多个指标之间都是与的关系，但是接下来如果要实现或的关系，那么又该怎么办呢？这个让我伤了几天的脑筋。比如说如果要搜索北京、上海、重庆的2000年和2010年的人口，那么该怎么查呢，我定义了一个简单的语法，如果是或关系的指标，那么就在小括号中用空格隔开。那么查询字符串就变成了：&lt;/p&gt;&#xD;
&lt;p&gt;(北京 上海 重庆)(2000 2010) 人口&lt;/p&gt;&#xD;
&lt;p&gt;这样括号之间是与的关系，括号内的内容是或的关系。&lt;/p&gt;&#xD;
&lt;p&gt;但是真正的难点是如何用LINQ来实现动态的或查询。我第一想到的是Dynamic LINQ（具体参见：&lt;a href="http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx" target="_blank"&gt;这里&lt;/a&gt;），这个在之前的项目中用过，特别强大，但是在这里用起来不是很方便，所以又想自己实现一套动态OR查询的方法，结果由于时间和能力有限，也没有做出来，最后终于找到一个很好的类库&lt;a href="http://www.albahari.com/nutshell/linqkit.aspx" target="_blank"&gt;LinqKit&lt;/a&gt;，这个类库中有一个&lt;/p&gt;&#xD;
&lt;p&gt;PredicateBuilder类，可以非常简单的实现动态的逻辑或查询。到网站中下载该类库并添加到项目中，然后引用命名空间，将我们的搜索方法改为如下内容：&lt;/p&gt;&#xD;
&lt;p&gt;public static List&amp;lt;Data2010&amp;gt; SearchData(string itemName) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; using (DataClassesDataContext dc = new DataClassesDataContext()) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var data = from d in dc.Data2010s &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; select d; &lt;/p&gt;&#xD;
&lt;p&gt;Regex r = new Regex(@"\([^\)]*\)"); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; var ms = r.Matches(itemName);//匹配括号及其中的内容 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (ms.Count &amp;gt; 0) &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;&amp;nbsp;&amp;nbsp; foreach (Match m in ms) &lt;br /&gt;&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; string name = m.Value.Substring(1, m.Value.Length - 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;&amp;nbsp;&amp;nbsp;&amp;nbsp; string[] items = name.Split(' '); //各个Item之间是or的关系 空格区分&lt;/p&gt;&#xD;
&lt;p&gt;var predicate = PredicateBuilder.False&amp;lt;Data2010&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (string item in items) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&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; predicate = predicate.Or(WhereCondition(item));//这里就是要用的动态逻辑或查询&lt;/p&gt;&#xD;
&lt;p&gt;//WhereCondition的定义是：Expression&amp;lt;Func&amp;lt;Data2010, bool&amp;gt;&amp;gt; WhereCondition(string item)，就是根据item的格式判断该用哪个字段进行匹配&lt;/p&gt;&#xD;
&lt;p&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;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = data.Where(predicate);//将最后的predicate传入Where函数，相当于是对括号之间进行逻辑与查询 &lt;br /&gt;&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; itemName = r.Replace(itemName, " ");//把括号给替换掉，再对括号外的内容进行逻辑与查询 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;&#xD;
&lt;p&gt;string[] items2 = itemName.Split(' '); &lt;/p&gt;&#xD;
&lt;p&gt;foreach (string item in items2) &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;&amp;nbsp;&amp;nbsp; data = data.Where(WhereCondition(item)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/p&gt;&#xD;
&lt;p&gt;return data.ToList(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;数据库查询函数已经完成，接下来就是要用ReportViewer来展现查询出来的结果绑定到报表中，具体代码如下：&lt;/p&gt;&#xD;
&lt;p&gt;private void BindData(string q) &lt;br /&gt;{ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var datas = DbOperation.SearchData(q); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ReportViewer1.LocalReport.DataSources.Clear(); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ReportViewer1.LocalReport.DataSources.Add(new Microsoft.Reporting.WebForms.ReportDataSource( &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "DataSet1", datas)); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.ReportViewer1.DataBind(); &lt;br /&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;这里的DataSet1就是对于rdlc报表的数据源，不能写错。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/studyzy/aggbug/1939270.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2011/01/19/1939270.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/studyzy/archive/2010/12/27/1918228.html</id><title type="text">使用C#通过Oracle.DataAccess连接Oracle，部署时需要注意版本问题</title><summary type="text">平时我们开发使用的是32位的PC机，所以安装的也是Oracle32位的客户端。但是一般服务器都是64位的，安装的也是64位的Oracle客户端，如果要部署使用Oracle.DataAccess连接Oracle的应用程序时，可能会遇到版本上的问题。  主要版本问题有两种，一种是32位版和64位版的问题，如果我们开发出来的应用是32位的，那么就必须使用32位的客户端，如果是64位的应用程序当然对应64位的客户端。这里需要注意：在64位的环境中使用VS开发Web程序，其运行的Web服务“WebDev.WebServer.exe”是32位的，所以如果要调试64位的Oracle连接程序，最好是部署到II</summary><published>2010-12-27T10:51:00Z</published><updated>2010-12-27T10:51:00Z</updated><author><name>深蓝</name><uri>http://www.cnblogs.com/studyzy/</uri></author><link rel="alternate" href="http://www.cnblogs.com/studyzy/archive/2010/12/27/1918228.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/studyzy/archive/2010/12/27/1918228.html"/><content type="html">&lt;p&gt;平时我们开发使用的是32位的PC机，所以安装的也是Oracle32位的客户端。但是一般服务器都是64位的，安装的也是64位的Oracle客户端，如果要部署使用Oracle.DataAccess连接Oracle的应用程序时，可能会遇到版本上的问题。&lt;/p&gt;  &lt;p&gt;主要版本问题有两种，一种是32位版和64位版的问题，如果我们开发出来的应用是32位的，那么就必须使用32位的客户端，如果是64位的应用程序当然对应64位的客户端。这里需要注意：在64位的环境中使用VS开发Web程序，其运行的Web服务&amp;#8220;WebDev.WebServer.exe&amp;#8221;是32位的，所以如果要调试64位的Oracle连接程序，最好是部署到IIS中，使用IIS来连接Oracle数据库。&lt;/p&gt;  &lt;p&gt;另一个版本问题是Oracle.DataAccess的版本号问题，我的本机就是32位的XP，安装了Oracle11gR2客户端后，在安装目录下的ODP.NET\bin\2.x目录中可以找到Oracle.DataAccess.dll文件，可以看到其版本号是：2.112.1.2。所以我开发出来的程序，引用的也是这个版本的库。&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201012/201012271851142427.png" width="442" height="314" /&gt; &lt;/p&gt;  &lt;p&gt;但是在64位下的Oracle.DataAccess.dll却不一样，安装后的版本是2.112.1.0，如图是Windows2008X64上的Oracle.DataAccess.dll。&lt;/p&gt;  &lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/studyzy/201012/201012271851157344.png" width="385" height="363" /&gt; &lt;/p&gt;  &lt;p&gt;现在把开发环境的程序发布部署到服务器上，就会抛出异常&lt;/p&gt;  &lt;p&gt;&lt;i&gt;未能加载文件或程序集&amp;#8220;Oracle.DataAccess, Version=2.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342&amp;#8221;或它的某一个依赖项。&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;或者是&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Could not load file or assembly 'Oracle.DataAccess, Version=2.112.1.2, Culture=neutral, PublicKeyToken=89b483f429c47342' or one of its dependencies. An attempt was made to load a program with an incorrect format之类的话。&lt;/p&gt;  &lt;p&gt;总之就是找不到对应的程序集。显然，这里系统找的是2.112.1.2版本的Oracle.DataAccess，而服务器上只有2.112.1.0版本的，所以才报错，解决办法就是在web.config中修改，在configSections节点结束之后增加如下内容：&lt;/p&gt;  &lt;p&gt;&amp;lt;runtime&amp;gt;   &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;assemblyBinding xmlns=&amp;quot;urn:schemas-microsoft-com:asm.v1&amp;quot;&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;dependentAssembly&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;assemblyIdentity name=&amp;quot;Oracle.DataAccess&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; publicKeyToken=&amp;quot;89B483F429C47342&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; culture=&amp;quot;neutral&amp;quot; /&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;bindingRedirect    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; oldVersion=&amp;quot;2.112.1.2&amp;quot;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; newVersion=&amp;quot;2.112.1.0&amp;quot;/&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/dependentAssembly&amp;gt;    &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/assemblyBinding&amp;gt;    &lt;br /&gt;&amp;lt;/runtime&amp;gt;&lt;/p&gt; 这样就可以让IIS调用2.112.1.0的Oracle.DataAccess了。添加这个配置后便可正常运行。   &lt;img src="http://www.cnblogs.com/studyzy/aggbug/1918228.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/studyzy/archive/2010/12/27/1918228.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
