<?xml version="1.0" encoding="gb2312"?>

<!-- RSS generated by oioj.net on 4/16/2004 ; 感谢LeXRus提供 RSS 2.0 文档; 此文件可自由使用，但请保留此行信息 --> 
<!-- Source download URL: http://blogger.org.cn/blog/rss2.asp       -->
<rss version="2.0">

<channel>
<title>davidxiem的博客</title>
<link>http://blogger.org.cn/blog/blog.asp?name=davidxiem</link>
<description>davidxiem的博客</description>
<copyright>blogger.org.cn</copyright>
<generator>W3CHINA Blog</generator>
<webMaster>webmaster@blogger.org.cn</webMaster>
<item>
<title><![CDATA[Suprisingly Good Marks]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=47711</link>
<author>davidxiem</author>
<pubDate>2009/12/9 8:18:34</pubDate>
<description><![CDATA[<a>　I got the IELTS result for 21/11/2009. The result is so much better than expected. I got Speaking 7.5 which I dont understand how this can happen! And listening is not bad, reading is not so good, writing lets me down a bit. I thought I was good. The next one is coming, I got to work harder, maybe I can get 7, who knows.<br></a>]]></description>
</item><item>
<title><![CDATA[Software Metric Issue]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=47272</link>
<author>davidxiem</author>
<pubDate>2009/10/18 8:12:37</pubDate>
<description><![CDATA[firstly, who knows anything about software metrics, more accurately, quality or design metrics and weighted factors?<br><br>Feel very depressed with my research progress, stuck for a long time with 2 inter-related issues.<br>1. How do I obtain a combination of data to fulfill a given constraint?<br>2. What model to describe relationship between every constraint? and how to determine the value of metrics. In other words, how to measure each one of them. <br>]]></description>
</item><item>
<title><![CDATA[又过了一天]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=47092</link>
<author>davidxiem</author>
<pubDate>2009/9/16 18:33:42</pubDate>
<description><![CDATA[<a>　日子就这么过去了，又是好久没来更新这里的BLOG，今天是第一天上班，工作的环境真的非常不一样，不过年轻人还是很多的，还能聊的起来，至于中老年人，他们相当的NICE,说外国人友善应该指得就是这种年纪的了。期待能跟他们更好的行处。<br><br>&nbsp;&nbsp; 前段时间（其实就是3天前）超迷XNA的，我要加油做更好的游戏，不过3D的游戏的引擎真的是很难一个人就做出来啊。为了这个我的RESEARCH PROJECT都荒废了。<br></a>]]></description>
</item><item>
<title><![CDATA[学做游戏]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=46966</link>
<author>davidxiem</author>
<pubDate>2009/8/30 21:50:25</pubDate>
<description><![CDATA[<a>　最近在学用XNA GAME STUDIO做游戏编程，这是我一直的梦想，发现这个东西看起来很容易，但是却涉及到许多知识，比想象中难多了。有空我会分享我所学到东西和例子代码。<br></a>]]></description>
</item><item>
<title><![CDATA[Software engineering needs a theory]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=46865</link>
<author>davidxiem</author>
<pubDate>2009/8/16 20:02:17</pubDate>
<description><![CDATA[<a>　刚看完了Ivar Jacobson的最近发表的文章，里面提到了"These are signs of immaturity. The discipline needs to become adult",指出了现在的software enginnering needs a theory,他将其称为kernel，而当现行的方法发生变化时，method described in kernel只要修改其中新的部分就好了，这些“部分”他将其称为"pratice"。<br><br>实际上他说的就是我们使用的术语method engineering呀，至于pratice,我觉得跟method fragments是非常接近的。</a>]]></description>
</item><item>
<title><![CDATA[MICROSOFT新的DSL语言]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=45401</link>
<author>davidxiem</author>
<pubDate>2009/5/13 15:41:36</pubDate>
<description><![CDATA[<a>　上周去了旁听JAOO,不是什么著名的会议,不过因为是第一次,还是让我觉得很新鲜.听了几个报告,第一个收获是关于微软将在2010推出的新DSL语言F#, 所谓的DSL语言就领域专用语言.MICROSOFT目前将该语言称为OSLO.它的目的就是为了写出来的代码能够领域专家能够读的懂,语法与我们目前的编程语言有挺大的差别.<br></a>]]></description>
</item><item>
<title><![CDATA[介绍SME和研究 心得]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=44594</link>
<author>davidxiem</author>
<pubDate>2009/4/9 20:21:11</pubDate>
<description><![CDATA[<div style="text-align: left;"><a>SME(Situational Method Engineering)是指针对一个特定的项目来建造方法的工程学。　<br><br>1 为什么我们需要特定的方法来做项目？<br>目前行业里头已经有许多流行的方法（或者称它们为过程模型），比如RUP, XP, 以及AGILE。但是这些方法我认为不但不能满足特定项目（还有不同企业）的特殊环境需求，而且都比较重量级。因此才会有许多工程学者反对“ONE SIZE FITS ALL”的方法。因此才会提出针对不同的项目进行建造方法的需求来。<br><br>2 </a><a>SME的发展<br>最早应该是在94年的时候提出来的，大部分著名的研究学者都分布在欧洲各国。<br><br>3 SME的建造方法<br>存在许多相近的观点。最具代表性的观点是使用方法碎片来建造方法。方法碎片指的是一个独立的方法部分。目前已经有许多成熟的碎片仓库存在，例如著名的OPEN群体所制作的碎片仓库有超过1000种碎片存在，它们可以根据项目的特殊性进行选择。然后组装成方法。碎片的生成，选择，以及组装都非常依赖于它们所使用的元模型，所以元模型技术直接影响到最终方法的质量。<br><br>4 可以参考的标准<br>目前直接相关的成熟比准有OMG的SPEM(Software Process Engineering MetaModel)以及ISO/IEC（国际标准化组织）的24744号标准。<br>另外部分相关的标准还有UML2.0,以及APDM.<br><br>5 SME面临的挑战<br>仍然有很多地方需要进行完善和补充，我感觉离真正统一认识并投入到行业使用还有一段时间。方比如需要什么样的建造规范，有哪些建造方法是好的？我们如何知道方法的质量，如何衡量方法是否适合该项目的特性。方法的建设目前非常依赖于方法工程师的水平。<br><br>6 我个人的研究心得和疑问<br>最近使用我能了解的手段查了一下国内的研究水平，发现基本在软件工程及软件开发方法的研究可以说是空白的。我现在对于方法碎片的理解还有偏差，比如为什么大部分文献所说的只有产品碎片和</a><a>过程</a><a>碎片两种，但是在设计的元模型里头却包含了5种概念，分别是模型语言，制造者，产品，过程，阶段。方法的采纳以及重用。还需要阅读更多的相关资料来解决以上的问题。在这次阅读的过程中，终于体会到UML出现的动机是什么了，原来研究者之间对于概念和术语的使用冲突真的是非常严重的，每一个词语可以有无数种相近的解释。<br><br>对SME或者软件方法感兴趣的人欢迎发EMAIL来讨论：davidxiem@hotmail.com<br><br><span style="font-size: 10pt; font-family: &quot;Times New Roman&quot;,&quot;serif&quot;;" lang="EN-GB"></span></a></div>]]></description>
</item><item>
<title><![CDATA[A summary of SME]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=43731</link>
<author>davidxiem</author>
<pubDate>2009/3/12 8:31:15</pubDate>
<description><![CDATA[<a>　<font face="'PrimaSans BT,Verdana,sans-serif'">SME is a approach to construct a software development process for specific situation.It can help organization to cut the cost of producing their system.The process of construction is done by selected building blocks from a methodbase. These building blocks are called "method fragments" or "method chunks". They can be&nbsp; abstracted from existing methods, e.g OMT,OOSE, or instantated from a class in a standardized metamodel.The metamodel of ISO 24744 or OPF defined method fragments sperately(process fragments and prodcut fragments).No standarized techniques and guidelines have been established to how to select and assemble these fragments. <br><br>P.S SME stands for Situational Method Engireering. It's my research topic this semester, hence, I wrote this summary to track changes of my thought.Hope I <br>will do better and better in this field.<br></font>
</a><table border="0" cellpadding="2" cellspacing="1" width="100%">
<tbody><tr><td><br></td></tr></tbody></table>]]></description>
</item><item>
<title><![CDATA[tips to improve english]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=42661</link>
<author>davidxiem</author>
<pubDate>2009/1/31 6:32:35</pubDate>
<description><![CDATA[<ul><li><font face="Geneva, Arial, Helvetica, sans-serif">Join an English course (and attend regularly). </font></li><li><font face="Geneva, Arial, Helvetica, sans-serif">Do your homework.</font></li><li><font face="Geneva, Arial, Helvetica, sans-serif"> Read a book a month.</font></li><li><font face="Geneva, Arial, Helvetica, sans-serif">Learn a new word every day. </font></li><li><font face="Geneva, Arial, Helvetica, sans-serif">Visit an English speaking forum every day.</font></li><li><font face="Geneva, Arial, Helvetica, sans-serif">Read a news article on the net every day. </font></li><li><font face="Geneva, Arial, Helvetica, sans-serif">Do 10 minutes listening practice every day.</font></li><li><font face="Geneva, Arial, Helvetica, sans-serif">Watch an English film at least once a month.</font></li><li><font face="Geneva, Arial, Helvetica, sans-serif"><a href="http://www.learnenglish.de/EZine/RewardLearning.htm"></a>Follow a soap, comedy or radio or TV drama<br></font></li></ul>]]></description>
</item><item>
<title><![CDATA[davidxiem]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=42660</link>
<author>davidxiem</author>
<pubDate>2009/1/31 6:29:56</pubDate>
<description><![CDATA[<a>　stool<br>&nbsp; uniate<span style="text-decoration: underline;"></span></a><a href="http://www.dict.cn/urinate.htm" class="g" style="display: inline;"><br></a>]]></description>
</item><item>
<title><![CDATA[diary]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=42583</link>
<author>davidxiem</author>
<pubDate>2009/1/24 13:23:37</pubDate>
<description><![CDATA[<p>2009-01-24 </p>
<p>The weather today is on fire !! You'll not be dry even if you sit still. </p>
<p>I glad I am smart enough to go to uni and kill the afternoon coz it's preety cool there. And that's why I cant type chin in the lab. It's a good way to practice eng writing rather than simply bring laptop to uni&nbsp;and keep typing chinese. I've began to do so already, e.g. wrote a letter to Jane few days ago.</p>
<p>I've been reading all the manga drawn by <span class="t_nihongo_romaji"><i>Urasawa Naoki </i></span>(a Japanese mangaka artist) whose respentative work is&nbsp;called "Monster" and "20'th century boys". For now I've finish "happy!", "Monster"(strongly recommanded)&nbsp;and "Yawara". All of them are wonderful to read especially "Monster". When I read Monster, I keep feeling uncontrolable fear like someone cast magic upon me. </p>]]></description>
</item><item>
<title><![CDATA[市检系统的一些收获]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=42141</link>
<author>davidxiem</author>
<pubDate>2009/1/5 17:19:53</pubDate>
<description><![CDATA[
<P>1.如果调用者希望被调用者访问自身的成员，举例来说，一个窗体上的数据列表希望操作者（如一条发出的消息，一个下载任务）能够更新自己（指被调用者）对应的ITEM,应该设法将引用传给被调用者，而不应该调用者每次搜索出对应ITEM。</P>
<P>2.多写注释，说的啰嗦总比没有来的强。需要写的比如特定的逻辑，类的使用方法，参数及返回值说明。</P>
<P>3.每个人对于子系统（项目），模块，代码文件的划分都有不同。我想流行的方式有：按应用功能分，这种分法如：协议，共同工具，报表，自动更新，阅读器等等分为独立的项目。另一种则是先按系统分层，然后再按照不同的业务分模块，这种算是多层应用程序的一种典型分法吧，如：用户界面（不同的界面分成独立的项目，例如管理端，指挥中心，审讯端），视频逻辑，案件逻辑，刻录逻辑等等。</P>
<P>4.最好不要把过多的功能放在一个类里头造成庞大的结构，像这次有个类达到7000多行代码，可是大部分代码都可以在别的类里头实现，虽然作者使用了REGION的方法把代码尽可能的组织起来，但是仍然显得臃肿。</P>
<P>5. REMOTING技术里头客户端调用的方法其实是服务器代理对象的方法，在服务器上才是方法的真正实现，但是该方法（不知道包不包括其调用的本地方法）不能被声明成私有。具体的例子在代码里头。</P>
<P>6.调试状态下的输出可以看到console.writeline以及debug.writeline的输出，这个可以多加以利用。</P>
<P>7.个人觉得if语句还是应该先写false或者说是意外的情况会比较好，像if(false){exit;}else{//normal process}会比反过来的写法好懂。</P>
<P>8.与别人合作的话要尽快将工作的内容交出去，这样的话你就站在主动的一方。并且要主动进行沟通和监督，话不怕说多几次，完成任务要紧。</P>
<P>9.进程间通讯其实有多种手段，最简单的应该算wm_message，其他的还有socket,ipc,wcf,remoting等。</P>
<P>10.下载个NERO SDK就可以用程序控制刻录机刻录了，不需要安装NERO的软件。可以下载到的版本是1.0.6</P>
<P>11.singleton的例子是在当启动第二个该程序时后者用remoting通知前者命令行参数。</P>
<P>12.这次代码中涉及到多种通讯消息，原作者为声明消息类型时用的是整数，如1-DVD消息，2下载光盘，3认证消息等等，强烈建议应该使用枚举，否则程序里头到处是数字根本看不懂。而使用枚举最大的好处就是自说明本身的意义。相当于写了个注释。</P>
<P>REMOTING代码例子，来自codeproject：</P>
<P>&nbsp;<A><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0></A><A href="http://blogger.org.cn/blog/uploadfile/20091517128934.ZIP" target=_blank>ProcessCommunition2.zip</A> </P>
<P><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0><A href="http://blogger.org.cn/blog/uploadfile/200915171226565.ZIP" target=_blank>SingletonApp.zip</A></P>]]></description>
</item><item>
<title><![CDATA[观后感《非诚勿扰》]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=42050</link>
<author>davidxiem</author>
<pubDate>2008/12/31 9:16:25</pubDate>
<description><![CDATA[<a>　昨天晚上去看了《非诚勿扰》，这么一个偏僻的电影院，居然都是要排队才能看到电影，可见现在大家都把注意力从其他消费转向这种经济实惠的娱乐方式来了。我们连续3场都没座位，只好买了几乎是最晚的10：20的票，而且当时才8点多。 好容易消磨了那1个多小时居然开场前还播了10多分的广告，电影院奸商也。<br><br>也许之前看了太多的评论，关于票房的数值也一直提醒我这部片子广受欢迎，因此我看之前确实报了很高的期望，但是看完了还是失望多过满意。<br><br>确实在播的过程中，大家都为葛优的幽默语言笑个不停，而且舒淇扮演的女子也把一个绝望的情人演的很到位，但是电影存在了一些硬伤使得我总是很遗憾。不得不认为只是一部成功的娱乐片，但我无法被其打动。<br>1.插播的广告太多，有3、4个片中出现的广告我在开场前的广告有留意，因此记住了。其他的应该还有更多，比如一开始葛优跟舒淇吃饭的时候拿了一张卡出来付钱，拍了个大大的信用卡特写，招商银行。接下来，在北海道，他们喝酒，于是葛优说我不喝白酒，于是乌桑（名字是错的）也很不客气，“那就来瓶温莎威士忌”，说就说吧，非要把牌子说出来。插播的这些广告是最大的硬伤，因为我不是说不能有广告，但是这种做作的广告方式让我觉得被人硬塞了个苍蝇似的，给人一感觉就是这导演缺钱缺成这样？我们付钱来看的电影还得附加点广告价值给导演？其他的手机广告，航空公司广告，邮轮广告，至少还感觉自然点。<br><br>2.不知道有多少人看过《AV》这部05年的港产片，大陆又译成《青春梦工厂》。分歧终端机我最早上是在那里就见过了，我不清楚《AV》有没有抄袭，但是至少先入为主的观念使我觉得《非》就是在抄袭，感觉很不好。<br><br>3.还有我不喜欢这个片子想表达的东西太多，太杂。于是就一个混合体。传达了一些社会的现实，一些风景，一个很土的第3者的故事，最后又来个自杀加大团圆结局，哦，其中西溪买房子和在茶室里头，卖买分歧终端机这几个场景我始终不明白他们存在的目的是为什么，在我看来，讲一个故事就要专心的讲，所有的侧面描写，对话的存在都应该是为这个故事衬托或者伏笔的作用。<br><br>总之《非》让我开心的看了2个多小时，没有冷场的情况，作为贺岁片来说是及格了。但是跟之前我个人其为喜爱，认为是国产电影终于出了佳作的《集结号》，有很大的距离存在。葛优没有把角色演活，除了他的语言，再无更深刻的印象，现在想起来，我居然不记得他在剧中叫什么名字来，</a><a>真是失败啊，</a><a>而我却记得舒淇叫笑笑，那个大叔叫乌桑，可见他们的表现是很好的。<br></a>]]></description>
</item><item>
<title><![CDATA[生财有道]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=41626</link>
<author>davidxiem</author>
<pubDate>2008/12/9 9:05:39</pubDate>
<description><![CDATA[<a>　你有跟“钱”过不去吗？相信没有，谁傻到故意与“钱”为敌嘛。只是这“钱”的脾气太大，总跟自己过不去。 <br><br>　　很多人只知道辛辛苦苦的赚钱，一旦钱到手了就不再珍惜，这是人的天性使然，是跟钱过不去的常见表现。 <br><br>　　究其原因，你会发现，“懒”才是罪魁祸首。 <br><br>　　有人懒得把工资卡里的活期储蓄转化为定期或其他高收益的投资，每年无端损失几百元甚至几千元； <br><br>　　有人懒得去管自己股票账户里的被套股票，由此损失的金钱达几万，甚至几十万，曾碰到有人发现自己的股票不再有报价（摘牌）了，才到处问怎么办。 <br><br>　　忙整整一年才能赚几万元钱，却因为懒得花几天，甚至几个小时关心一下自己已经拥有的财富，从而让辛辛苦苦赚来的金钱从身边悄悄的溜走，是不是很可惜。 <br><br>　　其实懒并没有错，错在你没有掌握理财的基本法则，没有找到“懒人理财法”。 <br><br>　　理财是很专业的事，是需要时间和心力，更需要智慧的，如果你能找到简单的理财方式，掌握以下驾驭“钱”途的六****则，你就可以放心去懒了。 <br><br>　　<b>第一招：乱世佳人法</b> <br><br>　　此法对指导单身女性理财很有用。 <br><br>　　此法因电影《乱世佳人》中郝思嘉把家里的窗帘拉下来做了一条漂亮的绿裙子，然后去见白瑞德这个场景而得名。被专家评为女性成功投资的典范。 <br><br>　
　身边实例：两年前有位未婚白领问我，她有两万元结余，该投资什么。我明白她是想问我该投资什么股票。但我给她的建议是：投资自己！嫁个有钱（前）人。并
介绍她去“现代淑女魔鬼训练营”训练了一年，费用正好两万。（几天前在外滩三号见到她时，她已被同来的“金龟婿”称为上海滩最后一个淑女了） <br><br>　　不把钱投入到最值得投入的地方，是跟钱过不去的常见表现。 <br><br>　　<b>第二招：书中采金法</b> <br><br>　　此法对自称没有时间读书的人有奇效 <br><br>　　顾名思义，此法因书中自有黄金屋一说而得名 <br><br>　　身边实例：书中采金的例子实在太多，“知识经济”自不必说。我认识的一位成功人士对此感触颇深，深谙“读书的财富哲学”。认为读书是最容易长控和实现的，亦是成本最低生财手段之一。 <br><br>　　没有时间读书是跟钱过不去的最让人可惜的表现之一。 <br><br>　　读书是随时随地可以进行的。知识的积累能大大提高人的判断能力和行事效率，判断力可以为行动赢得时间，而“时间就是金钱”。 <br><br>　　<b>第三招：规则生财法</b> <br><br>　　对规则改变的准确预期是真正的生财之道。 <br><br>　　生财原理：规则的改变必然带来财富的重新分配，大到朝代更替，小到报纸上的一个头条新闻，均是规则改变的表现形式。只要有心，自然可以发现其中的发财机会。 <br><br>　　成功概率：三年，在我们身边改变的大小规则何止300个，而成就百万富翁的规则改变只需要一个。假如成为百万富翁的概率是1/300，那你三年成为百万富翁的概率就是100％. <br><br>　　<b>身边实例</b> <br><br>　　90年代初企业融资规则的改变，沪深股市的出现成就了一大批百万富翁；（我的哲学老师赶上了这一波） <br><br>　　90年代末人类交流方式的重大改变，网络的出现成就了一大批百万富翁；（我的小兄弟丁磊赶上了这一波） <br><br>　　本世纪初由于福利分房规则的改变，房价暴涨成就了无数百万富翁；（我有幸赶上了这一波） <br><br>　　2003年内地资金突破区域规则进入香港H股市场，造就了很多的百万富翁。（我赶上了半波） <br><br>　　有人言必称西方、美国，其实是对国内一些“规则”改变方向的预期，因此而发财的人举不胜举。最典型的是温州人，研究认为温州人的成功在于它拥有遍布世界各地的温州帮，信息的灵通让他们对国内规则演变的理解最透彻。 <br><br>　　我们该关注的下一个要改变的规则 <br><br>　　2004年国内股市的重新洗牌，意味着旧规则的重大改变，又将成就多少百万富翁、千万富翁、亿万富翁呢？你和你的老板都准备好了吗？ <br><br>　
　行业的动荡将成就新的“行业大鳄”，在可预计的三五年后，在成功的企业讲述它成功的经历时，一定有这样一段：2004年，证券行业遇到了前所未有的困
难，全行业亏损已不开避免，职业的敏感让我们意识到一个千载难逢的介入证券行业的机会出现了，我们在认真分析了行业现状及未来发展情形后，经过……终于携
10亿巨资介入证券业，经过五年的发展，公司市值已超过1000亿……。 <br><br>　　ā这就是规则改变带来的价值，现在很多人都在说证券业不合理的地方太多，但越不合理的规则，改变的可能性越大。 <br><br>　　中国作为发展中的国家，需要改变的规则何止千万。 <br><br>　　数一数你身边还有多少不合理的规则，把她变成你的财富吧。 <br><br>　　财富法则：碰到不合理的规则，说明你碰到了财神！与其大骂规则不合理，不如闷头发财。 <br><br>　　<b>第四招：眼大生财法</b> <br><br>　　生财原理：证券投资者喜欢牛市，据说是因为牛角朝上的缘故。我考证的结果是缘自“眼大生财”，牛眼很大，而且能把看见的物体放大，这与见人就追的呆头鹅相反。眼大的结果给了人无穷的努力动力（象牛一样劳作的心态），努力的结果自然是财富的积累。 <br><br>　　证券市场自然希望投资者用牛眼看市，把股价放大，把价值放大。 <br><br>　
　“眼大”是成就事业的保证，人做每一件事情之前，习惯性的先考虑利益有多大，利益大自然干劲高。有人把价值5万的事看成了50万，于是很重视，很努力的
去争取，最后成功了，赚了5万；有人把价值5万的事看成了1万，认为不值得很努力（怕东怕西），最后一分钱也没赚到。——这其实是傻人傻福的一种解释，亦
是阳光心态的一种具体体现。 <br><br>　　成语为证：两份汗水，一份收获（付出永远大于回报） <br><br>　　<b>第五招：宏观生财法</b> <br><br>　　宏观一点，再宏观一点 <br><br>　　别以为这不是个人的事，只要你不和钱过不去，就与你个人有关。 <br><br>　　SARS的出现，不用脑人也想到了预防SARS的物品价格将上涨；宏观一点，有人想到了物价将可能全面上涨；再宏观一点，有人想到了股市将在一年后下跌。SARS事件至少蕴含了三次成为百万富翁的机会。 <br><br>　　SARS造成了我国千千万万家工厂（号称世界工厂）的停工，工厂的停工自然造成供应短缺（世界性的），供不应求的结果就是物价上涨，库存减少；物价上涨，囤积中间体、原材料，很简单的发财方式（所谓奇货可居）。 <br><br>　　物价上涨，通货紧缩转变成了通货膨胀；通货膨胀，意味着经济过热；经济过热，意味着政府要考虑宏观调控。宏观调控的结果是股市将失去上涨动力，抛出股票，见好就收就成了智者的生财之道。如果可以做空，那又是另一次生财机会了。 <br><br>　　<b>第六招：比较生财法</b> <br><br>　　“房产”是最没有可比性的商品。因为它是“不动产”。 <br><br>　　可偏偏有人喜欢把房产价格拿来比较，这就给市场提供了大量的“比较生财”机会。 <br><br>　　有人喜欢拿北京的房价和上海的房价比 <br><br>　　有人喜欢拿上海的房价与香港乃至伦敦的房价比 <br><br>　　有人喜欢拿杭州的房价与贵阳的房价比 <br><br>　　亦有人喜欢拿城东的房价与城西的房价比 <br><br>　　这和股市是何等的相像，机构一直在利用大众喜好“比较”而生财呢。</a>]]></description>
</item><item>
<title><![CDATA[再次看TRUE TEARS 的发现]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=41586</link>
<author>davidxiem</author>
<pubDate>2008/12/6 22:39:51</pubDate>
<description><![CDATA[<a>　1、原来真一郎家卖的酒的名字叫做泪参旨，全部动画只有一个地方提到了，又回应了动画的名字。（12集07：52）<br>2、当石川盈顺着比吕美的话说出：不能去喜欢自己喜欢的东西，很痛苦吧。触动了比吕美，所以才会有比吕美和他恋爱的情节。（）<br>3、到底比吕美是不是真一郎的兄妹呢，应为他老爸在听到比吕美问“真的吗”的时候没有回答。（10集09：34）<br>4、当比吕美在和真一郎说她如何喜欢上石川的时候，她表现的很开朗，很活泼，但那是假的，她只是在圆谎，因为她的手紧紧的抱着胸前的衣服。（4集开头）<br>5、乃绘的祖母在过世前说的那番话的真正意义是说：我死去的时候会把你的眼泪也带走，你以后会幸福的（因为眼泪，也就是悲伤全都被带走了）。<br>6、小时候的比吕美在庙会后走失并和真一郎重逢那一段让我好感动啊。3集12分开始。那一段牵手的情节，就是感情的最高境界吧，所谓的两人相依为命。<br>7、还是上述那一段，比吕美在说她的记忆被封印起来是怎么回事呢？是因为她已经知道“兄妹”的事了吗？那下的雪，居然也像眼泪呢。<br>8、乃绘之所以可爱也许就是因为她不在乎别人的看法，独立独行，拥有一颗像孩子的心吧，听她在真一郎的背上说“那边”的时候，我真的这么想。（3集18：19）<br><br>9、当伤害出现的时候，总有善良的人在问：是我的错吗？10集11：45，13集1:58，13集2:46,但是石川盈却不这么想：正因为大家都认为自己错了，才会省事呢。这句到底怎么理解呢？<br>10、</a><a>比吕美很喜欢真一郎，也因为如此她搬家时所说的这些话格外的伤感“所以我来到了这个家，父母双亡，一个人孤零零的，但只要来这里，</a><a>真一郎就一定会找到我，一定能带我回明亮的地方，可是现在已经那都是不能奢望的东西了”这里她已经对真一郎暗示了她的感情。<br>最感人的仍然是以下的瞬间：<br>真一郎冲出家门追赶离去的比吕美的时候车子翻了，</a><a>比吕美冲了过去，在播的这首</a><a>Sono Mama no Boku de超好听的说。<br>在庙会上跳舞的时候，真一郎终于长大了，他决定起飞，那个坚毅的眼神以及音乐深深的打动我。“我想飞，是因为吃了红果的缘故，还是因为这白雪的缘故，无从知道”，那眼神……一直坚信我能够飞翔。<br>十三集可以说整部动画到了一个高潮，无处是不感人的，像真一郎与乃绘告别，以及最后他向</a><a>比吕美告白的场面。Ichijin no Kaze也是一首好听的曲子。<br><br>综上，true tears是一部画面出众，音乐动听的优秀作品，不看就太可惜了。<br><br></a><a><br><br><br></a>]]></description>
</item><item>
<title><![CDATA[计算DIABLO２存档文件校验码的工具]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=41185</link>
<author>davidxiem</author>
<pubDate>2008/11/16 15:52:48</pubDate>
<description><![CDATA[
<P>这两天有够糟糕的，居然不复习在打DIABLO２，而且这么老的游戏了我居然还是能玩的很起劲。我因为加错了技能点打算修改过来，可是现在1.12版的DIABLO居然没有一个可以用的修改器，于是只好重操旧业用文本编辑器修改存档了，可是改完以后发现进入不了游戏，显示＂无法进入游戏，一般错误档案＂，于是分析一下存档文件，经过比较后发现应该是加了checksum，所有就到网上搜以下，真的给我发现有人提到了校验的算法。我觉得她写的不知道是什么语言，于是自己给改成了vb.net的程序，由于不是原创的，我就不写什么case study之类的东西了，原作：evilertoaster，地址是<A href="http://evilertoaster.wordpress.com/2008/05/19/diablo-2-111-save-file/">http://evilertoaster.wordpress.com/2008/05/19/diablo-2-111-save-file/</A>,</P>
<P>我的计算器在这里下载：</P>
<P>Diablo2 d2s checksum calculator download:</P>
<P><A><IMG src="http://blogger.org.cn/blog/images/file/zip.gif" border=0></A><A href="http://blogger.org.cn/blog/uploadfile/20081116203741238.RAR" target=_blank>DiabloChecksum.rar</A></P>
<P>使用方法：解压后里头有两文件夹，bin下的可以直接运行（需要.net framewokr2.0)，选择d2s后即可。另外一个文件夹是原代码，供有兴趣的人继续研究。</P>
<P>代码如下：</P>
<DIV class=HtmlCode title=点击运行该代码！ style="CURSOR: pointer" onclick="preWin=window.open('','','');preWin.document.open();preWin.document.write(this.innerText);preWin.document.close();" ;>
<P>&nbsp;&nbsp;&nbsp; Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim savefile As String<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim dialresult As DialogResult<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dialresult = OpenFileDialog1.ShowDialog<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If dialresult &lt;&gt; Windows.Forms.DialogResult.OK Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Exit Sub<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; savefile = OpenFileDialog1.FileName<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim srcbytes() As Byte = File.ReadAllBytes(savefile)</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srcbytes(12) = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srcbytes(13) = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srcbytes(14) = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; srcbytes(15) = 0</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim checksum(3) As Integer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each b As Byte In checksum<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim boolcarry, temp As Integer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolcarry = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For i As Integer = 0 To srcbytes.Length - 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp = srcbytes(i) + boolcarry<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(0) = checksum(0) * 2 + temp<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(1) = checksum(1) * 2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If checksum(0) &gt; 255 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(1) = checksum(1) + (checksum(0) - checksum(0) Mod 256) \ 256<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(0) = checksum(0) Mod 256<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(2) = checksum(2) * 2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If checksum(1) &gt; 255 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(2) = checksum(2) + (checksum(1) - checksum(1) Mod 256) \ 256<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(1) = checksum(1) Mod 256<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(3) = checksum(3) * 2<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If checksum(2) &gt; 255 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(3) = checksum(3) + (checksum(2) - checksum(2) Mod 256) \ 256<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(2) = checksum(2) Mod 256<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If checksum(3) &gt; 255 Then<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; checksum(3) = checksum(3) Mod 256<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (checksum(3) And 128) &lt;&gt; 0 Then</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolcarry = 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolcarry = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next</P>
<P><BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim bytes(3) As Byte</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim j As Integer = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each i As Integer In checksum<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bytes(j) = CType(i, Byte)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; j += 1<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TextBox1.Text = String.Format("The sum after modification is:{0:x} {1:x} {2:x} {3:x}", bytes(0), bytes(1), bytes(2), bytes(3))</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim writefile As FileStream = File.Open(savefile, FileMode.Open)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writefile.Seek(12, SeekOrigin.Begin)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writefile.Write(bytes, 0, 4)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writefile.Flush()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; writefile.Close()</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lblmsg.Text = "Check sum bytes is successfully written."<BR>&nbsp;&nbsp;&nbsp; End Sub</P></DIV>]]></description>
</item><item>
<title><![CDATA[总算是忙完了啦，要想想有哪些事情要做]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=41032</link>
<author>davidxiem</author>
<pubDate>2008/11/6 19:01:07</pubDate>
<description><![CDATA[过去的两个星期忙的连饭都吃不好，除了作业就是考试，再不然就是presentation,今天总算是全部做完了，好不好先不论，至少终于有机会喘口气，最近的一个考试也在12天以后了。<br><br>今天的presentation做的极烂，又想起第一在这边做的第一个presentation发现越做是越烂，那一次做的关于kurmping的，因为自己有兴趣的东西，所以找资料很用心，思路也很清晰，讲出来也就能够引起别人的兴趣，而这次就不行了。 因此认识到这样一个东西，以后做presentation一定不要做自己不懂的东西，否则连自己都没有兴趣说，根本就不可能成功的。<br><br><br>]]></description>
</item><item>
<title><![CDATA[A Concrete DataAccessor Object in VB.NET]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=40873</link>
<author>davidxiem</author>
<pubDate>2008/10/29 8:03:12</pubDate>
<description><![CDATA['Publish Date: Oct 29th, 2008<br>'Author: david xie<br>'Email: davidxiem@hotmail.com<br><br>Imports Common<br>Imports Common.StringModule<br>Imports System.Collections<br>Imports System.Collections.Specialized<br>Imports System.Data<br>Imports System.Data.OleDb<br>Imports System.Text<br><br>'A helper provide other layer several interfaces for easy accessing physical<br>'Database include read, insert, update.<br>Public Class DataAccessor<br>&nbsp;&nbsp;&nbsp; Implements IDisposable<br><br><br>&nbsp;&nbsp;&nbsp; 'Private connection As OleDbConnection<br>&nbsp;&nbsp;&nbsp; Protected connection As OleDbConnection&nbsp; 'Remember that i have changed connection into protected<br><br><br>&nbsp;&nbsp;&nbsp; Public Sub New()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection = New OleDbConnection(DATABASE_CONNECTIONSTRING)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Catch ex As OleDbException<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Throw New Exception("unable to open connection to '" &amp; DATABASE_CONNECTIONSTRING &amp; "'", ex)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Try<br>&nbsp;&nbsp;&nbsp; End Sub<br>&nbsp;&nbsp;&nbsp; 'Reads data from a table<br>&nbsp;&nbsp;&nbsp; 'table&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The table<br>&nbsp;&nbsp;&nbsp; 'columns&nbsp;&nbsp;&nbsp; The columns to read, or null to read all<br>&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the columns in the table<br>&nbsp;&nbsp;&nbsp; 'selectionRow A set of filter columns and values used to subset the rows, or null to read all rows in the table.<br>&nbsp;&nbsp;&nbsp; 'sortColumns The columns to sort, or null to read without sorting<br>&nbsp;&nbsp;&nbsp; 'return&nbsp;&nbsp;&nbsp;&nbsp; The result dataset.<br>&nbsp;&nbsp;&nbsp; Public Overloads Function Read(ByVal table As String, ByVal columns As StringCollection, ByVal selectionRow As IList, ByVal sortColumns As StringCollection) As DataTable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim query As String = BuildSelectCmd(table, columns, selectionRow, sortColumns)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return Read(query)<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; Public Overloads Function ReadToReader(ByVal table As String, ByVal columns As StringCollection, ByVal selectionRow As IList, ByVal sortColumns As StringCollection) As IDataReader<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim query As String = BuildSelectCmd(table, columns, selectionRow, sortColumns)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return ExecuteReader(query)<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; ''' &lt;summary&gt;<br>&nbsp;&nbsp;&nbsp; ''' <br>&nbsp;&nbsp;&nbsp; ''' &lt;/summary&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;param name="commandtext"&gt;&lt;/param&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;returns&gt;&lt;/returns&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;remarks&gt;This function will manage own connection.&lt;/remarks&gt;<br>&nbsp;&nbsp;&nbsp; Public Overloads Function Read(ByVal commandtext As String) As DataTable<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim datable As New DataTable<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Execute the command to pop data from database<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim dataadp As OleDbDataAdapter = New OleDbDataAdapter(commandtext, connection)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataadp.Fill(datable)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return datable<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; ''' &lt;summary&gt;<br>&nbsp;&nbsp;&nbsp; ''' Execute a sql command to get a datareader object.<br>&nbsp;&nbsp;&nbsp; ''' &lt;/summary&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;param name="commandtext"&gt;SQL command to be executed&lt;/param&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;returns&gt;Datareader responds the command&lt;/returns&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;remarks&gt;&lt;/remarks&gt;<br>&nbsp;&nbsp;&nbsp; Public Function ExecuteReader(ByVal commandtext As String) As IDataReader<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim cmd As New OleDbCommand(commandtext, connection)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Open()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return cmd.ExecuteReader()<br>&nbsp;&nbsp;&nbsp; End Function<br><br><br>&nbsp;&nbsp;&nbsp; 'Inserts data into a table<br>&nbsp;&nbsp;&nbsp; '@param table&nbsp; The table<br>&nbsp;&nbsp;&nbsp; '@param rows&nbsp;&nbsp; The rows to insert<br>&nbsp;&nbsp;&nbsp; Public Function Insert(ByVal table As String, ByVal rows As IDictionary) As Integer<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim buffer As New StringBuilder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim firstcolumn As Boolean = True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim affcteds As Integer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim cmd As OleDbCommand<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd = New OleDbCommand()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Generate the SQL INSERT startement based on<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'the caller's input<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append("INSERT INTO ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(table)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'List the column names<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" (")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each row As DictionaryEntry In rows<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not firstcolumn Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(", ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstcolumn = False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(getunformatname(row.Key.ToString()))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'List the column values.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(") VALUES (")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstcolumn = True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each row As DictionaryEntry In rows<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not firstcolumn Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(", ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstcolumn = False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''TODO: Add a generatlitertureValues function to <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''check the key if followby a ? mark and convert to associate value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''like that<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ''buffer.append(generatelitertureValue(dictentry))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Dim obj As Object = row.Value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'If Not IsNumeric(obj) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp; If IsArray(obj) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append("?")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AddPhoto(cmd, "", obj)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append("'" &amp; obj.ToString() &amp; "'")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp; buffer.Append(obj.ToString())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(GenerateLiteralValues(row, cmd))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(")")<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Execute the statement to insert data<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.CommandText = buffer.ToString()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Connection = connection<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If connection.State = ConnectionState.Closed Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Open()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; affcteds = cmd.ExecuteNonQuery()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.CommandText = "SELECT @@identity"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim result As Integer = CInt(cmd.ExecuteScalar())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return result<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Close()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Catch ex As OleDbException<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Throw New Exception("unable to insert into table" &amp; table, ex)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Try<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; Public Function GetSingleNum(ByVal commandtext As String) As Integer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim cmd As New OleDbCommand(commandtext, connection)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If connection.State = ConnectionState.Closed Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Open()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim result As Integer = CInt(cmd.ExecuteScalar())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Close()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return result<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; ''' &lt;summary&gt;<br>&nbsp;&nbsp;&nbsp; ''' Updates data in a table<br>&nbsp;&nbsp;&nbsp; ''' &lt;/summary&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;param name="table"&gt;The table&lt;/param&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;param name="selectionrow"&gt;A set of filter columns and values used to subset the rows,<br>&nbsp;&nbsp;&nbsp; ''' or null to update all the rows in the table&lt;/param&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;param name="updaterow"&gt;A set of update columns and values.&lt;/param&gt;<br>&nbsp;&nbsp;&nbsp; ''' &lt;remarks&gt;&lt;/remarks&gt;<br>&nbsp;&nbsp;&nbsp; Public Sub Update(ByVal table As String, ByVal selectionrow As IList, ByVal updaterow As IDictionary)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim cmd As OleDbCommand = New OleDbCommand()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Generate the SQL UPDATE statement based on the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'caller's input<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim buffer As New StringBuilder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim firstcolumn As Boolean<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append("UPDATE ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(table)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Generate the SET clause<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" SET ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstcolumn = True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each row As DictionaryEntry In updaterow<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not firstcolumn Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(", ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstcolumn = False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(getunformatname(row.Key.ToString()))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" = ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Dim obj As Object<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'obj = row.Value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'If Not IsNumeric(obj) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp; buffer.Append("'" &amp; obj.ToString() &amp; "'")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&nbsp;&nbsp;&nbsp; buffer.Append(obj.ToString())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(GenerateLiteralValues(row, cmd))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Generate the WHERE clause if the <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'caller specified a selection row.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If IsNothing(selectionrow) = False Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(generateWhereClause(selectionrow))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Execute the command<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.CommandText = buffer.ToString()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Connection = connection<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If connection.State = ConnectionState.Closed Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Open()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.ExecuteNonQuery()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Catch ex As OleDbException<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Throw New Exception("Unable to update table" &amp; table, ex)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Try<br>&nbsp;&nbsp;&nbsp; End Sub<br><br>&nbsp;&nbsp;&nbsp; Public Sub Delete(ByVal table As String, ByVal selectionRow As IList)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim cmd As OleDbCommand = New OleDbCommand()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Generate the SQL DELET statement based on the<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'caller's input<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim buffer As New StringBuilder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append("DELETE FROM ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(table)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If IsNothing(selectionRow) = False Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(generateWhereClause(selectionRow))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Execute the command<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.CommandText = buffer.ToString()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Connection = connection<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If connection.State = ConnectionState.Closed Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Open()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.ExecuteNonQuery()<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Catch ex As Exception<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Throw New Exception("Unable to delete from table " + table, ex)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End Try<br>&nbsp;&nbsp;&nbsp; End Sub<br><br>&nbsp;&nbsp;&nbsp; Public Function GenerateCmdPara(ByVal name As String) As String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return name + "?"<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; Private Function getunformatname(ByVal value As String) As String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If value.EndsWith("?") = True Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return value.Remove(value.Length - 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; Private Function GenerateLiteralValues(ByVal entry As DictionaryEntry, ByVal cmd As OleDbCommand) As String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim key As String = entry.Key.ToString()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim obj As Object = entry.Value<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If key.EndsWith("?") = True Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'This block is for data that can't not directly insert or update.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'To insert or update it needs a command parameter and assign the obj to it.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Parameters.Add(New OleDbParameter())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmd.Parameters(cmd.Parameters.Count - 1).Value = obj<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Don't put the obj as a string instead put a question mark into command text.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return "?"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim buffer As StringBuilder = New StringBuilder()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not TypeOf obj Is Integer Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append("'")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(obj.ToString())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not TypeOf obj Is Integer Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append("'")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return buffer.ToString()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; Private disposedValue As Boolean = False&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' To detect redundant calls<br><br>&nbsp;&nbsp;&nbsp; ' IDisposable<br>&nbsp;&nbsp;&nbsp; Protected Overridable Sub Dispose(ByVal disposing As Boolean)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not Me.disposedValue Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If disposing Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If connection IsNot Nothing Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If connection.State = ConnectionState.Open Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Close()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connection.Dispose()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' TODO: free shared unmanaged resources<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Me.disposedValue = True<br>&nbsp;&nbsp;&nbsp; End Sub<br><br>#Region " IDisposable Support "<br>&nbsp;&nbsp;&nbsp; ' This code added by Visual Basic to correctly implement the disposable pattern.<br>&nbsp;&nbsp;&nbsp; Public Sub Dispose() Implements IDisposable.Dispose<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ' Do not change this code.&nbsp; Put cleanup code in Dispose(ByVal disposing As Boolean) above.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dispose(True)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GC.SuppressFinalize(Me)<br>&nbsp;&nbsp;&nbsp; End Sub<br>#End Region<br><br>&nbsp;&nbsp;&nbsp; 'Generate a sql where clause based on a selection row.<br>&nbsp;&nbsp;&nbsp; Private Function generateWhereClause(ByVal selectionRow As IList) As String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim buffer As New StringBuilder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" WHERE ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim firstcolumn As Boolean = True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each i As Array In selectionRow<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not firstcolumn Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" AND ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstcolumn = False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i.Length &gt; 1 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" (")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim colname As Boolean = True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim firstexpression As Boolean = True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim name As String = ""<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each obj As Object In i<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If colname Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name = CType(obj, String)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; colname = False<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not firstexpression Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" OR ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firstexpression = False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If Not TypeOf obj Is Integer Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(name &amp; "='" &amp; obj.ToString() &amp; "'")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(name &amp; "=" &amp; obj.ToString())<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i.Length &gt; 1 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" )")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return buffer.ToString()<br>&nbsp;&nbsp;&nbsp; End Function<br><br>&nbsp;&nbsp;&nbsp; Private Function BuildSelectCmd(ByVal table As String, ByVal columns As StringCollection, ByVal selectionRow As IList, ByVal sortColumns As StringCollection) As String<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim buffer As New StringBuilder<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" SELECT ")<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'List the columns if the caller sepcified any.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (columns IsNot Nothing) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim i As Integer = 0<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each col As String In columns<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Test if it is not only one column <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i &gt; 0 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(", ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = i + 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(col)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" * ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Include the resolved qualifed table name.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" FROM ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(table)<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Generate the WHERE clause if the caller specified a selection row<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (selectionRow IsNot Nothing) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(generateWhereClause(selectionRow))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'Generate the ORDER By clause if the caller specified sort columns<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If (sortColumns IsNot Nothing) Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(" ORDER BY ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dim i As Integer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For Each col As String In sortColumns<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; If i &gt; 0 Then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(", ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i = i + 1<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer.Append(col)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'buffer.Append(" ASC ")<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Next<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; End If<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return buffer.ToString()<br>&nbsp;&nbsp;&nbsp; End Function<br>End Class<br>]]></description>
</item><item>
<title><![CDATA[找到属于你的力量]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=40703</link>
<author>davidxiem</author>
<pubDate>2008/10/17 21:13:22</pubDate>
<description><![CDATA[体悟简单来说，就是要明白自己正在做什么，想要什么？畏惧什么？自己到底是个什么样的人？只有想通这些，才会明白自己的道走向何方，然后，为了贯彻自己的道，粉碎挡路东西的“力量”便会出现。<br><br>　　力量的强大，来自对于本身体悟的执着，你越能坚持于自己的道，力量就会越强，这些都不是单靠苦练便能得到的东西。]]></description>
</item><item>
<title><![CDATA[东方云梦谭语录]]></title>
<link>http://blogger.org.cn/blog/more.asp?name=davidxiem&amp;id=40359</link>
<author>davidxiem</author>
<pubDate>2008/9/28 9:53:35</pubDate>
<description><![CDATA[1.真相是什么？一千个人就有一千种真相，杀人狂有杀人狂的真相，爱哭鬼有爱哭鬼的道理，少年现在正经历他人生中的重要时刻，开始由幼稚的心态渐渐成熟，虽然距离他像个真正的男人还有很大一段路，不过反正没有人对他有期望，就让他悠悠闲闲地慢慢成长吧，死乡巴佬，耶！（第3集第4章）<br><br>2.解释个什么鬼东西？男女之间的关系只有一种，该扑街的时候，就勇敢的扑下去吧！（第5集第2章）<br><br>3.生话品质实在太烂，不是每个人都有意志去坚持，去追求更好的生活，意志脆弱的人会选择放弃，轻贱自己，也轻贱别人，早点找机会砍一砍，大家早点超生，早点了事。（第5集第3章）<br><br>4.孙武认真地提出反驳，不过这意见却被对方很轻易地践踏了，银劫摇了摇头，道：「殿下诚然天资颖悟，但有些人情世故您却完全不懂，今天我并不是与您讨论慈航静殿该不该被征服，而是告知您我们即将征服慈航静殿。我们也很清楚，人类生而平等，没有哪一个生命应该被征服与奴役，不过，既然我们有这能力去奴役人，有什么理由我们要安于平等？这些理论对您可能太复杂，您也不需要想太多，只要晓得我们是一群不可理喻的疯子即可。」(David注：敢情银劫又是一个达尔文进化论的支持者啊）<br><br>5.「你落井下石的石头可以挑更大抉一点，我反正已径习惯被你砸，再用力一点无所谓。」(David注：这句话算是经典的自嘲，也只有象孙武这种脾气这么好的人才能说的出来的，我也要学习学习)<br><br>6.　　袁晨锋临走前，像是对什么东西很好奇，经过短暂考虑后，他将问题提了出来。<br>　　「孙兄弟，你遇到武沧澜……有什么感觉？」<br>　　「什么感觉？没什么感觉啊！他脑子坏掉了，这种感觉全天下人都有吧！」<br>　　「不是说这个，我是指……他很强，甚至可以说是举世无双的强与霸，和他作战，你难道不会觉得他是不可能被打倒的吗？」<br>　　袁晨锋如今是义军领袖，正率军与武沧澜作战，这句话从他口中说出，要是给别人听到，势必会对士气有大影响，不过，孙武并没有想到这些，听了这问题之后，只是很辛酸地开始苦笑。<br>　　「怎么了？你没有这种感觉？」<br>　　「不……我只是想起来，下山以后打的每一场战役，在打的时候，根本一点会赢的感觉都没有，不只是武沧澜，我遇到的每一个……都是要抱着送死的觉悟去战的……」<br>　　孙武把自己的艰辛说得轻描淡写，但袁晨锋还是听了出来，深深震惊。<br>　　「啊？这样子你也打得下去？明知道是必输的战斗，为什么不避开，等有胜算的时候再来？」<br>　　「因为没有得选择啊！事情都逼到眼前来了，要是我退避的话，那不就是变成别人要受害了吗？袁兄你应该能了解吧？同盟会不也是为了不让天下百姓过苦日子，所以才举事起义的吗？」<br>　　孙武点头道：「而且，袁兄你有一件事情弄错了。」<br>　　「什么事？」<br>　　「我觉得，一场战斗有没有希望打赢，和一场战斗该不该去打，这两个应该不是一件事吧？有些战斗虽然没有希望赢，但还是要去战，因为公平与正义不会凭空掉下来，也不能被施舍，一定是要靠自己去争取，表现出决心与意志，把这点传达给对方，才能够得到公平与正义的。」<br>　　「唔……你说公平与正义，那么……你相信邪不胜正吗？是这个信念带给你力量的吗？」<br>　　袁晨锋问得认真，但孙武反而出现为难的表情，侧头想了想。<br>　　「其实……我没有什么特殊信念耶！要说邪不胜正……好像也不一定，就算我还只是个小鬼，也知道世上的事没有那么单纯，早就过了相信邪不胜正的年纪了，如果邪真的不能胜正，那为什么我们会被武沧澜打得这么惨呢？这是我常常在想的问题。」<br>　　「你不相信邪不胜正？那你……怎么从那么多硬仗里挺过来的？」<br>　　袁晨锋听得眼珠子都快突出来，孙武对于他的错愕，只是仰头大笑。<br>　　「哈哈哈，这些我刚刚不是说了吗？一场仗再硬，如果那是非打不可的仗，我也没地方可躲啊！硬着头皮上就是了，至于为什么能挺得过来……我每次都好奇这一点，只能说是好狗运吧！」<br>　　孙武笑了笑，认真道：「袁兄，我……其实是个笨蛋，很多人都这么说过。太复杂的事情，我不太懂，现在的我，也没有足够的智慧来判断，我想……这些答案肯定要在很久之后才会出现，我……现在只要照着自己的心来做事，这样就够了。」（David注:没错，世上有很多人能够对人诚实，但是要诚实的对待自己，就没有几个人能够做到，孙武才是大智若愚啊）<br>]]></description>
</item>
</channel>
</rss>