<?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>大统一网 - Programs</title><link>http://www.datongyi.com/</link><description> - </description><generator>RainbowSoft Studio Z-Blog 1.8 Walle Build 91204</generator><language>zh-CN</language><copyright>Copyright &amp;amp;copy 2008-2010 大统一. Some Rights Reserved.鄂ICP备09005938号 </copyright><pubDate>Wed, 08 Sep 2010 10:51:16 +0800</pubDate><item><title>什么是纤程</title><author>a@b.com (cnwang)</author><link>http://www.datongyi.com/post/22.html</link><pubDate>Fri, 04 Jun 2010 18:55:24 +0800</pubDate><guid>http://www.datongyi.com/post/22.html</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>纤程</strong>是Windows操作系统中独有的概念，但对于.NET来说线程的概念十分重要，因为在有些情况下.NET的线程实际在操作系统层面对应的就是纤程。读者需要至少了解纤程的概念，并且知道它和线程的区别。</p><p><strong>&diams;所涉及的知识点</strong></p><p>►纤程的概念</p><p>►纤程和线程的区别</p><p>►纤程在.NET中的作用</p><p>&diams;<strong>分析问题</strong></p><p>1．纤程的概念</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;纤程是微软公司在自己的操作系统上提出的一个概念，当初的目的是用来方便地移植其他操作系统上的应用程序。一个线程可以拥有0个或者多个纤程，一个纤程可以视为一个轻量级的线程，它拥有自己的栈和上下文状态，但是纤程的调度是由程序员编码控制的，当一个纤程所在线程得到运行时，程序员需要手动地决定运行哪一个纤程。事实上，Windows操作系统内核是完全不了解纤程的存在的，它只负责调度所有的线程，而纤程之所以成为操作系统的概念，是因为微软公司的操作系统提供了关于线程操作的Win32函数，能够方便地帮助程序员进行线程编程。</p><p><strong>2．纤程和线程的区别</strong></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个线程包含多个纤程，纤程和线程的最大区别在于，线程的调度受操作系统的管理，程序员没有必要也没有办法进行完全干涉。在Windows这样的非实时操作系统中，一个线程何时被运行完全无法预知。但纤程却完全受控于程序本身，可以说纤程允许程序员对多任务进行完全自定义的调度和控制，可见纤程带给程序非常大的灵活性，当然，纤程程序的编写要求程序员有非常深厚的操作系统知识。下图展示了进程、线程、纤程的部分关系。</p><p><strong>3．纤程在.NET中的地位</strong></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.NET运行框架没有做出关于线程真实性的保证，也就是说，程序员在.NET程序中新建的线程，并不一定会在操作系统层面上产生一个真正的线程。在.NET框架寄宿的情况下，一个程序中的线程很有可能对应某个纤程。总之微软公司在线程的操作上为将来的产品留有了余地，程序员应该清楚地意识到这一点，从而避免错误地把.NET中的线程直接理解为操作系统层面的线程，事实上它可能是一个线程、一个纤程甚至于一个.NET自定义的结构。唯一可以确定的是，.NET开发小组的设计会努力使程序的效率变高，所以程序员可以放心地去使用.NET的线程机制。&nbsp;</p><p><img title="" alt="" onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/纤程.jpg" /></p>]]></description><category>Programs</category><comments>http://www.datongyi.com/post/22.html#comment</comments><wfw:comment>http://www.datongyi.com/</wfw:comment><wfw:commentRss>http://www.datongyi.com/feed.asp?cmt=22</wfw:commentRss><trackback:ping>http://www.datongyi.com/cmd.asp?act=tb&amp;id=22&amp;key=84ad00b3</trackback:ping></item><item><title>使用 ListView 显示数据</title><author>a@b.com (cnwang)</author><link>http://www.datongyi.com/post/20.html</link><pubDate>Sun, 02 May 2010 00:16:44 +0800</pubDate><guid>http://www.datongyi.com/post/20.html</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一般情况下，如果需要在程序中显示数据记录，人们通常使用的工具可能是DataGridView控件。不可否认，使用DataGridView控件来完成这种工作非常实用简单。但是在实际工作中，也许它并不能满足我们的要求。这个时候，你可以尝试用ListView来显示你的数据记录。 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListView（列表）是.Net FreameWork 中的一个常用组件，常常被使用显示比较庞大的数据信息。 本文将利用这一控件来讲解如何使用 ListView来显示数据。 笔者使用的开发工具为 VS2008+MySql。虽然这种组合会让某些人感到很不爽，但是不可否认，它很简洁。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先，建立一个数据连接。 具体的原理本文就不再讲解了。直接上源：&nbsp;</p><div style="background-color: #f9f7ed; font-family: 'Lucida Console', 'Consolas', 'Courier New'; color: #000000" class="source" jquery1272732632614="14"><span style="font-style: italic; color: #008800">1</span> <span style="color: #000000">OdbcConnection</span> <span style="color: #000000">DBConn</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">new</span> <span style="color: #000000">OdbcConnection</span>(<br /><span style="font-style: italic; color: #008800">2</span> &nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&quot;Driver={Mysql odbc 5.1 driver};&quot;</span> <span style="color: #000000">+</span> <br /><span style="font-style: italic; color: #008800">3</span> &nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&quot;Server=localhost;&quot;</span> <span style="color: #000000">+</span><br /><span style="font-style: italic; color: #008800">4</span> &nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&quot;database=listdata;&quot;</span> <span style="color: #000000">+</span> <br /><span style="color: #f810b0">5</span> &nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&quot;UID=root&quot;</span>);<br /><span style="font-style: italic; color: #008800">6</span>&nbsp;<span style="color: #000000">DBConn</span><span style="color: #000000">.</span><span style="color: #000000">Open</span>();<br />&nbsp;</div><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对ListView控件进行属性设置主要有如下属性：&nbsp;</p><div style="background-color: #f9f7ed; font-family: 'Lucida Console', 'Consolas', 'Courier New'; color: #000000" class="source" jquery1272732751786="14"><span style="font-style: italic; color: #008800">1</span> <span style="color: #000000">listView1</span><span style="color: #000000">.</span><span style="color: #000000">GridLines</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">true</span> ;<span style="font-style: italic; color: #008800">//显示各个记录的分隔线</span><br /><span style="font-style: italic; color: #008800">2</span> <span style="color: #000000">listView1</span><span style="color: #000000">.</span><span style="color: #000000">FullRowSelect</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">true</span> ; <span style="font-style: italic; color: #008800">//要选择就是一行</span><br /><span style="font-style: italic; color: #008800">3</span> <span style="color: #000000">listView1</span><span style="color: #000000">.</span><span style="color: #000000">View</span> <span style="color: #000000">=</span> <span style="color: #000000">View</span><span style="color: #000000">.</span><span style="color: #000000">Details</span> ;<span style="font-style: italic; color: #008800">//定义列表显示的方式</span><br /><span style="font-style: italic; color: #008800">4</span> <span style="color: #000000">listView1</span><span style="color: #000000">.</span><span style="color: #000000">Scrollable</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">true</span> ; <span style="font-style: italic; color: #008800">//需要时候显示滚动条 </span><br /><span style="color: #f810b0">5</span> <span style="color: #000000">listView1</span><span style="color: #000000">.</span><span style="color: #000000">MultiSelect</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">false</span> ; <span style="font-style: italic; color: #008800">// 不可以多行选择</span>&nbsp;</div><p><img onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/QQ截图未命名.jpg" alt="" title=""/> <img onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/201005020036271258.jpg" alt="" title=""/></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;对数据集中的数据记录进行遍历，在遍历中添加记录到列表中。 可以利用数据集中的Read ( )方法，来实现对数据记录的遍历，Read ( )方法是首先指向首数据记录，并判断从此记录是否为尾记录，如果不是则返回false，如果是则返回true。并且如果不是尾记录则自动把数据指针移到下一条记录上，然后在判断此记录是否是尾记录，如此循环，直至到尾记录为止。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据此可设计以下代码：</p><div style="background-color: #f9f7ed; font-family: 'Lucida Console', 'Consolas', 'Courier New'; color: #000000" class="source" jquery1272732858044="14"><span style="font-style: italic; color: #008800">1</span> <span style="color: #000080; font-weight: bold">while</span> (<span style="color: #000000">reader</span><span style="color: #000000">.</span><span style="color: #000000">Read</span>())<br /><span style="font-style: italic; color: #008800">2</span> <span style="color: #000000">{</span><br /><span style="font-style: italic; color: #008800">3</span> &nbsp;&nbsp;&nbsp; <span style="color: #000000">ListViewItem</span> <span style="color: #000000">lvi</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">new</span> <span style="color: #000000">ListViewItem</span>();<br /><span style="font-style: italic; color: #008800">4</span> &nbsp;&nbsp;&nbsp; <span style="color: #000000">lvi</span><span style="color: #000000">.</span><span style="color: #000000">SubItems</span><span style="color: #000000">[</span><span style="color: #0000ff">0</span><span style="color: #000000">].</span><span style="color: #000000">Text</span> <span style="color: #000000">=</span> <span style="color: #000000">reader</span><span style="color: #000000">[</span><span style="color: #0000ff">&quot;name&quot;</span><span style="color: #000000">].</span><span style="color: #000000">ToString</span>();<br /><span style="color: #f810b0">5</span> &nbsp;&nbsp;&nbsp; <span style="color: #000000">lvi</span><span style="color: #000000">.</span><span style="color: #000000">SubItems</span><span style="color: #000000">.</span><span style="color: #000000">Add</span>(<span style="color: #000000">reader</span><span style="color: #000000">[</span><span style="color: #0000ff">&quot;age&quot;</span><span style="color: #000000">].</span><span style="color: #000000">ToString</span>());<br /><span style="font-style: italic; color: #008800">6</span> &nbsp;&nbsp;&nbsp; <span style="color: #000000">lvi</span><span style="color: #000000">.</span><span style="color: #000000">SubItems</span><span style="color: #000000">.</span><span style="color: #000000">Add</span>(<span style="color: #000000">reader</span><span style="color: #000000">[</span><span style="color: #0000ff">&quot;city&quot;</span><span style="color: #000000">].</span><span style="color: #000000">ToString</span>());<br /><span style="font-style: italic; color: #008800">7</span> &nbsp;&nbsp;&nbsp; <span style="color: #000000">lvi</span><span style="color: #000000">.</span><span style="color: #000000">SubItems</span><span style="color: #000000">.</span><span style="color: #000000">Add</span>(<span style="color: #000000">reader</span><span style="color: #000000">[</span><span style="color: #0000ff">&quot;qq&quot;</span><span style="color: #000000">].</span><span style="color: #000000">ToString</span>());<br /><span style="font-style: italic; color: #008800">8</span> &nbsp;&nbsp;&nbsp; <span style="color: #000000">listView1</span><span style="color: #000000">.</span><span style="color: #000000">Items</span><span style="color: #000000">.</span><span style="color: #000000">Add</span>(<span style="color: #000000">lvi</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-style: italic; color: #008800">9</span> <span style="color: #000000">}</span><br />&nbsp;</div><p>&nbsp;最后，不忘了将数据连接关闭&nbsp;</p><div style="background-color: #f9f7ed; font-family: 'Lucida Console', 'Consolas', 'Courier New'; color: #000000" class="source" jquery1272732906268="14"><span style="font-style: italic; color: #008800">1</span> <span style="color: #000000">DBConn</span><span style="color: #000000">.</span><span style="color: #000000">Close</span>();<br />&nbsp;</div><p>&nbsp;MySql数据库表设计，Test表：</p><p><img onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/201005020041090781.jpg" alt="" title=""/></p><p>最终效果：</p><p><img onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/201005020043215383.jpg" alt="" title=""/></p><p>完整代码：&nbsp;</p><div style="background-color: #f9f7ed; font-family: 'Lucida Console', 'Consolas', 'Courier New'; color: #000000" class="source" jquery1272732994631="14"><span style="font-style: italic; color: #008800">01</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System</span>;<br /><span style="font-style: italic; color: #008800">02</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.Collections.Generic</span>;<br /><span style="font-style: italic; color: #008800">03</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.ComponentModel</span>;<br /><span style="font-style: italic; color: #008800">04</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.Data</span>;<br /><span style="color: #f810b0">05</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.Drawing</span>;<br /><span style="font-style: italic; color: #008800">06</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.Linq</span>;<br /><span style="font-style: italic; color: #008800">07</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.Text</span>;<br /><span style="font-style: italic; color: #008800">08</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.Windows.Forms</span>;<br /><span style="font-style: italic; color: #008800">09</span> <br /><span style="color: #f810b0">10</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.Data.Odbc</span>;<br /><span style="font-style: italic; color: #008800">11</span> <span style="color: #000080; font-weight: bold">using</span> <span style="color: #000000">System.Data.OleDb</span>;<br /><span style="font-style: italic; color: #008800">12</span> <span style="color: #000080; font-weight: bold">namespace</span> <span style="color: #000000">ListView</span><br /><span style="font-style: italic; color: #008800">13</span> <span style="color: #000000">{</span><br /><span style="font-style: italic; color: #008800">14</span> &nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold">public</span> <span style="color: #000080; font-weight: bold">partial</span> <span style="color: #000080; font-weight: bold">class</span> <span style="color: #000000">Form1</span> <span style="color: #000000">:</span> <span style="color: #000000">Form</span><br /><span style="color: #f810b0">15</span> &nbsp;&nbsp;&nbsp; <span style="color: #000000">{</span><br /><span style="font-style: italic; color: #008800">16</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">OdbcConnection</span> <span style="color: #000000">DBConn</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">new</span> <span style="color: #000000">OdbcConnection</span>(<br /><span style="font-style: italic; color: #008800">17</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&quot;Driver={Mysql odbc 5.1 driver};&quot;</span> <span style="color: #000000">+</span> <br /><span style="font-style: italic; color: #008800">18</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&quot;Server=localhost;&quot;</span> <span style="color: #000000">+</span><br /><span style="font-style: italic; color: #008800">19</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&quot;database=listdata;&quot;</span> <span style="color: #000000">+</span> <br /><span style="color: #f810b0">20</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #0000ff">&quot;UID=root&quot;</span>);<br /><span style="font-style: italic; color: #008800">21</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-style: italic; color: #008800">22</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold">public</span> <span style="color: #000000">Form1</span>()<br /><span style="font-style: italic; color: #008800">23</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">{</span><br /><span style="font-style: italic; color: #008800">24</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">InitializeComponent</span>();<br /><span style="color: #f810b0">25</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">}</span><br /><span style="font-style: italic; color: #008800">26</span> <br /><span style="font-style: italic; color: #008800">27</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold">private</span> <span style="color: #000080; font-weight: bold">void</span> <span style="color: #000000">button1_Click</span>(<span style="color: #000080; font-weight: bold">object</span> <span style="color: #000000">sender</span><span style="color: #000000">,</span> <span style="color: #000000">EventArgs</span> <span style="color: #000000">e</span>)<br /><span style="font-style: italic; color: #008800">28</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">{</span><br /><span style="font-style: italic; color: #008800">29</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">DBConn</span><span style="color: #000000">.</span><span style="color: #000000">Open</span>();<br /><span style="color: #f810b0">30</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">OdbcCommand</span> <span style="color: #000000">cmd</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">new</span> <span style="color: #000000">OdbcCommand</span>(<span style="color: #0000ff">&quot;Select * from test&quot;</span><span style="color: #000000">,</span><span style="color: #000000">DBConn</span>);<br /><span style="font-style: italic; color: #008800">31</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">OdbcDataReader</span> <span style="color: #000000">reader</span> <span style="color: #000000">=</span> <span style="color: #000000">cmd</span><span style="color: #000000">.</span><span style="color: #000000">ExecuteReader</span>();<br /><span style="font-style: italic; color: #008800">32</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold">this</span><span style="color: #000000">.</span><span style="color: #000000">listView1</span><span style="color: #000000">.</span><span style="color: #000000">Items</span><span style="color: #000000">.</span><span style="color: #000000">Clear</span>();<br /><span style="font-style: italic; color: #008800">33</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000080; font-weight: bold">while</span> (<span style="color: #000000">reader</span><span style="color: #000000">.</span><span style="color: #000000">Read</span>())<br /><span style="font-style: italic; color: #008800">34</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">{</span><br /><span style="color: #f810b0">35</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">ListViewItem</span> <span style="color: #000000">lvi</span> <span style="color: #000000">=</span> <span style="color: #000080; font-weight: bold">new</span> <span style="color: #000000">ListViewItem</span>();<br /><span style="font-style: italic; color: #008800">36</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">lvi</span><span style="color: #000000">.</span><span style="color: #000000">SubItems</span><span style="color: #000000">[</span><span style="color: #0000ff">0</span><span style="color: #000000">].</span><span style="color: #000000">Text</span> <span style="color: #000000">=</span> <span style="color: #000000">reader</span><span style="color: #000000">[</span><span style="color: #0000ff">&quot;name&quot;</span><span style="color: #000000">].</span><span style="color: #000000">ToString</span>();<br /><span style="font-style: italic; color: #008800">37</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">lvi</span><span style="color: #000000">.</span><span style="color: #000000">SubItems</span><span style="color: #000000">.</span><span style="color: #000000">Add</span>(<span style="color: #000000">reader</span><span style="color: #000000">[</span><span style="color: #0000ff">&quot;age&quot;</span><span style="color: #000000">].</span><span style="color: #000000">ToString</span>());<br /><span style="font-style: italic; color: #008800">38</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">lvi</span><span style="color: #000000">.</span><span style="color: #000000">SubItems</span><span style="color: #000000">.</span><span style="color: #000000">Add</span>(<span style="color: #000000">reader</span><span style="color: #000000">[</span><span style="color: #0000ff">&quot;city&quot;</span><span style="color: #000000">].</span><span style="color: #000000">ToString</span>());<br /><span style="font-style: italic; color: #008800">39</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">lvi</span><span style="color: #000000">.</span><span style="color: #000000">SubItems</span><span style="color: #000000">.</span><span style="color: #000000">Add</span>(<span style="color: #000000">reader</span><span style="color: #000000">[</span><span style="color: #0000ff">&quot;qq&quot;</span><span style="color: #000000">].</span><span style="color: #000000">ToString</span>());<br /><span style="color: #f810b0">40</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">listView1</span><span style="color: #000000">.</span><span style="color: #000000">Items</span><span style="color: #000000">.</span><span style="color: #000000">Add</span>(<span style="color: #000000">lvi</span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br /><span style="font-style: italic; color: #008800">41</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">}</span><br /><span style="font-style: italic; color: #008800">42</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">DBConn</span><span style="color: #000000">.</span><span style="color: #000000">Close</span>();<br /><span style="font-style: italic; color: #008800">43</span> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #000000">}</span><br /><span style="font-style: italic; color: #008800">44</span> <br /><span style="color: #f810b0">45</span> &nbsp;&nbsp;&nbsp; <span style="color: #000000">}</span><br /><span style="font-style: italic; color: #008800">46</span> <span style="color: #000000">}</span><br />&nbsp;</div><p>&nbsp;</p><p>&nbsp;</p>]]></description><category>Programs</category><comments>http://www.datongyi.com/post/20.html#comment</comments><wfw:comment>http://www.datongyi.com/</wfw:comment><wfw:commentRss>http://www.datongyi.com/feed.asp?cmt=20</wfw:commentRss><trackback:ping>http://www.datongyi.com/cmd.asp?act=tb&amp;id=20&amp;key=9fe84c7f</trackback:ping></item><item><title>微软美女工程师谈.NET 4.0 Beta 中的WCF工具</title><author>a@b.com (cnwang)</author><link>http://www.datongyi.com/post/16.html</link><pubDate>Sun, 21 Mar 2010 03:16:10 +0800</pubDate><guid>http://www.datongyi.com/post/16.html</guid><description><![CDATA[<p>.NET_4.0_beta中的WCF工具 - 薛敏敏</p><p><embed mediatype="0" type="application/x-mplayer2" pluginspage="http://microsoft.com/windows/mediaplayer/en/download/" src="http://you.video.sina.com.cn/api/sinawebApi/outplayrefer.php/vid=30504844_1700099614/s.swf" autostart="true" loop="true" menu="true" width="445" height="350"></embed></p>]]></description><category>Programs</category><comments>http://www.datongyi.com/post/16.html#comment</comments><wfw:comment>http://www.datongyi.com/</wfw:comment><wfw:commentRss>http://www.datongyi.com/feed.asp?cmt=16</wfw:commentRss><trackback:ping>http://www.datongyi.com/cmd.asp?act=tb&amp;id=16&amp;key=63b87d90</trackback:ping></item><item><title>C#设计模式之简单工厂</title><author>a@b.com (cnwang)</author><link>http://www.datongyi.com/post/13.html</link><pubDate>Thu, 18 Mar 2010 21:23:05 +0800</pubDate><guid>http://www.datongyi.com/post/13.html</guid><description><![CDATA[<p>在面向对象程序设计中，我们经常看到的一促设计模式就是简单工厂模式(Simple Factory Pattern).工厂根据提供给它的数据，返回几个可能类中的一个实例。通常返回的类都有一个共同的父类和共同的方法，但每个方法执行的任务不同，而且根据不同的数据进行了优化。简单工厂实际上不属于23个GOF模式，但它可以作为其它模式的一个引导。 我们看简单工厂的类图： <img onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/6.jpg" alt="" title=""/> 图中，X是一个基类，Xa和Xb从X中派生。XFactory根据给出的参数决定返回哪一个子类。返回哪一个类的实例与程序员无关，因为这些类有相同的方法，只是实现不同。返回哪一个类的实例完全取决于工厂。 我们来看一个例子： 我们知道英文名字可以有两种书写方式：&quot;firstname lastname&quot;或&quot;lastname,fristname&quot;假设我们能通过判断lastname与fristname之间有无逗号来确定名字的顺序。这里我们用简单工厂来实现。当然，你用别的方法也许理简单，但我在这里只是讲解一个简单工厂是如何工作的。我们先来定义一个简单的类，它能用构造函数接收表示名字的字符串，并且可以从类中取回名字。 <textarea class="code" rows="10" cols="50">&nbsp;&nbsp;public&nbsp;class&nbsp;Namer
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;string&nbsp;frName,lName;
&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;first&nbsp;name
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;getFrName()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;frName;
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;//return&nbsp;last&nbsp;name
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;string&nbsp;getLName()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;lName;
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;}</textarea> <br/>接下来写两个简单的派生类。 FirstFirst类：假设每个名字的最后一个空格前面的所有部分都属于firstname。 <br/><textarea class="code" rows="10" cols="50">&nbsp;&nbsp;public&nbsp;class&nbsp;FirstFirst:Namer
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;FirstFirst(string&nbsp;name)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i=name.Trim().IndexOf("&nbsp;");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&gt;0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frName=name.Substring(0,i).Trim();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lName=name.Substring(i+1).Trim();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lName=name;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frName="";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</textarea> <br/>LastFirst类：用逗号给lastname分界。当空格或逗号不存在时，两个类里都提供了错误校正。 <br/><textarea class="code" rows="10" cols="50">&nbsp;&nbsp;public&nbsp;class&nbsp;LastFrist:Namer
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;LastFrist(string&nbsp;name)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i=name.IndexOf(",");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&gt;0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lName=name.Substring(0,i);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frName=name.Substring(i+1).Trim();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lName=name;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frName="";
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}</textarea><br/> 接下来我们的事就是构造一个简单工厂了。它只检测逗号是否存在，然后返回某个类的一个实例。<br/> <textarea class="code" rows="10" cols="50">&nbsp;&nbsp;public&nbsp;class&nbsp;NameFactory
&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;NameFactory()
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;Namer&nbsp;getName(string&nbsp;name)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i=name.IndexOf(",");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&gt;0)
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;LastFrist(name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;FirstFirst(name);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;&nbsp;&nbsp;}
&nbsp;&nbsp;}</textarea><br/> 最后我们来检测一下： <br/><textarea class="code" rows="10" cols="50">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;void&nbsp;Main(string[]&nbsp;args)
&nbsp;&nbsp;&nbsp;&nbsp;{
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("请输入你的Name:");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NameFactory&nbsp;nameFactory=new&nbsp;NameFactory();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string&nbsp;str=Console.ReadLine();
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Namer&nbsp;nm=nameFactory.getName(str);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("First&nbsp;Name:"+nm.getFrName());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Last&nbsp;&nbsp;Name:"+nm.getLName());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.Write("Press&nbsp;any&nbsp;key&nbsp;to&nbsp;continue&nbsp;.&nbsp;.&nbsp;.&nbsp;");
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.ReadKey(true);
&nbsp;&nbsp;&nbsp;&nbsp;}</textarea> <br/>F5运行。输入 Barack Obama 和 Datongyi,cnwang来检测结果：<br/><img onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/a.jpg" alt="" title=""/><img onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/b.jpg" alt="" title=""/> <br/>这里我们构建一个接口，允许用户用两种方式输入名字，然后将其拆分，显示给用户。我们不需要知道它使用了哪个派生类。工厂为我们提供了这个类。我们只要知道的就是它有两个get的方法。 这就是简单工厂的基本工作原理。创建一个抽象的工厂，它决定使用哪一个类，然后调用这个类实例的方法。而用户不需要知道它到底使用了哪个类。</p>]]></description><category>Programs</category><comments>http://www.datongyi.com/post/13.html#comment</comments><wfw:comment>http://www.datongyi.com/</wfw:comment><wfw:commentRss>http://www.datongyi.com/feed.asp?cmt=13</wfw:commentRss><trackback:ping>http://www.datongyi.com/cmd.asp?act=tb&amp;id=13&amp;key=3467adaa</trackback:ping></item><item><title>MSSQL2005 用户'sa'登录失败。错误18456</title><author>a@b.com (cnwang)</author><link>http://www.datongyi.com/post/11.html</link><pubDate>Thu, 18 Mar 2010 12:39:19 +0800</pubDate><guid>http://www.datongyi.com/post/11.html</guid><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;因密码或用户名错误而使身份验证失败并导致连接尝试被拒时，类似下面的消息将返回到客户端<span style="color: #ff0000">：&ldquo;用户 'sa' 登录失败&rdquo;。（Microsoft SQL Server，错误: 18456）&rdquo;</span>。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了增强安全性，返回到客户端的错误消息有意隐藏身份验证错误的本质。但是，在 SQL Server 错误日志中，对应的错误包含映射到身份验证失败条件的错误状态。将错误状态与以下列表进行比较以确定登录失败的原因。</p><table style="width: 474px; height: 214px" border="1" cellspacing="1" cellpadding="1" width="474" align="left">    <tbody>        <tr>            <td>2</td>            <td>            <p>用户 ID 无效。</p>            </td>        </tr>        <tr>            <td>6</td>            <td>            <p>尝试同时使用 SQL Server 身份验证与 Windows 登录名。</p>            </td>        </tr>        <tr>            <td>7</td>            <td>            <p>登录已禁用，密码不正确。</p>            </td>        </tr>        <tr>            <td>8</td>            <td>            <p>密码不正确。</p>            </td>        </tr>        <tr>            <td>9</td>            <td>            <p>密码无效。</p>            </td>        </tr>        <tr>            <td>11</td>            <td>            <p>登录有效，但服务器访问失败。</p>            </td>        </tr>        <tr>            <td>13</td>            <td>            <p>登录是有效的登录，但服务器访问失败。</p>            </td>        </tr>        <tr>            <td>18</td>            <td>            <p>必须更改密码。</p>            </td>        </tr>    </tbody></table><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果在安装过程中选择<strong>&ldquo;Windows 身份验证模式&rdquo;</strong>，则 sa 登录名将被禁用。如果稍后将身份验证模式更改为<strong>&ldquo;SQL Server 和 Windows 身份验证模式&rdquo;</strong>，则 sa 登录名仍处于禁用状态。这会导致状态 7 错误：&ldquo;用户 'sa' 登录失败&rdquo;。若要启用 sa 登录帐户，请使用 ALTER LOGIN 语句。</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;众所周知，sa 帐户是一个广为人知的 SQL Server 帐户，并且经常成为恶意用户的攻击目标。除非您的应用程序需要使用 sa 帐户，否则请不要启用它。为 sa 登录名使用一个强密码非常重要。</p><p><span style="color: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sa 登录名只能使用 SQL Server 身份验证连接到服务器。</span></p><p><span style="font-size: medium"><span style="font-family: 黑体">更改安全验证模式：</span></span></p><ol>    <li>    <p>在 SQL Server Management Studio 的对象资源管理器中，右键单击服务器，再单击<strong>&ldquo;属性&rdquo;</strong>。</p>    </li>    <li>    <p>在<strong>&ldquo;安全性&rdquo;</strong>页上的<strong>&ldquo;服务器身份验证&rdquo;</strong>下，选择新的服务器身份验证模式，再单击<strong>&ldquo;确定&rdquo;</strong>。</p>    </li>    <li>    <p>在 SQL Server Management Studio 对话框中，单击<strong>&ldquo;确定&rdquo;</strong>以确认需要重新启动 SQL Server</p>    </li></ol><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.在对象资源管理器中，右键单击您的服务器，再单击<strong>&ldquo;重新启动&rdquo;</strong>。如果运行有 SQL Server 代理，则也必须重新启动该代理</p><p><span style="font-size: medium"><span style="font-family: 黑体">使用 Management Studio 启用 sa 登录帐户</span></span></p><ol>    <li>    <p>在对象资源管理器中，依次展开<strong>&ldquo;安全&rdquo;</strong>、&ldquo;登录名&rdquo;，右键单击<strong>&ldquo;sa&rdquo;</strong>，再单击<strong>&ldquo;属性&rdquo;</strong>。</p>    </li>    <li>    <p>在<strong>&ldquo;常规&rdquo;</strong>页上，您可能需要为 sa 登录名创建密码并确认该密码。</p>    </li>    <li>    <p>在<strong>&ldquo;状态&rdquo;</strong>页上的<strong>&ldquo;登录&rdquo;</strong>部分中，单击<strong>&ldquo;启用&rdquo;</strong>，然后单击<strong>&ldquo;确定&rdquo;</strong>。&nbsp;</p>    </li></ol><p><img style="width: 387px; height: 342px" title="" alt="" onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/SQL001.jpg" /></p><p>&nbsp;</p><p><img title="" alt="" onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/sql002.jpg" /><img title="" alt="" onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/sql003.jpg" /><img title="" alt="" onload="ResizeImage(this,520)" src="http://www.datongyi.com/upload/sql004.jpg" /></p>]]></description><category>Programs</category><comments>http://www.datongyi.com/post/11.html#comment</comments><wfw:comment>http://www.datongyi.com/</wfw:comment><wfw:commentRss>http://www.datongyi.com/feed.asp?cmt=11</wfw:commentRss><trackback:ping>http://www.datongyi.com/cmd.asp?act=tb&amp;id=11&amp;key=b48d08bc</trackback:ping></item></channel></rss>
