<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Qihangnet's Blog! - DATABASE</title>
    <link>http://www.qihangnet.com/</link>
    <description>——DotNet技术研究</description>
    <language>zh-cn</language>
    <copyright>衣明志</copyright>
    <lastBuildDate>Tue, 09 Jun 2009 05:05:00 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>qihangnet@hotmail.com</managingEditor>
    <webMaster>qihangnet@hotmail.com</webMaster>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=c45df2d6-7cbf-433b-b82e-0b5712f9d0c6</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,c45df2d6-7cbf-433b-b82e-0b5712f9d0c6.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,c45df2d6-7cbf-433b-b82e-0b5712f9d0c6.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=c45df2d6-7cbf-433b-b82e-0b5712f9d0c6</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
在给客户解决一个小的技术问题时，发现一些技术人员对SQL2005的T-SQL还有些东西是不太熟悉的，这次我就通过与SQL2000对比着来说一下SQL2005的TOP子句吧。 
</p>
        <p>
首先说一下大家熟悉的SELECT语句。
</p>
        <blockquote>
          <p>
SQL2000中我们主要类似这样写：SELECT TOP 10 * FROM [News] ORDER BY [Id] DESC。这样我就能获取News表按Id列倒序的前10条记录。那么一个小问题就来了，我们知道SQL2000的TOP后面只能跟常量的，不能跟变量的，如果我们把这个语句放在一个存储过程中，而由于业务原因一些地方需要取出同样条件的10条有些20条还有57条……，那么我们怎么办呢？很多人说“简单啊，存储过中声明一个
@Top AS INT 的参数，然后先写一行SET ROWCOUNT @Top;然后写一行SELECT * FROM [News] ORDER BY [Id] DESC;
就行了。对了，最好在后面紧接着加上SET ROWCOUNT 0; 以避免影响后面的查询语句”。嗯这个回答在SQL2000是比较对的，起码比回答重新组合SQL语句的要好一些，尤其最好不要忘记那个SET
ROWCOUNT 0; 但是我们看到这种方式在实际应用中，体验是不好的，一旦语句复杂到一定程度时，SET ROWCOUNT前后影响可能会让SQL编写人员撞墙。ok,那么我们在SQL2005中该如何处理呢？<br />
SQL2005中SELECT语句的TOP则方便多了，因为TOP支持使用任意的独立表达式，而不仅仅是常量。所以我们上面的同样问题可以简化为:SELECT TOP (@Top)
* FROM [News] ORDER BY [Id] DESC。人性化多了，而且语句表达的意思很明确，不会像使用SET ROWCOUNT那样让人郁闷不已。
</p>
        </blockquote>
        <p>
再说一下INSERT、UPDATE和DELETE等修改语句吧。
</p>
        <blockquote>
          <p>
对于这三种操作我们似乎依然可以使用SET ROWCOUNT来处理，但是我们知道这种方式的体验之差，对复杂语句尤甚。而且我们知道“<em>对于在远程表和本地及远程分区视图上执行的
INSERT、UPDATE 和 DELETE 语句，将忽略 SET ROWCOUNT 选项设置</em>”，也就是说在远程查询时这个东西就不管用了。我们还在SQL2008的联机丛书中还发现这样一段<strong>重要提示</strong>：<br />
“<em>在 SQL Server 的下一个版本中，使用 SET ROWCOUNT 将不会影响 DELETE、INSERT 和 UPDATE 语句。请不要在新的开发工作中将
SET ROWCOUNT 与 DELETE、INSERT 和 UPDATE 语句一起使用，并应准备修改当前使用它的应用程序。另外，对于当前使用 SET ROWCOUNT
的 DELETE、INSERT 和 UPDATE 语句，建议您使用 TOP 语法重写它们。</em>”<br />
正如上述提示中诉说的，我们应该选择更灵活、更人性化，而且还能在未来升级到新版本SQL数据库时减少麻烦的TOP子句。三种例句如下：<br />
INSERT TOP(100) INTO [News] SELECT [Id],[Title]，[Author] from [OldNews];<br />
UPDATE TOP(500) [News] SET [Author] = N'qihangnet' WHERE Id &gt;2009; 
<br />
DELETE TOP(100) FROM [News];
</p>
          <p>
值得注意的是上述这三种修改数据表的语句中，我们均无法直接使用ORDER BY附加排序条件，所以上述三种语句带有一定的随机性，尤其是UPDATE和DELETE语句。当然这种随机性有其两面性，优点是比如在按量分配工作的业务中，可以很方便的使用UPDATE进行随机性修改一定量的数据；缺点是当我们想通过排序控制一定量的数据时就不好了。那么真对于这种缺点我们是否就没有办法了呢？其实在SQL2005中，已经提供了可以轻松解决这个问题的方法，那就是利用WITH语句。具体方法在我们稍后的讨论WITH语句的博客文章中进行说明，并通过几个例子来详细说明一下WITH的妙用。
</p>
        </blockquote>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>SQL 2005 中的 TOP子句</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,c45df2d6-7cbf-433b-b82e-0b5712f9d0c6.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,c45df2d6-7cbf-433b-b82e-0b5712f9d0c6.aspx</link>
      <pubDate>Tue, 09 Jun 2009 05:05:00 GMT</pubDate>
      <description>&lt;p&gt;
在给客户解决一个小的技术问题时，发现一些技术人员对SQL2005的T-SQL还有些东西是不太熟悉的，这次我就通过与SQL2000对比着来说一下SQL2005的TOP子句吧。 
&lt;p&gt;
首先说一下大家熟悉的SELECT语句。
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
SQL2000中我们主要类似这样写：SELECT TOP 10 * FROM [News] ORDER BY [Id] DESC。这样我就能获取News表按Id列倒序的前10条记录。那么一个小问题就来了，我们知道SQL2000的TOP后面只能跟常量的，不能跟变量的，如果我们把这个语句放在一个存储过程中，而由于业务原因一些地方需要取出同样条件的10条有些20条还有57条……，那么我们怎么办呢？很多人说“简单啊，存储过中声明一个
@Top AS INT 的参数，然后先写一行SET ROWCOUNT @Top;然后写一行SELECT * FROM [News] ORDER BY [Id] DESC;
就行了。对了，最好在后面紧接着加上SET ROWCOUNT 0; 以避免影响后面的查询语句”。嗯这个回答在SQL2000是比较对的，起码比回答重新组合SQL语句的要好一些，尤其最好不要忘记那个SET
ROWCOUNT 0; 但是我们看到这种方式在实际应用中，体验是不好的，一旦语句复杂到一定程度时，SET ROWCOUNT前后影响可能会让SQL编写人员撞墙。ok,那么我们在SQL2005中该如何处理呢？&lt;br&gt;
SQL2005中SELECT语句的TOP则方便多了，因为TOP支持使用任意的独立表达式，而不仅仅是常量。所以我们上面的同样问题可以简化为:SELECT TOP (@Top)
* FROM [News] ORDER BY [Id] DESC。人性化多了，而且语句表达的意思很明确，不会像使用SET ROWCOUNT那样让人郁闷不已。
&lt;/p&gt;
&lt;/blockquote&gt; 
&lt;p&gt;
再说一下INSERT、UPDATE和DELETE等修改语句吧。
&lt;/p&gt;
&lt;blockquote&gt; 
&lt;p&gt;
对于这三种操作我们似乎依然可以使用SET ROWCOUNT来处理，但是我们知道这种方式的体验之差，对复杂语句尤甚。而且我们知道“&lt;em&gt;对于在远程表和本地及远程分区视图上执行的
INSERT、UPDATE 和 DELETE 语句，将忽略 SET ROWCOUNT 选项设置&lt;/em&gt;”，也就是说在远程查询时这个东西就不管用了。我们还在SQL2008的联机丛书中还发现这样一段&lt;strong&gt;重要提示&lt;/strong&gt;：&lt;br&gt;
“&lt;em&gt;在 SQL Server 的下一个版本中，使用 SET ROWCOUNT 将不会影响 DELETE、INSERT 和 UPDATE 语句。请不要在新的开发工作中将
SET ROWCOUNT 与 DELETE、INSERT 和 UPDATE 语句一起使用，并应准备修改当前使用它的应用程序。另外，对于当前使用 SET ROWCOUNT
的 DELETE、INSERT 和 UPDATE 语句，建议您使用 TOP 语法重写它们。&lt;/em&gt;”&lt;br&gt;
正如上述提示中诉说的，我们应该选择更灵活、更人性化，而且还能在未来升级到新版本SQL数据库时减少麻烦的TOP子句。三种例句如下：&lt;br&gt;
INSERT TOP(100) INTO [News] SELECT [Id],[Title]，[Author] from [OldNews];&lt;br&gt;
UPDATE TOP(500) [News] SET [Author] = N'qihangnet' WHERE Id &gt;2009; 
&lt;br&gt;
DELETE TOP(100) FROM [News];
&lt;/p&gt;
&lt;p&gt;
值得注意的是上述这三种修改数据表的语句中，我们均无法直接使用ORDER BY附加排序条件，所以上述三种语句带有一定的随机性，尤其是UPDATE和DELETE语句。当然这种随机性有其两面性，优点是比如在按量分配工作的业务中，可以很方便的使用UPDATE进行随机性修改一定量的数据；缺点是当我们想通过排序控制一定量的数据时就不好了。那么真对于这种缺点我们是否就没有办法了呢？其实在SQL2005中，已经提供了可以轻松解决这个问题的方法，那就是利用WITH语句。具体方法在我们稍后的讨论WITH语句的博客文章中进行说明，并通过几个例子来详细说明一下WITH的妙用。
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,c45df2d6-7cbf-433b-b82e-0b5712f9d0c6.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=f619b66e-515f-4abb-ab7e-b769b9791bfa</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,f619b66e-515f-4abb-ab7e-b769b9791bfa.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,f619b66e-515f-4abb-ab7e-b769b9791bfa.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f619b66e-515f-4abb-ab7e-b769b9791bfa</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
    近期在对一些客户做技术培训的时候，发现了一个问题。一些我们平常天天在用的软件工具，比如：Windows、Office、SQL
Server、Visual Studio等等，很多都没有得到用户较充分的使用。很多已经被软件厂商早已攻克的问题，却在用户那里在被重复研究解决方案，原因为什么？因为用户根本不知道原来这个每天都在用的软件工具还有这样或那样的功能，可以解决我们目前所碰到的问题。比如说：
</p>
        <ul>
          <li>
Excel就已经可以轻松解决家庭的收支结算问题，有人却偏偏要安装什么管家婆或者形形色色的所谓家庭财务管理软件，甚至还要求你安装个sql server呢。难道你只把excel当作一个普通表格使用吗？</li>
          <li>
不少人抱怨Word排版很差，对文章分层次时，要手工敲入那些“第一、第二”或者“1)、2)”等，为什么不用编号功能呢？</li>
          <li>
sql server 2005 有个“数据库引擎优化顾问”，可以在一定程度上帮助优化数据库，而对应于sql 2000中也存在“索引优化向导”，而他们都依赖于sql
profile，另外数据库有执行计划等一系列分析优化的工具，为什么连这些都没用过就问人索要什么优化工具呢？</li>
          <li>
Windows自身就带有磁盘清理等系统优化工具，为啥你只为了清理一下系统盘的空间，却要安装“超级**”或是“**优化大师”呢？</li>
        </ul>
        <p>
    上述都只是一些简单的例子，但在相当多用户中存在类似的问题，而在软件开发人员中问题依然不少见。问题出在哪里，用户自身是问题之一，而作为软件提供商来说，是否应该考虑一下自身的问题，是否应该下一下功夫对用户进行培训教育呢？UI是否可以设计的再合理一些，让用户更直接的了解到软件的已有功能呢？
</p>
        <p>
     正如某些分析师说的：“<em>微软的Windows、Word和Excel等产品中功能丰富,但消费者却并不完全了解.其结果就是,消费者耗费大量的时间来解决一些微软产品已经攻克的问题.因此,鲍尔默应该在该领域投入一笔资金,以帮助用户了解微软产品的功能</em>”。个人认为这样这个问题不光是微软应该考虑的问题，IBM、Oracle以及我们国内的金山等软件企业是否也应该思考呢？共享软件作者亦应如此。
</p>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>关于软件用户教育的思考</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,f619b66e-515f-4abb-ab7e-b769b9791bfa.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,f619b66e-515f-4abb-ab7e-b769b9791bfa.aspx</link>
      <pubDate>Mon, 07 Jul 2008 09:22:05 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 近期在对一些客户做技术培训的时候，发现了一个问题。一些我们平常天天在用的软件工具，比如：Windows、Office、SQL
Server、Visual Studio等等，很多都没有得到用户较充分的使用。很多已经被软件厂商早已攻克的问题，却在用户那里在被重复研究解决方案，原因为什么？因为用户根本不知道原来这个每天都在用的软件工具还有这样或那样的功能，可以解决我们目前所碰到的问题。比如说：
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Excel就已经可以轻松解决家庭的收支结算问题，有人却偏偏要安装什么管家婆或者形形色色的所谓家庭财务管理软件，甚至还要求你安装个sql server呢。难道你只把excel当作一个普通表格使用吗？&lt;/li&gt;
&lt;li&gt;
不少人抱怨Word排版很差，对文章分层次时，要手工敲入那些“第一、第二”或者“1)、2)”等，为什么不用编号功能呢？&lt;/li&gt;
&lt;li&gt;
sql server 2005 有个“数据库引擎优化顾问”，可以在一定程度上帮助优化数据库，而对应于sql 2000中也存在“索引优化向导”，而他们都依赖于sql
profile，另外数据库有执行计划等一系列分析优化的工具，为什么连这些都没用过就问人索要什么优化工具呢？&lt;/li&gt;
&lt;li&gt;
Windows自身就带有磁盘清理等系统优化工具，为啥你只为了清理一下系统盘的空间，却要安装“超级**”或是“**优化大师”呢？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; 上述都只是一些简单的例子，但在相当多用户中存在类似的问题，而在软件开发人员中问题依然不少见。问题出在哪里，用户自身是问题之一，而作为软件提供商来说，是否应该考虑一下自身的问题，是否应该下一下功夫对用户进行培训教育呢？UI是否可以设计的再合理一些，让用户更直接的了解到软件的已有功能呢？
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 正如某些分析师说的：“&lt;em&gt;微软的Windows、Word和Excel等产品中功能丰富,但消费者却并不完全了解.其结果就是,消费者耗费大量的时间来解决一些微软产品已经攻克的问题.因此,鲍尔默应该在该领域投入一笔资金,以帮助用户了解微软产品的功能&lt;/em&gt;”。个人认为这样这个问题不光是微软应该考虑的问题，IBM、Oracle以及我们国内的金山等软件企业是否也应该思考呢？共享软件作者亦应如此。
&lt;/p&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,f619b66e-515f-4abb-ab7e-b769b9791bfa.aspx</comments>
      <category>DATABASE</category>
      <category>Visual Studio</category>
      <category>技术咨询</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=b1fd9b39-eabd-4e27-a265-61ec4b507cbd</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,b1fd9b39-eabd-4e27-a265-61ec4b507cbd.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,b1fd9b39-eabd-4e27-a265-61ec4b507cbd.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=b1fd9b39-eabd-4e27-a265-61ec4b507cbd</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
在一些网站或者软件系统中，由于安全或者程序异常等问题，可能会在SQL Server 2000中造成一个异常问题：在企业管理器中打开数据库发现有一些“坏表”，即无法使用，也无法正常删除。其原因往往是因为在尝试建表的过程中，只向数据库服务器的系统表sysobjects中写入了类型为“U”的记录，却并未真正在数据库中成功创建该表的实体。ok，解决问题有思路了:
</p>
        <p>
假设“坏表”的表名为cmd，那么我们在查询分析器中对当前的数据库写一个sql语句：
</p>
        <p>
delete from sysobjects where [name]='cmd' and xtype='U'
</p>
        <p>
按F5执行，可能会碰到一个错误提示：“未启用对系统目录的特殊更新。系统管理员必须重新配置 SQL Server 以允许这种操作。” 解决这个小小的问题的方法是：打开mssql
server 属性---》服务器选项----》启用对系统目录的特殊更新(允许对系统目录进行直接修改)  即可。之后重新在查询分析器中执行刚才的sql语句。
</p>
        <p>
执行成功后。在企业管理器中会发现那个坏表已经不存在了。
</p>
        <p>
[ 注：SQL2005中，由于微软做了重大调整，正常情况下不允许对系统表进行即席更新操作。所以本文提到的问题目前仅适用于SQL2000数据库，敬请注意 ]
</p>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>SQL2000数据库中删除&amp;ldquo;坏表&amp;rdquo;的方法</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,b1fd9b39-eabd-4e27-a265-61ec4b507cbd.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,b1fd9b39-eabd-4e27-a265-61ec4b507cbd.aspx</link>
      <pubDate>Tue, 27 Nov 2007 15:35:54 GMT</pubDate>
      <description>&lt;p&gt;
在一些网站或者软件系统中，由于安全或者程序异常等问题，可能会在SQL Server 2000中造成一个异常问题：在企业管理器中打开数据库发现有一些“坏表”，即无法使用，也无法正常删除。其原因往往是因为在尝试建表的过程中，只向数据库服务器的系统表sysobjects中写入了类型为“U”的记录，却并未真正在数据库中成功创建该表的实体。ok，解决问题有思路了:
&lt;/p&gt;
&lt;p&gt;
假设“坏表”的表名为cmd，那么我们在查询分析器中对当前的数据库写一个sql语句：
&lt;/p&gt;
&lt;p&gt;
delete from sysobjects where [name]='cmd' and xtype='U'
&lt;/p&gt;
&lt;p&gt;
按F5执行，可能会碰到一个错误提示：“未启用对系统目录的特殊更新。系统管理员必须重新配置 SQL Server 以允许这种操作。” 解决这个小小的问题的方法是：打开mssql
server 属性---》服务器选项----》启用对系统目录的特殊更新(允许对系统目录进行直接修改)&amp;nbsp; 即可。之后重新在查询分析器中执行刚才的sql语句。
&lt;/p&gt;
&lt;p&gt;
执行成功后。在企业管理器中会发现那个坏表已经不存在了。
&lt;/p&gt;
&lt;p&gt;
[ 注：SQL2005中，由于微软做了重大调整，正常情况下不允许对系统表进行即席更新操作。所以本文提到的问题目前仅适用于SQL2000数据库，敬请注意 ]
&lt;/p&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,b1fd9b39-eabd-4e27-a265-61ec4b507cbd.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=5267386a-5a0a-43c4-abf3-160249e7a1d7</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,5267386a-5a0a-43c4-abf3-160249e7a1d7.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,5267386a-5a0a-43c4-abf3-160249e7a1d7.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=5267386a-5a0a-43c4-abf3-160249e7a1d7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
asp.net 2.0中引入的Membership机制给我们做web开发带来很多便利，使得我们在做很多项目开发时处理用户和角色及权限问题时减少了相当的工作量。不过我们开发中可能会碰到一个小小的问题如下：
</p>
        <p>
我们知道MembershipUser中有如下重载的方法
</p>
        <ul>
          <li>
            <font color="#0000ff">MembershipUser.ResetPassword ()</font> ：将用户密码重置为一个自动生成的新密码。 
</li>
          <li>
            <font color="#0000ff">MembershipUser.ResetPassword (String passwordAnswer)</font> ：将用户密码重置为一个自动生成的新密码。</li>
        </ul>
        <p>
msdn中有如下描述：
</p>
        <p>
          <em>
            <b>ResetPassword</b> 调用 ProviderName 属性所引用的成员资格提供程序的 MembershipProvider.ResetPassword
方法，以将成员资格用户的密码重置为自动生成的新密码。然后将该新密码返回到调用方。</em>
        </p>
        <p>
          <em>如果 EnablePasswordReset 为 <b>false</b>，则成员资格提供程序将返回一个异常。</em>
        </p>
        <p>
          <em>如果 RequiresQuestionAndAnswer 为 <b>true</b>，则必须使用以密码提示问题答案作为参数的 ResetPassword 重载方法，并提供成员资格用户的密码。如果需要密码答案并提供了不正确的密码答案，成员资格提供程序将引发
MembershipPasswordException。</em>
        </p>
        <p>
而另外一个方法<font color="#0000ff">MembershipUser.ChangePassword(String oldPassword, String
newPassword)</font> 又必须提供原始密码，那么这里就产生了一个矛盾：我们希望用户能够通过安全问题和答案来作为找回密码，又希望管理员可以重置某用户的密码怎么办？上述方法均无法直接使用，要么使用<font color="#0000ff">MembershipUser.ResetPassword
()</font>而无安全问题和答案验证，要么必须知道问题答案或者原始密码，我们知道这些安全相关的东西我们都是加密的，而且往往采用单向编码的方式，也是说我们不可能轻易的通过读取数据库数据知道用户的答案和旧密码！那么好，如何解决这个问题呢？下面我来提供一个小的解决方案：
</p>
        <p>
Membership的数据库中包含有一个设置用户密码的存储过程：
</p>
        <pre class="csharpcode">
          <span class="kwrd">CREATE</span>
          <span class="kwrd">PROCEDURE</span> aspnet_Membership_SetPassword
( @ApplicationName nvarchar(256), @UserName nvarchar(256), @NewPassword nvarchar(128),
@PasswordSalt nvarchar(128), @CurrentTimeUtc datetime, @PasswordFormat <span class="kwrd">int</span> =
0 ) </pre>
        <style type="text/css">.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
</style>
        <p>
返回值：成功返回 0； 
<br />
用户不存在，返回 1； 
</p>
        <p>
        </p>
        <p>
那么ok,我们开始解决我们的需求吧！思路很简单我们先设置用户一个默认的密码，然后以该密码为旧密码使用<font color="#0000ff">MembershipUser.ChangePassword(String
oldPassword, String newPassword)</font> 修改用户的密码。下面的代码是在以DataAccess.RunProcedure方法是已经实现的执行存储过程的方法为前提编写的： 
</p>
        <p>
        </p>
        <div class="csharpcode">
          <pre>
            <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
              <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span>
              <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">class</span> MembershipSafe
{ <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> ResetPassword(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> username)
{ <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//将用户密码修改为8位且包含一个特殊符号的随机密码</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> ResetPassword(username,
Membership.GeneratePassword(8,1)); } <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">public</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">static</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> ResetPassword(<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> username, <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">string</span> newpassword)
{ <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//先将用户密码修改为123123</span> SqlParameter[]
_sp <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> { <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SqlParameter(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@ApplicationName"</span>,Membership.ApplicationName)
,<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SqlParameter(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@UserName"</span>,username)
,<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SqlParameter(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@NewPassword"</span>,<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"1M4h3eZLAKW1WbVTTwYJiJZa33w="</span>)
,<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SqlParameter(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@PasswordSalt"</span>,<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"rcVy3pCccZ9tXW7NHp1Maw=="</span>)
,<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SqlParameter(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@CurrentTimeUtc"</span>,DateTime.Now)
,<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">new</span> SqlParameter(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"@PasswordFormat"</span>,1)
}; <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bool</span> op <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">=</span> DataAccess.RunProcedure(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"aspnet_Membership_SetPassword"</span>,
_sp) == 0; <span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">//以123123为原始密码，修改为新密码</span> Membership.GetUser(username).ChangePassword(<span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4">"123123"</span>,
newpassword); <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">return</span> newpassword;
} } </span>
          </pre>
        </div>
        <p>
          <strong>注：</strong>以上代码仅做参考，不一定是符合您具体项目的需求，比如有人可能会继续问修改了密码怎么告诉用户啊，答案是发邮件或者电话通知啊，哈哈～～
</p>
        <p>
          <strong>推荐浏览：</strong>
        </p>
        <ul>
          <li>
            <a href="http://www.cnblogs.com/windman" target="_blank">Windman</a>写的 ＂<a href="http://www.cnblogs.com/windman/archive/2006/09/06/496722.html">揪出ASP.NET
2.0四大“插件”的总后台 -- ASPNETDB</a> ＂</li>
        </ul>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>asp.net 应用中的Membership 重置密码问题</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,5267386a-5a0a-43c4-abf3-160249e7a1d7.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,5267386a-5a0a-43c4-abf3-160249e7a1d7.aspx</link>
      <pubDate>Wed, 13 Jun 2007 06:41:02 GMT</pubDate>
      <description>&lt;p&gt;
asp.net 2.0中引入的Membership机制给我们做web开发带来很多便利，使得我们在做很多项目开发时处理用户和角色及权限问题时减少了相当的工作量。不过我们开发中可能会碰到一个小小的问题如下：
&lt;/p&gt;
&lt;p&gt;
我们知道MembershipUser中有如下重载的方法
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;font color=#0000ff&gt;MembershipUser.ResetPassword ()&lt;/font&gt; ：将用户密码重置为一个自动生成的新密码。 
&lt;li&gt;
&lt;font color=#0000ff&gt;MembershipUser.ResetPassword (String passwordAnswer)&lt;/font&gt; ：将用户密码重置为一个自动生成的新密码。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
msdn中有如下描述：
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;b&gt;ResetPassword&lt;/b&gt; 调用 ProviderName 属性所引用的成员资格提供程序的 MembershipProvider.ResetPassword
方法，以将成员资格用户的密码重置为自动生成的新密码。然后将该新密码返回到调用方。&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;如果 EnablePasswordReset 为 &lt;b&gt;false&lt;/b&gt;，则成员资格提供程序将返回一个异常。&lt;/em&gt; 
&lt;p&gt;
&lt;em&gt;如果 RequiresQuestionAndAnswer 为 &lt;b&gt;true&lt;/b&gt;，则必须使用以密码提示问题答案作为参数的 ResetPassword 重载方法，并提供成员资格用户的密码。如果需要密码答案并提供了不正确的密码答案，成员资格提供程序将引发
MembershipPasswordException。&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
而另外一个方法&lt;font color=#0000ff&gt;MembershipUser.ChangePassword(String oldPassword, String
newPassword)&lt;/font&gt; 又必须提供原始密码，那么这里就产生了一个矛盾：我们希望用户能够通过安全问题和答案来作为找回密码，又希望管理员可以重置某用户的密码怎么办？上述方法均无法直接使用，要么使用&lt;font color=#0000ff&gt;MembershipUser.ResetPassword
()&lt;/font&gt;而无安全问题和答案验证，要么必须知道问题答案或者原始密码，我们知道这些安全相关的东西我们都是加密的，而且往往采用单向编码的方式，也是说我们不可能轻易的通过读取数据库数据知道用户的答案和旧密码！那么好，如何解决这个问题呢？下面我来提供一个小的解决方案：
&lt;/p&gt;
&lt;p&gt;
Membership的数据库中包含有一个设置用户密码的存储过程：
&lt;/p&gt;
&lt;pre class=csharpcode&gt;&lt;span class=kwrd&gt;CREATE&lt;/span&gt; &lt;span class=kwrd&gt;PROCEDURE&lt;/span&gt; aspnet_Membership_SetPassword
( @ApplicationName nvarchar(256), @UserName nvarchar(256), @NewPassword nvarchar(128),
@PasswordSalt nvarchar(128), @CurrentTimeUtc datetime, @PasswordFormat &lt;span class=kwrd&gt;int&lt;/span&gt; =
0 ) &lt;/pre&gt;
&lt;style type=text/css&gt;.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }
&lt;/style&gt;
&lt;p&gt;
返回值：成功返回 0； 
&lt;br&gt;
用户不存在，返回 1； 
&lt;p&gt;
&lt;p&gt;
那么ok,我们开始解决我们的需求吧！思路很简单我们先设置用户一个默认的密码，然后以该密码为旧密码使用&lt;font color=#0000ff&gt;MembershipUser.ChangePassword(String
oldPassword, String newPassword)&lt;/font&gt; 修改用户的密码。下面的代码是在以DataAccess.RunProcedure方法是已经实现的执行存储过程的方法为前提编写的： 
&lt;p&gt;
&lt;div class=csharpcode&gt;&lt;pre&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;class&lt;/span&gt; MembershipSafe
{ &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; ResetPassword(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; username)
{ &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//将用户密码修改为8位且包含一个特殊符号的随机密码&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; ResetPassword(username,
Membership.GeneratePassword(8,1)); } &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;public&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;static&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; ResetPassword(&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; username, &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;string&lt;/span&gt; newpassword)
{ &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//先将用户密码修改为123123&lt;/span&gt; SqlParameter[]
_sp &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; { &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@ApplicationName"&lt;/span&gt;,Membership.ApplicationName)
,&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@UserName"&lt;/span&gt;,username)
,&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@NewPassword"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"1M4h3eZLAKW1WbVTTwYJiJZa33w="&lt;/span&gt;)
,&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@PasswordSalt"&lt;/span&gt;,&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"rcVy3pCccZ9tXW7NHp1Maw=="&lt;/span&gt;)
,&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@CurrentTimeUtc"&lt;/span&gt;,DateTime.Now)
,&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"@PasswordFormat"&lt;/span&gt;,1)
}; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bool&lt;/span&gt; op &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;=&lt;/span&gt; DataAccess.RunProcedure(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"aspnet_Membership_SetPassword"&lt;/span&gt;,
_sp) == 0; &lt;span style="FONT-SIZE: 11px; COLOR: green; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;//以123123为原始密码，修改为新密码&lt;/span&gt; Membership.GetUser(username).ChangePassword(&lt;span style="FONT-SIZE: 11px; COLOR: #666666; FONT-FAMILY: Courier New; BACKGROUND-COLOR: #e4e4e4"&gt;"123123"&lt;/span&gt;,
newpassword); &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;return&lt;/span&gt; newpassword;
} } &lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;strong&gt;注：&lt;/strong&gt;以上代码仅做参考，不一定是符合您具体项目的需求，比如有人可能会继续问修改了密码怎么告诉用户啊，答案是发邮件或者电话通知啊，哈哈～～
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;推荐浏览：&lt;/strong&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;a href="http://www.cnblogs.com/windman" target=_blank&gt;Windman&lt;/a&gt;写的 ＂&lt;a href="http://www.cnblogs.com/windman/archive/2006/09/06/496722.html"&gt;揪出ASP.NET
2.0四大“插件”的总后台 -- ASPNETDB&lt;/a&gt; ＂&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,5267386a-5a0a-43c4-abf3-160249e7a1d7.aspx</comments>
      <category>ASP.NET</category>
      <category>CSharp</category>
      <category>DATABASE</category>
      <category>WEBSERVICE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=9c283c27-279b-4c20-a7d7-8005364d9bf9</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,9c283c27-279b-4c20-a7d7-8005364d9bf9.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,9c283c27-279b-4c20-a7d7-8005364d9bf9.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=9c283c27-279b-4c20-a7d7-8005364d9bf9</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
数据库镜像是SQL Server 2005的一个新特性，它允许你将一个SQL Server中的数据库内容镜像到另一个SQL Server上。它还让你可以在发生错误的时候，通过镜像数据库来进行错误恢复。镜像的拷贝是一个备用的拷贝，不能直接访问,它只用在错误恢复的情况下。SQL2005的这一特性给数据库系统维护人员带来了不错的实惠，而给最终用户的体验也是不错的。至于如何配置数据库镜像系统，大家可以到<a href="http://www.microsoft.com/china/technet/webcasts/default.mspx">TechNet
中文网络广播</a> 中查找一下相关视频教程，尤其推荐大家去看看MVP<a href="http://blogs.itecn.net/blogs/niuke/">牛可</a>的相关讲座视频哦。再这里就不多说了。我们直奔主题吧！！
</p>
        <p>
在使用数据库镜像功能时，如果我们使用的是工作组，那么我们需要注意一下数据库用户的问题：用普通方式创建的数据库用户，在主数据库中和镜像数据库中是有一些差异的，而这个差异最终会造成一个“奇怪”的结果，我们在主数据库和镜像数据库中对某数据库影射的“相同用户”，在发生故障转移后数据库验证会发生异常，称该用户无法登录我们的数据库，<strong>WHY? </strong>原来是两个数据库中的同名用户在系统表syslogins中的sid不同造成的。解决方法就是在两个数据库上建立同名同sid的用户，具体方法如下：
</p>
        <p>
假设有镜像的服务器是MIR-A和MI-B，要访问镜像数据库的登录账号是tom，使用下面这个方法就可以在MIR-A上创建登录名tom，然后在镜像数据库中创建数据库用户tom并映射到登录名tom<br />
执行下列语句取回tom的sid
</p>
        <pre>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">select</span> [name],
sid <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">from</span><span style="FONT-SIZE: 11px; COLOR: lawngreen; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">syslogins</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">where</span> [name]
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'tom'</span></span>
          <br />
------  -----------------------------------------------<br />
tom <strong>0xD6AABCC8F83E3243A6C3C97F28A4CB55</strong></pre>
        <p>
然后在MIR-B上用下面的语句创建登录名tom<br /></p>
        <pre>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">sp_addlogin
@loginame = <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'tom'</span>,
@passwd = <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'password'</span>,
@sid = <strong>0xD6AABCC8F83E3243A6C3C97F28A4CB55</strong></span>
        </pre>
        <pre>Ok,这样就没有问题了。</pre>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>SQL2005数据库镜像之数据库用户问题</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,9c283c27-279b-4c20-a7d7-8005364d9bf9.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,9c283c27-279b-4c20-a7d7-8005364d9bf9.aspx</link>
      <pubDate>Fri, 06 Apr 2007 13:51:10 GMT</pubDate>
      <description>&lt;p&gt;
数据库镜像是SQL Server 2005的一个新特性，它允许你将一个SQL Server中的数据库内容镜像到另一个SQL Server上。它还让你可以在发生错误的时候，通过镜像数据库来进行错误恢复。镜像的拷贝是一个备用的拷贝，不能直接访问,它只用在错误恢复的情况下。SQL2005的这一特性给数据库系统维护人员带来了不错的实惠，而给最终用户的体验也是不错的。至于如何配置数据库镜像系统，大家可以到&lt;a href="http://www.microsoft.com/china/technet/webcasts/default.mspx"&gt;TechNet
中文网络广播&lt;/a&gt;&amp;nbsp;中查找一下相关视频教程，尤其推荐大家去看看MVP&lt;a href="http://blogs.itecn.net/blogs/niuke/"&gt;牛可&lt;/a&gt;的相关讲座视频哦。再这里就不多说了。我们直奔主题吧！！
&lt;/p&gt;
&lt;p&gt;
在使用数据库镜像功能时，如果我们使用的是工作组，那么我们需要注意一下数据库用户的问题：用普通方式创建的数据库用户，在主数据库中和镜像数据库中是有一些差异的，而这个差异最终会造成一个“奇怪”的结果，我们在主数据库和镜像数据库中对某数据库影射的“相同用户”，在发生故障转移后数据库验证会发生异常，称该用户无法登录我们的数据库，&lt;strong&gt;WHY? &lt;/strong&gt;原来是两个数据库中的同名用户在系统表syslogins中的sid不同造成的。解决方法就是在两个数据库上建立同名同sid的用户，具体方法如下：
&lt;/p&gt;
&lt;p&gt;
假设有镜像的服务器是MIR-A和MI-B，要访问镜像数据库的登录账号是tom，使用下面这个方法就可以在MIR-A上创建登录名tom，然后在镜像数据库中创建数据库用户tom并映射到登录名tom&lt;br&gt;
执行下列语句取回tom的sid
&lt;/p&gt;
&lt;pre&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;select&lt;/span&gt; [name],
sid &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;from&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: lawngreen; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;syslogins&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;where&lt;/span&gt; [name]
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'tom'&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
------&amp;nbsp; -----------------------------------------------&lt;br&gt;
tom&amp;nbsp;&lt;strong&gt;0xD6AABCC8F83E3243A6C3C97F28A4CB55&lt;/strong&gt;&lt;/pre&gt;
&lt;p&gt;
然后在MIR-B上用下面的语句创建登录名tom&lt;br&gt;
&lt;/p&gt;
&lt;pre&gt;&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;sp_addlogin
@loginame = &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'tom'&lt;/span&gt;,
@passwd = &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'password'&lt;/span&gt;,
@sid = &lt;strong&gt;0xD6AABCC8F83E3243A6C3C97F28A4CB55&lt;/strong&gt;&lt;/span&gt;&lt;/pre&gt;&lt;pre&gt;Ok,这样就没有问题了。&lt;/pre&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,9c283c27-279b-4c20-a7d7-8005364d9bf9.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=264e4634-1d4b-4841-a2d6-cf031cf8a295</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,264e4634-1d4b-4841-a2d6-cf031cf8a295.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,264e4634-1d4b-4841-a2d6-cf031cf8a295.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=264e4634-1d4b-4841-a2d6-cf031cf8a295</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
好友前一阵子在他的<a href="http://www.coolcode.cn/">博客</a>上发表了一篇文章《<a href="http://www.coolcode.cn/?p=176">安全设置
IIS 中的权限</a>》，在这里转载一下，希望对大家有所帮助。 
</p>
        <p>
          <u>
            <font color="green">虽然 Apache 的名声可能比 IIS 好，但我相信用 IIS 来做 Web 服务器的人一定也不少。说实话，我觉得
IIS 还是不错的，尤其是 Windows 2003 的 IIS 6（马上 Longhorn Server 的 IIS 7 也就要来了，相信会更好），性能和稳定性都相当不错。但是我发现许多用
IIS 的人不太会设置 Web 服务器的权限，因此，出现漏洞被人黑掉也就不足为奇了。但我们不应该把这归咎于 IIS 的不安全。如果对站点的每个目录都配以正确的权限，出现漏洞被人黑掉的机会还是很小的（Web
应用程序本身有问题和通过其它方式入侵黑掉服务器的除外）。下面是我在配置过程中总结的一些经验，希望对大家有所帮助。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">IIS Web 服务器的权限设置有两个地方，一个是 NTFS 文件系统本身的权限设置，另一个是 IIS 下网站-&gt;站点-&gt;属性-&gt;主目录（或站点下目录-&gt;属性-&gt;目录）面板上。这两个地方是密切相关的。下面我会以实例的方式来讲解如何设置权限。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">IIS 下网站-&gt;站点-&gt;属性-&gt;主目录（或站点下目录-&gt;属性-&gt;目录）面板上有：</font>
          </u>
        </p>
        <ul>
          <li>
            <u>
              <font color="green">脚本资源访问 </font>
            </u>
          </li>
          <li>
            <u>
              <font color="green">读取 </font>
            </u>
          </li>
          <li>
            <u>
              <font color="green">写入 </font>
            </u>
          </li>
          <li>
            <u>
              <font color="green">浏览 </font>
            </u>
          </li>
          <li>
            <u>
              <font color="green">记录访问 </font>
            </u>
          </li>
          <li>
            <u>
              <font color="green">索引资源 </font>
            </u>
          </li>
        </ul>
        <p>
          <u>
            <font color="green">6 个选项。这 6 个选项中，“记录访问”和“索引资源”跟安全性关系不大，一般都设置。但是如果前面四个权限都没有设置的话，这两个权限也没有必要设置。在设置权限时，记住这个规则即可，后面的例子中不再特别说明这两个权限的设置。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">另外在这 6 个选项下面的执行权限下拉列表中还有：</font>
          </u>
        </p>
        <ul>
          <li>
            <u>
              <font color="green">无 </font>
            </u>
          </li>
          <li>
            <u>
              <font color="green">纯脚本 </font>
            </u>
          </li>
          <li>
            <u>
              <font color="green">纯脚本和可执行程序 </font>
            </u>
          </li>
        </ul>
        <p>
          <u>
            <font color="green">3 个选项。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">而网站目录如果在 NTFS 分区（推荐用这种）的话，还需要对 NTFS 分区上的这个目录设置相应权限，许多地方都介绍设置
everyone 的权限，实际上这是不好的，其实只要设置好 Internet 来宾帐号（IUSR_xxxxxxx）或 IIS_WPG 组的帐号权限就可以了。如果是设置
ASP、PHP 程序的目录权限，那么设置 Internet 来宾帐号的权限，而对于 ASP.NET 程序，则需要设置 IIS_WPG 组的帐号权限。在后面提到 NTFS
权限设置时会明确指出，没有明确指出的都是指设置 IIS 属性面板上的权限。</font>
          </u>
        </p>
        <h3>
          <u>
            <font color="green">例1 —— ASP、PHP、ASP.NET 程序所在目录的权限设置：</font>
          </u>
        </h3>
        <p>
          <u>
            <font color="green">如果这些程序是要执行的，那么需要设置“读取”权限，并且设置执行权限为“纯脚本”。不要设置“写入”和“脚本资源访问”，更不要设置执行权限为“纯脚本和可执行程序”。NTFS
权限中不要给 IIS_WPG 用户组和 Internet 来宾帐号设置写和修改权限。如果有一些特殊的配置文件（而且配置文件本身也是 ASP、PHP 程序），则需要给这些特定的文件配置
NTFS 权限中的 Internet 来宾帐号（ASP.NET 程序是 IIS_WPG 组）的写权限，而不要配置 IIS 属性面板中的“写入”权限。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">IIS 面板中的“写入”权限实际上是对 HTTP PUT 指令的处理，对于普通网站，一般情况下这个权限是不打开的。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">IIS 面板中的“脚本资源访问”不是指可以执行脚本的权限，而是指可以访问源代码的权限，如果同时又打开“写入”权限的话，那么就非常危险了。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">执行权限中“纯脚本和可执行程序”权限可以执行任意程序，包括 exe 可执行程序，如果目录同时有“写入”权限的话，那么就很容易被人上传并执行木马程序了。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">对于 ASP.NET 程序的目录，许多人喜欢在文件系统中设置成 Web 共享，实际上这是没有必要的。只需要在 IIS
中保证该目录为一个应用程序即可。如果所在目录在 IIS 中不是一个应用程序目录，只需要在其属性-&gt;目录面板中应用程序设置部分点创建就可以了。Web 共享会给其更多权限，可能会造成不安全因素。</font>
          </u>
        </p>
        <h3>
          <u>
            <font color="green">例2 —— 上传目录的权限设置：</font>
          </u>
        </h3>
        <p>
          <u>
            <font color="green">用户的网站上可能会设置一个或几个目录允许上传文件，上传的方式一般是通过 ASP、PHP、ASP.NET 等程序来完成。这时需要注意，一定要将上传目录的执行权限设为“无”，这样即使上传了
ASP、PHP 等脚本程序或者 exe 程序，也不会在用户浏览器里就触发执行。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">同样，如果不需要用户用 PUT 指令上传，那么不要打开该上传目录的“写入”权限。而应该设置 NTFS 权限中的 Internet
来宾帐号（ASP.NET 程序的上传目录是 IIS_WPG 组）的写权限。</font>
          </u>
        </p>
        <p>
          <u>
            <font color="green">如果下载时，是通过程序读取文件内容然后再转发给用户的话，那么连“读取”权限也不要设置。这样可以保证用户上传的文件只能被程序中已授权的用户所下载。而不是知道文件存放目录的用户所下载。“浏览”权限也不要打开，除非你就是希望用户可以浏览你的上传目录，并可以选择自己想要下载的东西。</font>
          </u>
        </p>
        <h3>
          <u>
            <font color="green">例3 —— Access 数据库所在目录的权限设置：</font>
          </u>
        </h3>
        <p>
          <u>
            <font color="green">许多 IIS 用户常常采用将 Access 数据库改名（改为 asp 或者 aspx 后缀等）或者放在发布目录之外的方法来避免浏览者下载它们的
Access 数据库。而实际上，这是不必要的。其实只需要将 Access 所在目录（或者该文件）的“读取”、“写入”权限都去掉就可以防止被人下载或篡改了。你不必担心这样你的程序会无法读取和写入你的
Access 数据库。你的程序需要的是 NTFS 上 Internet 来宾帐号或 IIS_WPG 组帐号的权限，你只要将这些用户的权限设置为可读可写就完全可以保证你的程序能够正确运行了。</font>
          </u>
        </p>
        <h3>
          <u>
            <font color="green">例4 —— 其它目录的权限设置：</font>
          </u>
        </h3>
        <p>
          <u>
            <font color="green">你的网站下可能还有纯图片目录、纯 html 模版目录、纯客户端 js 文件目录或者样式表目录等，这些目录只需要设置“读取”权限即可，执行权限设成“无”即可。其它权限一概不需要设置。</font>
          </u>
        </p>
        <p>
          <font color="green">
            <u>好了，我想上面的几个例子已经包含了大部分情况下的权限设置，其它情况根据这些例子，我想你一定可以想到该如何设置了吧。</u>
          </font>
        </p>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>[转载]安全设置 IIS 中的权限</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,264e4634-1d4b-4841-a2d6-cf031cf8a295.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,264e4634-1d4b-4841-a2d6-cf031cf8a295.aspx</link>
      <pubDate>Fri, 02 Jun 2006 05:13:14 GMT</pubDate>
      <description>&lt;p&gt;
好友前一阵子在他的&lt;a href="http://www.coolcode.cn/"&gt;博客&lt;/a&gt;上发表了一篇文章《&lt;a href="http://www.coolcode.cn/?p=176"&gt;安全设置
IIS 中的权限&lt;/a&gt;》，在这里转载一下，希望对大家有所帮助。 
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;虽然 Apache 的名声可能比 IIS 好，但我相信用 IIS 来做 Web 服务器的人一定也不少。说实话，我觉得 IIS
还是不错的，尤其是 Windows 2003 的 IIS 6（马上 Longhorn Server 的 IIS 7 也就要来了，相信会更好），性能和稳定性都相当不错。但是我发现许多用
IIS 的人不太会设置 Web 服务器的权限，因此，出现漏洞被人黑掉也就不足为奇了。但我们不应该把这归咎于 IIS 的不安全。如果对站点的每个目录都配以正确的权限，出现漏洞被人黑掉的机会还是很小的（Web
应用程序本身有问题和通过其它方式入侵黑掉服务器的除外）。下面是我在配置过程中总结的一些经验，希望对大家有所帮助。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;IIS Web 服务器的权限设置有两个地方，一个是 NTFS 文件系统本身的权限设置，另一个是 IIS 下网站-&amp;gt;站点-&amp;gt;属性-&amp;gt;主目录（或站点下目录-&amp;gt;属性-&amp;gt;目录）面板上。这两个地方是密切相关的。下面我会以实例的方式来讲解如何设置权限。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;IIS 下网站-&amp;gt;站点-&amp;gt;属性-&amp;gt;主目录（或站点下目录-&amp;gt;属性-&amp;gt;目录）面板上有：&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;脚本资源访问 &lt;/font&gt;&lt;/u&gt; 
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;读取 &lt;/font&gt;&lt;/u&gt; 
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;写入 &lt;/font&gt;&lt;/u&gt; 
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;浏览 &lt;/font&gt;&lt;/u&gt; 
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;记录访问 &lt;/font&gt;&lt;/u&gt; 
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;索引资源 &lt;/font&gt;&lt;/u&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;6 个选项。这 6 个选项中，“记录访问”和“索引资源”跟安全性关系不大，一般都设置。但是如果前面四个权限都没有设置的话，这两个权限也没有必要设置。在设置权限时，记住这个规则即可，后面的例子中不再特别说明这两个权限的设置。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;另外在这 6 个选项下面的执行权限下拉列表中还有：&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;无 &lt;/font&gt;&lt;/u&gt; 
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;纯脚本 &lt;/font&gt;&lt;/u&gt; 
&lt;li&gt;
&lt;u&gt;&lt;font color=green&gt;纯脚本和可执行程序 &lt;/font&gt;&lt;/u&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;3 个选项。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;而网站目录如果在 NTFS 分区（推荐用这种）的话，还需要对 NTFS 分区上的这个目录设置相应权限，许多地方都介绍设置
everyone 的权限，实际上这是不好的，其实只要设置好 Internet 来宾帐号（IUSR_xxxxxxx）或 IIS_WPG 组的帐号权限就可以了。如果是设置
ASP、PHP 程序的目录权限，那么设置 Internet 来宾帐号的权限，而对于 ASP.NET 程序，则需要设置 IIS_WPG 组的帐号权限。在后面提到 NTFS
权限设置时会明确指出，没有明确指出的都是指设置 IIS 属性面板上的权限。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;u&gt;&lt;font color=green&gt;例1 —— ASP、PHP、ASP.NET 程序所在目录的权限设置：&lt;/font&gt;&lt;/u&gt;
&lt;/h3&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;如果这些程序是要执行的，那么需要设置“读取”权限，并且设置执行权限为“纯脚本”。不要设置“写入”和“脚本资源访问”，更不要设置执行权限为“纯脚本和可执行程序”。NTFS
权限中不要给 IIS_WPG 用户组和 Internet 来宾帐号设置写和修改权限。如果有一些特殊的配置文件（而且配置文件本身也是 ASP、PHP 程序），则需要给这些特定的文件配置
NTFS 权限中的 Internet 来宾帐号（ASP.NET 程序是 IIS_WPG 组）的写权限，而不要配置 IIS 属性面板中的“写入”权限。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;IIS 面板中的“写入”权限实际上是对 HTTP PUT 指令的处理，对于普通网站，一般情况下这个权限是不打开的。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;IIS 面板中的“脚本资源访问”不是指可以执行脚本的权限，而是指可以访问源代码的权限，如果同时又打开“写入”权限的话，那么就非常危险了。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;执行权限中“纯脚本和可执行程序”权限可以执行任意程序，包括 exe 可执行程序，如果目录同时有“写入”权限的话，那么就很容易被人上传并执行木马程序了。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;对于 ASP.NET 程序的目录，许多人喜欢在文件系统中设置成 Web 共享，实际上这是没有必要的。只需要在 IIS 中保证该目录为一个应用程序即可。如果所在目录在
IIS 中不是一个应用程序目录，只需要在其属性-&amp;gt;目录面板中应用程序设置部分点创建就可以了。Web 共享会给其更多权限，可能会造成不安全因素。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;u&gt;&lt;font color=green&gt;例2 —— 上传目录的权限设置：&lt;/font&gt;&lt;/u&gt;
&lt;/h3&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;用户的网站上可能会设置一个或几个目录允许上传文件，上传的方式一般是通过 ASP、PHP、ASP.NET 等程序来完成。这时需要注意，一定要将上传目录的执行权限设为“无”，这样即使上传了
ASP、PHP 等脚本程序或者 exe 程序，也不会在用户浏览器里就触发执行。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;同样，如果不需要用户用 PUT 指令上传，那么不要打开该上传目录的“写入”权限。而应该设置 NTFS 权限中的 Internet
来宾帐号（ASP.NET 程序的上传目录是 IIS_WPG 组）的写权限。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;如果下载时，是通过程序读取文件内容然后再转发给用户的话，那么连“读取”权限也不要设置。这样可以保证用户上传的文件只能被程序中已授权的用户所下载。而不是知道文件存放目录的用户所下载。“浏览”权限也不要打开，除非你就是希望用户可以浏览你的上传目录，并可以选择自己想要下载的东西。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;u&gt;&lt;font color=green&gt;例3 —— Access 数据库所在目录的权限设置：&lt;/font&gt;&lt;/u&gt;
&lt;/h3&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;许多 IIS 用户常常采用将 Access 数据库改名（改为 asp 或者 aspx 后缀等）或者放在发布目录之外的方法来避免浏览者下载它们的
Access 数据库。而实际上，这是不必要的。其实只需要将 Access 所在目录（或者该文件）的“读取”、“写入”权限都去掉就可以防止被人下载或篡改了。你不必担心这样你的程序会无法读取和写入你的
Access 数据库。你的程序需要的是 NTFS 上 Internet 来宾帐号或 IIS_WPG 组帐号的权限，你只要将这些用户的权限设置为可读可写就完全可以保证你的程序能够正确运行了。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;h3&gt;&lt;u&gt;&lt;font color=green&gt;例4 —— 其它目录的权限设置：&lt;/font&gt;&lt;/u&gt;
&lt;/h3&gt;
&lt;p&gt;
&lt;u&gt;&lt;font color=green&gt;你的网站下可能还有纯图片目录、纯 html 模版目录、纯客户端 js 文件目录或者样式表目录等，这些目录只需要设置“读取”权限即可，执行权限设成“无”即可。其它权限一概不需要设置。&lt;/font&gt;&lt;/u&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color=green&gt;&lt;u&gt;好了，我想上面的几个例子已经包含了大部分情况下的权限设置，其它情况根据这些例子，我想你一定可以想到该如何设置了吧。&lt;/u&gt; &lt;/font&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,264e4634-1d4b-4841-a2d6-cf031cf8a295.aspx</comments>
      <category>ASP</category>
      <category>ASP.NET</category>
      <category>DATABASE</category>
      <category>WEBSERVICE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=a594fa17-f4f1-4446-a3a1-941559cfa6fa</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,a594fa17-f4f1-4446-a3a1-941559cfa6fa.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,a594fa17-f4f1-4446-a3a1-941559cfa6fa.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a594fa17-f4f1-4446-a3a1-941559cfa6fa</wfw:commentRss>
      <slash:comments>1</slash:comments>
      <title>惊喜:Sql2005带来的分页便利 </title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,a594fa17-f4f1-4446-a3a1-941559cfa6fa.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,a594fa17-f4f1-4446-a3a1-941559cfa6fa.aspx</link>
      <pubDate>Thu, 19 Jan 2006 14:55:00 GMT</pubDate>
      <description>&lt;div class=itemBodyStyle&gt;
&lt;p&gt;
从&lt;a href="http://www.qihangnet.com/ct.ashx?id=a594fa17-f4f1-4446-a3a1-941559cfa6fa&amp;amp;url=http%3a%2f%2fblog.joycode.com%2fdotey%2f" ?&gt;宝玉的Blog&lt;/a&gt;上看到了名为《&lt;a id=viewpost.ascx_TitleUrl href="http://www.qihangnet.com/ct.ashx?id=a594fa17-f4f1-4446-a3a1-941559cfa6fa&amp;amp;url=http%3a%2f%2fblog.joycode.com%2fdotey%2farchive%2f2006%2f01%2f16%2f70493.aspx" ?&gt;Sql2005带来的分页便利&lt;/a&gt;》的短文，文章很短，但是却让我欣喜万分，MS终于在SQL
Server上给解决了大量数据的分页问题了。以前我经常羡慕MySql用户可以使用很简单的办法来处理分页问题，而今天我们在Sql2005上也同样可以很方便的处理分页问题了。
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;select&lt;/span&gt; threadid &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;from&lt;/span&gt; 
&lt;br&gt;
(&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;select&lt;/span&gt; threadid, &lt;font color=#ff0000&gt;&lt;strong&gt;ROW_NUMBER()&lt;/strong&gt;&lt;/font&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;OVER&lt;/span&gt; (&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;order&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;by&lt;/span&gt; stickydate) &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;as&lt;/span&gt; Pos &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;from&lt;/span&gt; cs_threads&lt;br&gt;
) &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;as&lt;/span&gt; T 
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;where&lt;/span&gt; T.Pos
&amp;gt; 100000 &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; T.Pos
&amp;lt; 100030&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;以上是原文提供的查询例子，其中最重要的就是&lt;strong&gt;&lt;font color=#ff0000&gt;ROW_NUMBER()&lt;/font&gt;&lt;/strong&gt;了，这个东西需要结合order
by来使用。&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;:)&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,a594fa17-f4f1-4446-a3a1-941559cfa6fa.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=e8d9b46a-f5f3-491a-b806-f62c65365b39</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,e8d9b46a-f5f3-491a-b806-f62c65365b39.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,e8d9b46a-f5f3-491a-b806-f62c65365b39.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e8d9b46a-f5f3-491a-b806-f62c65365b39</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
一朋友问及一个问题：在SQL Server2000里如何通过sql语句查出指定数据表中自动编号的字段名，即包含<font color="#000000" face="Courier New">标识</font>的字段名。<br />
其实使用一个简单的sql语句就搞定了：
</p>
        <pre>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">Select</span> [name] <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">From</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: lawngreen; FONT-SIZE: 11px">sysColumns</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">Where</span> id=<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: fuchsia; FONT-SIZE: 11px">object_id</span>(N<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">'TABLENAME'</span>) <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: silver; FONT-SIZE: 11px">and</span> Status=128</span>
        </pre>
        <p>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">其中<font color="#ff0000">TABLENAME</font>为你要查询的数据表名称。</span>
        </p>
        <p>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">如果想查询标识种子和标识增量的信息，应使用如下语句：</span>
        </p>
        <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
          <pre>
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
              <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">Select</span> [name],autoval <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">From</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: lawngreen; FONT-SIZE: 11px">sysColumns</span><span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px">Where</span> id=<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: fuchsia; FONT-SIZE: 11px">object_id</span>(N<span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px">'TABLENAME'</span>) <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: silver; FONT-SIZE: 11px">and</span> Status=128</span>
          </pre>
        </span>
        <p>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
          </span>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">
            <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">autoval字段的值包含了标识种子和标识增量信息，具体内容相信大家一看即明白了。在此不多说了^_^</span>
          </span>
        </p>
        <p>
          <span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px">另外，有人说查询主键时用Status=128是错误的，Status=128是用来查询标识字段的。</span>
        </p>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>使用sql判断指定表中的有标识的字段</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,e8d9b46a-f5f3-491a-b806-f62c65365b39.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,e8d9b46a-f5f3-491a-b806-f62c65365b39.aspx</link>
      <pubDate>Thu, 17 Nov 2005 06:42:50 GMT</pubDate>
      <description>&lt;p&gt;
一朋友问及一个问题：在SQL Server2000里如何通过sql语句查出指定数据表中自动编号的字段名，即包含&lt;font color=#000000 face="Courier New"&gt;标识&lt;/font&gt;的字段名。&lt;br&gt;
其实使用一个简单的sql语句就搞定了：
&lt;/p&gt;
&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;Select&lt;/span&gt; [name] &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;From&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: lawngreen; FONT-SIZE: 11px"&gt;sysColumns&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;Where&lt;/span&gt; id=&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: fuchsia; FONT-SIZE: 11px"&gt;object_id&lt;/span&gt;(N&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;'TABLENAME'&lt;/span&gt;) &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: silver; FONT-SIZE: 11px"&gt;and&lt;/span&gt; Status=128&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;其中&lt;font color=#ff0000&gt;TABLENAME&lt;/font&gt;为你要查询的数据表名称。&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;如果想查询标识种子和标识增量的信息，应使用如下语句：&lt;/span&gt;
&lt;/p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;pre&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;Select&lt;/span&gt; [name],autoval &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;From&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: lawngreen; FONT-SIZE: 11px"&gt;sysColumns&lt;/span&gt; &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: blue; FONT-SIZE: 11px"&gt;Where&lt;/span&gt; id=&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: fuchsia; FONT-SIZE: 11px"&gt;object_id&lt;/span&gt;(N&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: red; FONT-SIZE: 11px"&gt;'TABLENAME'&lt;/span&gt;) &lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: silver; FONT-SIZE: 11px"&gt;and&lt;/span&gt; Status=128&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt; 
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;/span&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;autoval字段的值包含了标识种子和标识增量信息，具体内容相信大家一看即明白了。在此不多说了^_^&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="BACKGROUND-COLOR: transparent; FONT-FAMILY: Courier New; COLOR: black; FONT-SIZE: 11px"&gt;另外，有人说查询主键时用Status=128是错误的，Status=128是用来查询标识字段的。&lt;/span&gt;
&lt;/p&gt;
&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,e8d9b46a-f5f3-491a-b806-f62c65365b39.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=e84cbf72-a759-4248-8c56-083440e7016e</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,e84cbf72-a759-4248-8c56-083440e7016e.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,e84cbf72-a759-4248-8c56-083440e7016e.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=e84cbf72-a759-4248-8c56-083440e7016e</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
SqlServer的默认开放端口是1433，但是由于实际开发的需要端口被设置为非1433，一些开发人员不知如何写该类型的连接字符串了。<br />
其实解决这个问题很简单的，只需在连接字符串的Data Source=myServer后面加上逗号和端口号就可以了。例如“……User ID=sa;Initial Catalog=pubs;Data
Source=myServer,1200”，就是连接的1200端口的Sql Server服务器了。
</p>
        <p>
具体的描述如下：<br /><strong>症状：<br /></strong>当您使用传输控制协议/Internet 协议 (TCP/IP) 以外的协议时，如果您指定 1433 以外的一个端口用以连接到 Microsoft
SQL Server 的一个实例，则 <b>SqlConnection.Open</b> 会失败。 
<br /><strong>解决方案：</strong><br />
若要解决此问题，请使用 TCP/IP 协议，并使连接字符串中包括"Server=ComputerName, PortNumber"。 
</p>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>在1433 以外的任何端口上连接到SQL Server</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,e84cbf72-a759-4248-8c56-083440e7016e.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,e84cbf72-a759-4248-8c56-083440e7016e.aspx</link>
      <pubDate>Tue, 18 Oct 2005 13:12:51 GMT</pubDate>
      <description>&lt;p&gt;
SqlServer的默认开放端口是1433，但是由于实际开发的需要端口被设置为非1433，一些开发人员不知如何写该类型的连接字符串了。&lt;br&gt;
其实解决这个问题很简单的，只需在连接字符串的Data Source=myServer后面加上逗号和端口号就可以了。例如“……User ID=sa;Initial Catalog=pubs;Data
Source=myServer,1200”，就是连接的1200端口的Sql Server服务器了。
&lt;/p&gt;
&lt;p&gt;
具体的描述如下：&lt;br&gt;
&lt;strong&gt;症状：&lt;br&gt;
&lt;/strong&gt;当您使用传输控制协议/Internet 协议 (TCP/IP) 以外的协议时，如果您指定 1433 以外的一个端口用以连接到 Microsoft
SQL Server 的一个实例，则 &lt;b&gt;SqlConnection.Open&lt;/b&gt; 会失败。 
&lt;br&gt;
&lt;strong&gt;解决方案：&lt;/strong&gt;
&lt;br&gt;
若要解决此问题，请使用 TCP/IP 协议，并使连接字符串中包括"Server=ComputerName, PortNumber"。 
&lt;/p&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,e84cbf72-a759-4248-8c56-083440e7016e.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=770c6ce2-98df-4bed-8e39-2cd9352ecbbd</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,770c6ce2-98df-4bed-8e39-2cd9352ecbbd.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,770c6ce2-98df-4bed-8e39-2cd9352ecbbd.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=770c6ce2-98df-4bed-8e39-2cd9352ecbbd</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CREATE</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">procedure</span> main_table_pwqzc<br />
(@pagesize <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span>,<br />
@pageindex <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span>,<br />
@docount <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">bit</span>,<br />
@this_id)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">as</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">if</span>(@docount=1)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">begin</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">select</span><span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">count</span>(id) <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">from</span> luntan <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">where</span> this_id=@this_id<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">end</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">else</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">begin</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">declare</span> @indextable <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">table</span>(id <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">identity</span>(1,1),nid <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">declare</span> @PageLowerBound <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">declare</span> @PageUpperBound <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">set</span> @PageLowerBound=(@pageindex-1)*@pagesize<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">set</span> @PageUpperBound=@PageLowerBound+@pagesize<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">set</span> rowcount
@PageUpperBound<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">insert</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">into</span> @indextable(nid) <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">select</span> id <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">from</span> luntan <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">where</span> this_id=@this_id <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">order</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">by</span> reply_time <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">desc</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">select</span> a.* <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">from</span> luntan
a,@indextable t <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">where</span> a.id=t.nid<br /><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span> t.id&gt;@PageLowerBound <span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span> t.id&lt;=@PageUpperBound <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">order</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">by</span> t.id<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">end</span><br />
GO</span>
        </p>
        <p>
存储过程会根据传入的参数@docount来确定是不是要返回所有要分页的记录总数<br />
特别是这两行<br /></p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">set</span> rowcount
@PageUpperBound<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">insert</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">into</span> @indextable(nid) <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">select</span> id <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">from</span> luntan <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">where</span> this_id=@this_id <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">order</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">by</span> reply_time <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">desc</span><br /></span>
        </p>
        <p>
真的是妙不可言!!set rowcount @PageUpperBound当记录数达到@PageUpperBound时就会停止处理查询<br />
,select id 只把id列取出放到临时表里,<span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">select</span> a.* <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">from</span> luntan
a,@indextable t <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">where</span> a.id=t.nid<br /><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span> t.id&gt;@PageLowerBound <span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">and</span> t.id&lt;=@PageUpperBound <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">order</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">by</span> t.id </span>而这句也只从表中取出所需要的记录,而不是所有的记录,结合起来,极大的提高了效率!!<br />
妙啊,真的妙!!!!
</p>
        <p>
          <span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CREATE</span>
            <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">PROCEDURE</span> Paging_RowCount<br />
(<br />
@Tables <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(1000),<br />
@PK <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(100),<br />
@Sort <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(200)
= <span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">NULL</span>,<br />
@PageNumber <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> =
1,<br />
@PageSize <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span> =
10,<br />
@Fields <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(1000)
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'*'</span>,<br />
@Filter <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(1000)
= <span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">NULL</span>,<br />
@<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Group</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(1000)
= <span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">NULL</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">AS</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/*Default
Sorting*/</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span> @Sort <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IS</span><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">NULL</span><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">OR</span> @Sort
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">''</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @Sort
= @PK<br /><br /><span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/*Find
the @PK type*/</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @SortTable <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(100)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @SortName <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(100)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @strSortColumn <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(200)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @operator <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">char</span>(2)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @type <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(100)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @prec <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">int</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/*Set
sorting variables.*/</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span><span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CHARINDEX</span>(<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'DESC'</span>,@Sort)&gt;0<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">BEGIN</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strSortColumn
= <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">REPLACE</span>(@Sort, <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'DESC'</span>, <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">''</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @operator
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'&lt;='</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">END</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">ELSE</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">BEGIN</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span><span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CHARINDEX</span>(<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'ASC'</span>,
@Sort) = 0<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strSortColumn
= <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">REPLACE</span>(@Sort, <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'ASC'</span>, <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">''</span>)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @operator
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'&gt;='</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">END</span><br /><br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span><span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CHARINDEX</span>(<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'.'</span>,
@strSortColumn) &gt; 0<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">BEGIN</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @SortTable
= <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SUBSTRING</span>(@strSortColumn,
0, <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CHARINDEX</span>(<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'.'</span>,@strSortColumn))<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @SortName
= <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SUBSTRING</span>(@strSortColumn, <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CHARINDEX</span>(<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'.'</span>,@strSortColumn)
+ 1, <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">LEN</span>(@strSortColumn))<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">END</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">ELSE</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">BEGIN</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @SortTable
= @Tables<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @SortName
= @strSortColumn<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">END</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SELECT</span> @type=t.name,
@prec=c.prec<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">FROM</span><span style="FONT-SIZE: 11px; COLOR: lawngreen; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">sysobjects</span> o 
<br /><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">JOIN</span><span style="FONT-SIZE: 11px; COLOR: lawngreen; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">syscolumns</span> c <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">on</span> o.id=c.id<br /><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">JOIN</span><span style="FONT-SIZE: 11px; COLOR: lawngreen; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">systypes</span> t <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">on</span> c.xusertype=t.xusertype<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">WHERE</span> o.name
= @SortTable <span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">AND</span> c.name
= @SortName<br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span><span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CHARINDEX</span>(<span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'char'</span>,
@type) &gt; 0<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @type
= @type + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'('</span> + <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CAST</span>(@prec <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">AS</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>)
+ <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">')'</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @strPageSize <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(50)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @strStartRow <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(50)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @strFilter <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(1000)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @strSimpleFilter <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(1000)<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">DECLARE</span> @strGroup <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(1000)<br /><br /><span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/*Default
Page Number*/</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span> @PageNumber
&lt; 1<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @PageNumber
= 1<br /><br /><span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/*Set
paging variables.*/</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strPageSize
= <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CAST</span>(@PageSize <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">AS</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(50))<br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strStartRow
= <span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">CAST</span>(((@PageNumber
- 1)*@PageSize + 1) <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">AS</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">varchar</span>(50))<br /><br /><span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/*Set
filter &amp; group variables.*/</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span> @Filter <span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IS</span><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">NOT</span><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">NULL</span><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">AND</span> @Filter
!= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">''</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">BEGIN</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strFilter
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
WHERE '</span> + @Filter + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
'</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strSimpleFilter
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
AND '</span> + @Filter + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
'</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">END</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">ELSE</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">BEGIN</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strSimpleFilter
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">''</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strFilter
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">''</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">END</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IF</span> @<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Group</span><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">IS</span><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">NOT</span><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">NULL</span><span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">AND</span> @<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Group</span> != <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">''</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strGroup
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
GROUP BY '</span> + @<span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">Group</span> + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
'</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">ELSE</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">SET</span> @strGroup
= <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">''</span><br /><br /><span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">/*Execute
dynamic query*/</span><br /><span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">EXEC</span>(<br /><span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'<br />
DECLARE @SortColumn '</span> + @type + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'<br />
SET ROWCOUNT '</span> + @strStartRow + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'<br />
SELECT @SortColumn='</span> + @strSortColumn + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
FROM '</span> + @Tables + @strFilter + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
'</span> + @strGroup + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
ORDER BY '</span> + @Sort + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'<br />
SET ROWCOUNT '</span> + @strPageSize + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'<br />
SELECT '</span> + @Fields + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
FROM '</span> + @Tables + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
WHERE '</span> + @strSortColumn + @operator + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
@SortColumn '</span> + @strSimpleFilter + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
'</span> + @strGroup + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'
ORDER BY '</span> + @Sort + <span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent">'<br />
'</span><br />
)<br />
GO<br /><br /></span>
        </p>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>精彩的近乎完美的分页存储过程</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,770c6ce2-98df-4bed-8e39-2cd9352ecbbd.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,770c6ce2-98df-4bed-8e39-2cd9352ecbbd.aspx</link>
      <pubDate>Tue, 11 Oct 2005 11:54:53 GMT</pubDate>
      <description>&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CREATE&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;procedure&lt;/span&gt; main_table_pwqzc&lt;br&gt;
(@pagesize &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt;,&lt;br&gt;
@pageindex &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt;,&lt;br&gt;
@docount &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;bit&lt;/span&gt;,&lt;br&gt;
@this_id)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;as&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;if&lt;/span&gt;(@docount=1)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;begin&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;select&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;count&lt;/span&gt;(id) &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;from&lt;/span&gt; luntan &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;where&lt;/span&gt; this_id=@this_id&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;end&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;else&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;begin&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;declare&lt;/span&gt; @indextable &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;table&lt;/span&gt;(id &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;identity&lt;/span&gt;(1,1),nid &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;declare&lt;/span&gt; @PageLowerBound &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;declare&lt;/span&gt; @PageUpperBound &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;set&lt;/span&gt; @PageLowerBound=(@pageindex-1)*@pagesize&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;set&lt;/span&gt; @PageUpperBound=@PageLowerBound+@pagesize&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;set&lt;/span&gt; rowcount
@PageUpperBound&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;insert&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;into&lt;/span&gt; @indextable(nid) &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;select&lt;/span&gt; id &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;from&lt;/span&gt; luntan &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;where&lt;/span&gt; this_id=@this_id &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;order&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;by&lt;/span&gt; reply_time &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;desc&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;select&lt;/span&gt; a.* &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;from&lt;/span&gt; luntan
a,@indextable t &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;where&lt;/span&gt; a.id=t.nid&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; t.id&amp;gt;@PageLowerBound &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; t.id&amp;lt;=@PageUpperBound &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;order&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;by&lt;/span&gt; t.id&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;end&lt;/span&gt;
&lt;br&gt;
GO&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
存储过程会根据传入的参数@docount来确定是不是要返回所有要分页的记录总数&lt;br&gt;
特别是这两行&lt;br&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;set&lt;/span&gt; rowcount
@PageUpperBound&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;insert&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;into&lt;/span&gt; @indextable(nid) &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;select&lt;/span&gt; id &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;from&lt;/span&gt; luntan &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;where&lt;/span&gt; this_id=@this_id &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;order&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;by&lt;/span&gt; reply_time &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;desc&lt;/span&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
真的是妙不可言!!set rowcount @PageUpperBound当记录数达到@PageUpperBound时就会停止处理查询&lt;br&gt;
,select id 只把id列取出放到临时表里,&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;select&lt;/span&gt; a.* &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;from&lt;/span&gt; luntan
a,@indextable t &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;where&lt;/span&gt; a.id=t.nid&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; t.id&amp;gt;@PageLowerBound &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;and&lt;/span&gt; t.id&amp;lt;=@PageUpperBound &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;order&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;by&lt;/span&gt; t.id &lt;/span&gt;而这句也只从表中取出所需要的记录,而不是所有的记录,结合起来,极大的提高了效率!!&lt;br&gt;
妙啊,真的妙!!!!
&lt;/p&gt;
&lt;p&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: black; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CREATE&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;PROCEDURE&lt;/span&gt; Paging_RowCount&lt;br&gt;
(&lt;br&gt;
@Tables &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(1000),&lt;br&gt;
@PK &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(100),&lt;br&gt;
@Sort &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(200)
= &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NULL&lt;/span&gt;,&lt;br&gt;
@PageNumber &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; =
1,&lt;br&gt;
@PageSize &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt; =
10,&lt;br&gt;
@Fields &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(1000)
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'*'&lt;/span&gt;,&lt;br&gt;
@Filter &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(1000)
= &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NULL&lt;/span&gt;,&lt;br&gt;
@&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Group&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(1000)
= &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NULL&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AS&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/*Default
Sorting*/&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; @Sort &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IS&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NULL&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;OR&lt;/span&gt; @Sort
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;''&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @Sort
= @PK&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/*Find
the @PK type*/&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @SortTable &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(100)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @SortName &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(100)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @strSortColumn &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(200)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @operator &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;char&lt;/span&gt;(2)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @type &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(100)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @prec &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;int&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/*Set
sorting variables.*/&lt;/span&gt; 
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CHARINDEX&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'DESC'&lt;/span&gt;,@Sort)&amp;gt;0&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;BEGIN&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strSortColumn
= &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;REPLACE&lt;/span&gt;(@Sort, &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'DESC'&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;''&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @operator
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'&amp;lt;='&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;END&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ELSE&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;BEGIN&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CHARINDEX&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'ASC'&lt;/span&gt;,
@Sort) = 0&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strSortColumn
= &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;REPLACE&lt;/span&gt;(@Sort, &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'ASC'&lt;/span&gt;, &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;''&lt;/span&gt;)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @operator
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'&amp;gt;='&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;END&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CHARINDEX&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'.'&lt;/span&gt;,
@strSortColumn) &amp;gt; 0&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;BEGIN&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @SortTable
= &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SUBSTRING&lt;/span&gt;(@strSortColumn,
0, &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CHARINDEX&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'.'&lt;/span&gt;,@strSortColumn))&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @SortName
= &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SUBSTRING&lt;/span&gt;(@strSortColumn, &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CHARINDEX&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'.'&lt;/span&gt;,@strSortColumn)
+ 1, &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;LEN&lt;/span&gt;(@strSortColumn))&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;END&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ELSE&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;BEGIN&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @SortTable
= @Tables&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @SortName
= @strSortColumn&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;END&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SELECT&lt;/span&gt; @type=t.name,
@prec=c.prec&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;FROM&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: lawngreen; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;sysobjects&lt;/span&gt; o 
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;JOIN&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: lawngreen; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;syscolumns&lt;/span&gt; c &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;on&lt;/span&gt; o.id=c.id&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;JOIN&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: lawngreen; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;systypes&lt;/span&gt; t &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;on&lt;/span&gt; c.xusertype=t.xusertype&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;WHERE&lt;/span&gt; o.name
= @SortTable &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AND&lt;/span&gt; c.name
= @SortName&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CHARINDEX&lt;/span&gt;(&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'char'&lt;/span&gt;,
@type) &amp;gt; 0&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @type
= @type + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'('&lt;/span&gt; + &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CAST&lt;/span&gt;(@prec &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AS&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;)
+ &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;')'&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @strPageSize &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(50)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @strStartRow &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(50)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @strFilter &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(1000)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @strSimpleFilter &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(1000)&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;DECLARE&lt;/span&gt; @strGroup &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(1000)&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/*Default
Page Number*/&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; @PageNumber
&amp;lt; 1&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @PageNumber
= 1&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/*Set
paging variables.*/&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strPageSize
= &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CAST&lt;/span&gt;(@PageSize &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AS&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(50))&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strStartRow
= &lt;span style="FONT-SIZE: 11px; COLOR: fuchsia; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;CAST&lt;/span&gt;(((@PageNumber
- 1)*@PageSize + 1) &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AS&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;varchar&lt;/span&gt;(50))&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/*Set
filter &amp;amp; group variables.*/&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; @Filter &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IS&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NOT&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NULL&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AND&lt;/span&gt; @Filter
!= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;''&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;BEGIN&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strFilter
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
WHERE '&lt;/span&gt; + @Filter + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
'&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strSimpleFilter
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
AND '&lt;/span&gt; + @Filter + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
'&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;END&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ELSE&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;BEGIN&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strSimpleFilter
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;''&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strFilter
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;''&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;END&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IF&lt;/span&gt; @&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Group&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;IS&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NOT&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;NULL&lt;/span&gt; &lt;span style="FONT-SIZE: 11px; COLOR: silver; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;AND&lt;/span&gt; @&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Group&lt;/span&gt; != &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;''&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strGroup
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
GROUP BY '&lt;/span&gt; + @&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;Group&lt;/span&gt; + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
'&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;ELSE&lt;/span&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;SET&lt;/span&gt; @strGroup
= &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;''&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: teal; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;/*Execute
dynamic query*/&lt;/span&gt; 
&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: blue; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;EXEC&lt;/span&gt;(&lt;br&gt;
&lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'&lt;br&gt;
DECLARE @SortColumn '&lt;/span&gt; + @type + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'&lt;br&gt;
SET ROWCOUNT '&lt;/span&gt; + @strStartRow + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'&lt;br&gt;
SELECT @SortColumn='&lt;/span&gt; + @strSortColumn + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
FROM '&lt;/span&gt; + @Tables + @strFilter + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
'&lt;/span&gt; + @strGroup + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
ORDER BY '&lt;/span&gt; + @Sort + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'&lt;br&gt;
SET ROWCOUNT '&lt;/span&gt; + @strPageSize + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'&lt;br&gt;
SELECT '&lt;/span&gt; + @Fields + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
FROM '&lt;/span&gt; + @Tables + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
WHERE '&lt;/span&gt; + @strSortColumn + @operator + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
@SortColumn '&lt;/span&gt; + @strSimpleFilter + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
'&lt;/span&gt; + @strGroup + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'
ORDER BY '&lt;/span&gt; + @Sort + &lt;span style="FONT-SIZE: 11px; COLOR: red; FONT-FAMILY: Courier New; BACKGROUND-COLOR: transparent"&gt;'&lt;br&gt;
'&lt;/span&gt;
&lt;br&gt;
)&lt;br&gt;
GO&lt;br&gt;
&lt;br&gt;
&lt;/span&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,770c6ce2-98df-4bed-8e39-2cd9352ecbbd.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=79dcc3dd-1aca-44e9-8470-1892c4862843</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,79dcc3dd-1aca-44e9-8470-1892c4862843.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,79dcc3dd-1aca-44e9-8470-1892c4862843.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=79dcc3dd-1aca-44e9-8470-1892c4862843</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
 在数据库应用的设计中，我们往往会需要获取某些表的记录总数，用于判断表的记录总数是否过大，是否需要备份数据等。我们通常的做法是：select count(*)
as c from tableA 。然而对于记录数巨大的表，上述做法将会非常耗时。在DELL 4400 服务器上做试验，MS Sqlserver 2000 数据库对于100万记录的简单数据表执行上述语句，时间在1分钟以上。如果在表的某个字段上做聚簇索引，第一次执行该语句的时间和没有索引的时间差不多，之后执行上述语句，速度很快，在1秒中以内，但当表的记录数发生较大变化后，再执行该语句又会经历一次耗时的过程。而且不是每个表都适合做聚簇索引的，对于数量巨大的表，如果需要经常增删操作，建聚簇索引是一个很不明智的做法，将会极大的影响增删的速度。那么有没有一个比较简单的方法快速获取表的记录总数呢？答案是有的。<br />
 在MS SQL 数据库中每个表都在sysindexes 系统表中拥有至少一条记录，该记录中的rows 字段会定时记录表的记录总数。下面是sysindexes
表的相关记录的含义：
</p>
        <p>
列名      数据类型            
描述<br />
id            int                      
 表ID(如果 indid = 0 或255)。否则为索引所属表的ID<br />
Indid       smallint               
索引ID：<br />
                                        
0＝表<br />
                                        
1＝聚簇索引<br />
                                        
&gt;1＝非聚簇索引<br />
                                       
255＝具有text或image数据的表条目。<br />
rows       int                      
基于indid=0 和 indid=1地数据级行数，该值对于indid&gt;1重 复。如果indid=255，rows设置为0。<br />
  <br />
  <br />
当表没有聚簇索引时，Indid = 0 否则为 1。
</p>
        <p>
那么现在大家应该知道如何获取表的记录总数了，只需执行如下语句：<br />
select rows from sysindexes where id = object_id(tablename) and indid in (0,1) 
</p>
        <p>
该方法获取表的记录总数的速度非常快，在毫秒级就可以完成，相比select count(*) 要快上数万倍，但是大家在运用该方法是一定要主要，该方法得到的表的总记录数不是一个精确值，原因是MS
SQL 并不是实时更新该字段的值，而是定时更新，当从实践来看该值和精确值一般误差不大，如果你希望快速的粗略估算表的大小，建议你采用该方法。如果你希望得到精确值，那么请在执行上述语句前执行DBCC
UPDATEUSAGE(DatabaseName,[TABLENAME]) WITH ROW_COUNTS 强制更新该字段的值，但这样第一次更新时会耗费大量的时间，这样做的效果和建有聚簇索引的表
select count (*) 效果相差不大，所以如果你希望相对快速地得到精确的表的记录总数，那么你有两种选择，建聚簇索引或者先DBCC 再使用上述方法。
</p>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>MS SQLSERVER中如何快速获取表的记录总数</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,79dcc3dd-1aca-44e9-8470-1892c4862843.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,79dcc3dd-1aca-44e9-8470-1892c4862843.aspx</link>
      <pubDate>Fri, 19 Aug 2005 02:56:31 GMT</pubDate>
      <description>&lt;p&gt;
&amp;nbsp;在数据库应用的设计中，我们往往会需要获取某些表的记录总数，用于判断表的记录总数是否过大，是否需要备份数据等。我们通常的做法是：select count(*)
as c from tableA 。然而对于记录数巨大的表，上述做法将会非常耗时。在DELL 4400 服务器上做试验，MS Sqlserver 2000 数据库对于100万记录的简单数据表执行上述语句，时间在1分钟以上。如果在表的某个字段上做聚簇索引，第一次执行该语句的时间和没有索引的时间差不多，之后执行上述语句，速度很快，在1秒中以内，但当表的记录数发生较大变化后，再执行该语句又会经历一次耗时的过程。而且不是每个表都适合做聚簇索引的，对于数量巨大的表，如果需要经常增删操作，建聚簇索引是一个很不明智的做法，将会极大的影响增删的速度。那么有没有一个比较简单的方法快速获取表的记录总数呢？答案是有的。&lt;br&gt;
&amp;nbsp;在MS SQL 数据库中每个表都在sysindexes 系统表中拥有至少一条记录，该记录中的rows 字段会定时记录表的记录总数。下面是sysindexes
表的相关记录的含义：
&lt;/p&gt;
&lt;p&gt;
列名&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;数据类型&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
描述&lt;br&gt;
id&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;表ID(如果 indid = 0 或255)。否则为索引所属表的ID&lt;br&gt;
Indid&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; smallint&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
索引ID：&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
0＝表&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
1＝聚簇索引&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;gt;1＝非聚簇索引&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
255＝具有text或image数据的表条目。&lt;br&gt;
rows&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
基于indid=0 和 indid=1地数据级行数，该值对于indid&amp;gt;1重 复。如果indid=255，rows设置为0。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
当表没有聚簇索引时，Indid = 0 否则为 1。
&lt;/p&gt;
&lt;p&gt;
那么现在大家应该知道如何获取表的记录总数了，只需执行如下语句：&lt;br&gt;
select rows from sysindexes where id = object_id(tablename) and indid in (0,1) 
&lt;/p&gt;
&lt;p&gt;
该方法获取表的记录总数的速度非常快，在毫秒级就可以完成，相比select count(*) 要快上数万倍，但是大家在运用该方法是一定要主要，该方法得到的表的总记录数不是一个精确值，原因是MS
SQL 并不是实时更新该字段的值，而是定时更新，当从实践来看该值和精确值一般误差不大，如果你希望快速的粗略估算表的大小，建议你采用该方法。如果你希望得到精确值，那么请在执行上述语句前执行DBCC
UPDATEUSAGE(DatabaseName,[TABLENAME]) WITH ROW_COUNTS 强制更新该字段的值，但这样第一次更新时会耗费大量的时间，这样做的效果和建有聚簇索引的表
select count (*) 效果相差不大，所以如果你希望相对快速地得到精确的表的记录总数，那么你有两种选择，建聚簇索引或者先DBCC 再使用上述方法。
&lt;/p&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,79dcc3dd-1aca-44e9-8470-1892c4862843.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=a380d48b-7818-4bc1-9724-4da179db4789</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,a380d48b-7818-4bc1-9724-4da179db4789.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,a380d48b-7818-4bc1-9724-4da179db4789.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=a380d48b-7818-4bc1-9724-4da179db4789</wfw:commentRss>
      <slash:comments>3</slash:comments>
      <title>实现千万级数据的分页显示！</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,a380d48b-7818-4bc1-9724-4da179db4789.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,a380d48b-7818-4bc1-9724-4da179db4789.aspx</link>
      <pubDate>Thu, 18 Aug 2005 01:26:54 GMT</pubDate>
      <description>&lt;p&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="2"&gt;&lt;font color="#a9a9a9"&gt;&lt;font color="#808080"&gt;&lt;font face="Courier New"&gt;/*&lt;br&gt;
经测试，在 14483461 条记录中查询第 100000 页，每页 10 条记录按升序和降序第一次时间均为 0.47 秒，第二次时间均为 0.43 秒，测试语法如下：&lt;br&gt;
&lt;font style="background-color: rgb(211, 211, 211);"&gt;&lt;font color="#0000ff"&gt;exec&lt;/font&gt; &lt;font color="#000000"&gt;GetRecordFromPage&lt;/font&gt; &lt;font color="#006400"&gt;news&lt;/font&gt;,&lt;font color="#006400"&gt;newsid&lt;/font&gt;,&lt;font color="#000000"&gt;10&lt;/font&gt;,&lt;font color="#000000"&gt;100000&lt;/font&gt;&lt;/font&gt;
&lt;br&gt;
news 为 表名, newsid 为关键字段, 使用时请先对 newsid 建立索引。&lt;br&gt;
*/&lt;br&gt;
&lt;br&gt;
&lt;/font&gt;&lt;font color="#808080"&gt;&lt;font face="Courier New"&gt;/*&lt;br&gt;
函数名称&lt;font color="#808080"&gt;: GetRecordFromPage&lt;br&gt;
&lt;/font&gt; 函数功能: 获取指定页的数据&lt;br&gt;
参数说明: @tblName 包含数据的表名&lt;br&gt;
@fldName 关键字段名&lt;br&gt;
@PageSize 每页记录数&lt;br&gt;
@PageIndex 要获取的页码&lt;br&gt;
@OrderType 排序类型, 0 - 升序, 1 - 降序&lt;br&gt;
@strWhere 查询条件 (注意: 不要加 where)&lt;br&gt;
作 者: 铁拳&lt;br&gt;
邮 箱: &lt;/font&gt;&lt;a href="mailto:sunjianhua_kki@sina.com"&gt;&lt;font face="Courier New"&gt;sunjianhua_kki@sina.com&lt;/font&gt;&lt;/a&gt;
&lt;br&gt;
&lt;font face="Courier New"&gt; 创建时间: 2004-07-04&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font color="#a9a9a9"&gt;&lt;font color="#808080"&gt;&lt;font color="#808080" face="Courier New"&gt; 修改时间:
2004-07-04&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;font face="Courier New"&gt;&lt;font color="#a9a9a9"&gt;&lt;font color="#808080"&gt;&lt;font color="#808080"&gt;*/&lt;br&gt;
&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;CREATE PROCEDURE&lt;/font&gt; GetRecordFromPage&lt;br&gt;
@tblName &lt;font color="#0000ff"&gt;varchar&lt;/font&gt;(255), &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#808080"&gt;--
表名&lt;br&gt;
&lt;/font&gt; @fldName &lt;font color="#0000ff"&gt;varchar&lt;/font&gt;(255), &lt;font color="#808080"&gt;--
字段名&lt;/font&gt;
&lt;br&gt;
@PageSize &lt;font color="#0000ff"&gt;int&lt;/font&gt; = 10, &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#808080"&gt;--
页尺寸&lt;br&gt;
&lt;/font&gt; @PageIndex &lt;font color="#0000ff"&gt;int&lt;/font&gt; = 1, &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#808080"&gt;--
页码&lt;br&gt;
&lt;/font&gt; @OrderType &lt;font color="#0000ff"&gt;bit&lt;/font&gt; = 0, &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#808080"&gt;--
设置排序类型, 非 0 值则降序&lt;br&gt;
&lt;/font&gt; @strWhere &lt;font color="#0000ff"&gt;varchar&lt;/font&gt;(2000) = '' &lt;/font&gt;&lt;font face="Courier New"&gt;&lt;font color="#808080"&gt;--
查询条件 (注意: 不要加 where)&lt;br&gt;
&lt;/font&gt;&lt;font color="#0000ff"&gt;AS&lt;/font&gt;&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size="2"&gt;&lt;font color="#0000ff"&gt;declare&lt;/font&gt; @strSQL &lt;font color="#0000ff"&gt;varchar&lt;/font&gt;(6000) &lt;font color="#808080"&gt;--
主语句&lt;br&gt;
&lt;/font&gt;&lt;font color="#0000ff"&gt;declare&lt;/font&gt; @strTmp &lt;font color="#0000ff"&gt;varchar&lt;/font&gt;(1000) &lt;font color="#808080"&gt;--
临时变量&lt;br&gt;
&lt;/font&gt;&lt;font color="#0000ff"&gt;declare&lt;/font&gt; @strOrder &lt;font color="#0000ff"&gt;varchar&lt;/font&gt;(500) &lt;font color="#808080"&gt;--
排序类型&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size="2"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt; @OrderType != 0&lt;br&gt;
&lt;font color="#0000ff"&gt;begin&lt;/font&gt;
&lt;br&gt;
&lt;font color="#0000ff"&gt;set&lt;/font&gt; @strTmp = '&lt;font color="#ff0000"&gt;&lt;(select min&lt;/font&gt;'&lt;br&gt;
&lt;font color="#0000ff"&gt;set&lt;/font&gt; @strOrder = '&lt;font color="#ff0000"&gt; order by [&lt;/font&gt;'
+ @fldName + '&lt;font color="#ff0000"&gt;] desc&lt;/font&gt;'&lt;br&gt;
&lt;font color="#0000ff"&gt;end&lt;br&gt;
else&lt;br&gt;
begin&lt;/font&gt;
&lt;br&gt;
&lt;font color="#0000ff"&gt;set&lt;/font&gt; @strTmp = '&lt;font color="#ff0000"&gt;&gt;(select max&lt;/font&gt;'&lt;br&gt;
&lt;font color="#0000ff"&gt;set&lt;/font&gt; @strOrder = '&lt;font color="#ff0000"&gt; order by [&lt;/font&gt;'
+ @fldName +'&lt;font color="#ff0000"&gt;] asc&lt;/font&gt;'&lt;br&gt;
&lt;font color="#0000ff"&gt;end&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size="2"&gt;&lt;font color="#0000ff"&gt;set&lt;/font&gt; @strSQL = '&lt;font color="#ff0000"&gt;select
top&lt;/font&gt; ' + &lt;font color="#ff1493"&gt;str&lt;/font&gt;(@PageSize) + '&lt;font color="#ff0000"&gt; *
from [&lt;/font&gt;'&lt;br&gt;
+ @tblName + '&lt;font color="#ff0000"&gt;] where [&lt;/font&gt;' + @fldName + '&lt;font color="#ff0000"&gt;]&lt;/font&gt;'
+ @strTmp + '&lt;font color="#ff0000"&gt;([&lt;/font&gt;'&lt;br&gt;
+ @fldName + '&lt;font color="#ff0000"&gt;]) from (select top&lt;/font&gt; ' + &lt;font color="#ff1493"&gt;str&lt;/font&gt;((@PageIndex-1)*@PageSize)
+ '&lt;font color="#ff0000"&gt; [&lt;/font&gt;'&lt;br&gt;
+ @fldName + '&lt;font color="#ff0000"&gt;] from [&lt;/font&gt;' + @tblName + '&lt;font color="#ff0000"&gt;]&lt;/font&gt;'
+ @strOrder + '&lt;font color="#ff0000"&gt;) as tblTmp)&lt;/font&gt;'&lt;br&gt;
+ @strOrder&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size="2"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt; @strWhere != ''&lt;br&gt;
&lt;font color="#0000ff"&gt;set&lt;/font&gt; @strSQL = '&lt;font color="#ff0000"&gt;select top &lt;/font&gt;'
+ &lt;font color="#ff1493"&gt;str&lt;/font&gt;(@PageSize) + '&lt;font color="#ff0000"&gt; * from [&lt;/font&gt;'&lt;br&gt;
+ @tblName + '&lt;font color="#ff0000"&gt;] where [&lt;/font&gt;' + @fldName + '&lt;font color="#ff0000"&gt;]&lt;/font&gt;'
+ @strTmp + '&lt;font color="#ff0000"&gt;([&lt;/font&gt;'&lt;br&gt;
+ @fldName + '&lt;font color="#ff0000"&gt;]) from (select top&lt;/font&gt; ' + &lt;font color="#ff1493"&gt;str&lt;/font&gt;((@PageIndex-1)*@PageSize)
+ '&lt;font color="#ff0000"&gt; [&lt;/font&gt;'&lt;br&gt;
+ @fldName + '&lt;font color="#ff0000"&gt;] from [&lt;/font&gt;' + @tblName + '&lt;font color="#ff0000"&gt;]
where&lt;/font&gt; ' + @strWhere + '&lt;font color="#ff0000"&gt; &lt;/font&gt;'&lt;br&gt;
+ @strOrder + '&lt;font color="#ff0000"&gt;) as tblTmp) and&lt;/font&gt; ' + @strWhere + '&lt;font color="#ff0000"&gt; &lt;/font&gt;'
+ @strOrder&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size="2"&gt;&lt;font color="#0000ff"&gt;if&lt;/font&gt; @PageIndex = 1&lt;br&gt;
&lt;font color="#0000ff"&gt;begin&lt;/font&gt;
&lt;br&gt;
&lt;font color="#0000ff"&gt;set&lt;/font&gt; @strTmp = ''&lt;br&gt;
&lt;font color="#0000ff"&gt;if&lt;/font&gt; @strWhere != ''&lt;br&gt;
&lt;font color="#0000ff"&gt;set&lt;/font&gt; @strTmp = '&lt;font color="#ff0000"&gt; where (&lt;/font&gt;'
+ @strWhere + '&lt;font color="#ff0000"&gt;)&lt;/font&gt;'&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size="2"&gt; &lt;font color="#0000ff"&gt;set&lt;/font&gt; @strSQL = '&lt;font color="#ff0000"&gt;select
top&lt;/font&gt; ' + &lt;font color="#ff1493"&gt;str&lt;/font&gt;(@PageSize) + '&lt;font color="#ff0000"&gt; *
from [&lt;/font&gt;'&lt;br&gt;
+ @tblName + '&lt;font color="#ff0000"&gt;]&lt;/font&gt;' + @strTmp + '&lt;font color="#ff0000"&gt; &lt;/font&gt;'
+ @strOrder&lt;br&gt;
&lt;font color="#0000ff"&gt;end&lt;/font&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="Courier New" size="2"&gt;&lt;font color="#0000ff"&gt;exec&lt;/font&gt; (@strSQL)&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font color="#0000ff" face="Courier New" size="2"&gt;GO&lt;/font&gt;
&lt;/p&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,a380d48b-7818-4bc1-9724-4da179db4789.aspx</comments>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=f5766311-2603-4dc7-9989-c16c95832f3e</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,f5766311-2603-4dc7-9989-c16c95832f3e.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,f5766311-2603-4dc7-9989-c16c95832f3e.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=f5766311-2603-4dc7-9989-c16c95832f3e</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">Cω是微软研究院对下一代语言的探索。它扩展了C#的功能，更好的支持数据访问(SQL和XML)和并发控制。<br />
Cω的希望能方便的开发出更加可靠且维护性更好的软件，其中一个重要的概念就是"尽早的发现错误"。<br />
在下面的一个数据库查询的例子中将很好的体现出这一点。 
<p>
现在我想得到一个在某个城市的员工名字的列表。(就使用SQL-Server预装的Northwind数据库)<br />
下面给出最简单的实现：<br />
 <br />
       <span class="code"><strong><font face="Courier New" color="#3366ff"> 
SqlDataAdapter da = new SqlDataAdapter(<br />
      "SELECT * FROM Employees WHERE City='"+city+"'", nwindConn
);<br />
DataSet ds = new DataSet();<br />
      da.Fill(ds,"Employees");<br /></font></strong></span><span class="code"><strong><font face="Courier New" color="#3366ff">     
foreach (DataRow dr in ds.Tables["Employees"].Rows)<br />
      {<br />
            string name = dr["LastName"].ToString();<br />
int id = (int)dr["EmployeeID"];<br />
            Console.WriteLine(
id + ": " + name);<br />
      } </font></strong></span></p><p>
让我们来看看有哪些地方容易出错：<br />
1. city参数可能会被SQL注入攻击利用.<br />
2. 数据类型是弱类型，需要强制转换类型，容易出现Runtime error.<br />
3. 表名和列名都是文字，不是类型变量。编译器无法做检查，容易出现Runtime error.<br />
   (想必不少人碰到过写错表名，导致数据库访问出错，而debug n久的事情.)<br />
4. 查询语句也是文字，同样无法通过编译检查是否出错，容易出现Runtime error.
</p><p>
通过使用SqlParameters以及Typed DataSet我们可以避免前三个问题<br />
         <span class="code"><strong><font face="Courier New" color="#3366ff"> SqlDataAdapter
da = new SqlDataAdapter(<br />
            "SELECT * FROM
Employees WHERE City= @city", nwindConn );<br />
      SqlParameter cityParam = da.SelectCommand.Parameters.Add("@city",
SqlDbType.VarChar, 80);<br />
      cityParam.Value = city;<br />
      NorthwindDataSet ds = new NorthwindDataSet();<br />
      da.Fill(ds, ds.Employees.TableName );<br />
      foreach (NorthwindDataSet.EmployeesRow dr in ds.Employees.Rows)<br />
      {<br />
            string name = dr.LastName;<br /></font></strong></span><span class="code"><strong><font face="Courier New" color="#3366ff">           
int id = dr.EmployeeID;<br />
            Console.WriteLine(
id + ": " + name);<br />
      }</font></strong></span></p><p>
但是第四个问题仍没有解决。也许你想到了 SQL stored procedure，就像下面这样：    
</p><p><span class="code"><font face="Courier New" color="#3366ff"><strong>    
 CREATE PROCEDURE EmployeesForCity<br />
      @City nvarchar(80)  AS<br />
      SELECT EmployeeID, LastName FROM Employees WHERE City =
@City</strong></font></span></p><p><span class="code"><br /><strong><font face="Courier New" color="#3366ff">       SqlCommand
cmd = new SqlCommand( "dbo.EmployeesForCity", nwindConn );<br />
      cmd.CommandType = CommandType.StoredProcedure;<br />
      SqlParameter cityParam = cmd.Parameters.Add("@city",
SqlDbType.VarChar, 80);<br />
      cityParam.Value = city;<br />
      SqlDataAdapter da = new SqlDataAdapter( cmd );<br />
      NorthwindDataSet ds = new NorthwindDataSet();<br />
      da.Fill(ds, ds.EmployeesForCity.TableName );<br />
      foreach (NorthwindDataSet.EmployeesForCityRow dr in
ds.EmployeesForCity.Rows)<br />
      {<br />
            string name = dr.LastName;<br />
            int id = dr.EmployeeID;<br />
            Console.WriteLine(
id + ": " + name);<br />
      }<br /></font></strong></span></p><p>
SQL查询语句虽然不能在编译器检查，但是至少我们可以先在SQL-server中验证stored procedure，<br />
再运行我们的程序,比Runtime error好多了。但是万一stored procedure改了，或者是数据库改了，<br />
那我们又会看到Runtime error。问题的根本在于我们的代码和数据库的联系实在是太弱了。对于一<br />
个小程序就如此容易出现问题，那么对于那种和数据库紧密联系的大型应用就更别谈了。
</p><p>
再来看看C-omega的解决方案：<br />
    <span class="code"><strong><font face="Courier New" color="#3366ff">  
 rows = select * from DB.Employees where City == city;             
<br />
      foreach( row in rows ) 
<br />
      {<br />
            string name = row.LastName.Value;<br />
            int id = row.EmployeeID.Value;<br />
            Console.WriteLine(
id.ToString() + ": " + name);<br />
      }<br /></font></strong></span></p><p>
以上代码需要引起注意的地方:<br />
1. 可以将本地变量city直接放入SQL语句，不会被SQL注入攻击。<br />
2. 结果集是强类型的，意味着在程序编译的时候我们就知道数据库的结构，甚至可以使用VS.net<br />
所带的智能感知(自动完成)功能。<br />
3. 在rows以及row前面甚至没有使用类型名，而它们却都是强类型的。<br />
4. 不再含有文字类型的信息，避免了人为输入错误。<br />
5. 在程序编译的时候就已经和数据库连接，当数据库发生变化的时候，在编译器就会报错。
</p><p>
如果你不喜欢SQL的语法，你甚至用三行代码就能搞定以上所有任务。<br />
   <span class="code"><strong><font face="Courier New" color="#3366ff">DB.Employees
[City==city].{ <br />
     Console.WriteLine( it.EmployeeID + ": " + t.LastName
);<br />
      };<br /></font></strong></span></p><p>
从c++到C#我们常听见的一句话就是c＃是类型安全的。何谓类型安全？就是.Net Runtime支持编译期的类型检查。也就是尽量让Runtime error变成Compile
error，可以看出Cω在这个方面更进了一步。
</p><p>
注：鉴于个人水平以及资料方面的原因对其内部机制实现笔者并为做深入研究。
</p><br /><hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>C-omega vs ADO.net </title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,f5766311-2603-4dc7-9989-c16c95832f3e.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,f5766311-2603-4dc7-9989-c16c95832f3e.aspx</link>
      <pubDate>Tue, 05 Apr 2005 03:24:39 GMT</pubDate>
      <description>Cω是微软研究院对下一代语言的探索。它扩展了C#的功能，更好的支持数据访问(SQL和XML)和并发控制。&lt;br&gt;
Cω的希望能方便的开发出更加可靠且维护性更好的软件，其中一个重要的概念就是"尽早的发现错误"。&lt;br&gt;
在下面的一个数据库查询的例子中将很好的体现出这一点。 
&lt;p&gt;
现在我想得到一个在某个城市的员工名字的列表。(就使用SQL-Server预装的Northwind数据库)&lt;br&gt;
下面给出最简单的实现：&lt;br&gt;
&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=code&gt;&lt;strong&gt;&lt;font face="Courier New" color=#3366ff&gt;&amp;nbsp;
SqlDataAdapter da = new SqlDataAdapter(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "SELECT * FROM Employees WHERE City='"+city+"'", nwindConn
);&lt;br&gt;
DataSet ds = new DataSet();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; da.Fill(ds,"Employees");&lt;br&gt;
&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span class=code&gt;&lt;strong&gt;&lt;font face="Courier New" color=#3366ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
foreach (DataRow dr in ds.Tables["Employees"].Rows)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string name = dr["LastName"].ToString();&lt;br&gt;
int id = (int)dr["EmployeeID"];&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(
id + ": " + name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
让我们来看看有哪些地方容易出错：&lt;br&gt;
1. city参数可能会被SQL注入攻击利用.&lt;br&gt;
2. 数据类型是弱类型，需要强制转换类型，容易出现Runtime error.&lt;br&gt;
3. 表名和列名都是文字，不是类型变量。编译器无法做检查，容易出现Runtime error.&lt;br&gt;
&amp;nbsp;&amp;nbsp; (想必不少人碰到过写错表名，导致数据库访问出错，而debug n久的事情.)&lt;br&gt;
4. 查询语句也是文字，同样无法通过编译检查是否出错，容易出现Runtime error.
&lt;/p&gt;
&lt;p&gt;
通过使用SqlParameters以及Typed DataSet我们可以避免前三个问题&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=code&gt;&lt;strong&gt;&lt;font face="Courier New" color=#3366ff&gt; SqlDataAdapter
da = new SqlDataAdapter(&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "SELECT * FROM
Employees WHERE City= @city", nwindConn );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlParameter cityParam = da.SelectCommand.Parameters.Add("@city",
SqlDbType.VarChar, 80);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cityParam.Value = city;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NorthwindDataSet ds = new NorthwindDataSet();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; da.Fill(ds, ds.Employees.TableName );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (NorthwindDataSet.EmployeesRow dr in ds.Employees.Rows)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string name = dr.LastName;&lt;br&gt;
&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span class=code&gt;&lt;strong&gt;&lt;font face="Courier New" color=#3366ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
int id = dr.EmployeeID;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(
id + ": " + name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
但是第四个问题仍没有解决。也许你想到了 SQL stored procedure，就像下面这样：&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&lt;span class=code&gt;&lt;font face="Courier New" color=#3366ff&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;CREATE PROCEDURE EmployeesForCity&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; @City nvarchar(80)&amp;nbsp;&amp;nbsp;AS&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SELECT EmployeeID, LastName FROM Employees WHERE&amp;nbsp;City&amp;nbsp;=
@City&lt;/strong&gt;&lt;/font&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;span class=code&gt;
&lt;br&gt;
&lt;strong&gt;&lt;font face="Courier New" color=#3366ff&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SqlCommand
cmd = new SqlCommand( "dbo.EmployeesForCity", nwindConn );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cmd.CommandType = CommandType.StoredProcedure;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlParameter cityParam = cmd.Parameters.Add("@city",
SqlDbType.VarChar, 80);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; cityParam.Value = city;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SqlDataAdapter da = new SqlDataAdapter( cmd );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NorthwindDataSet ds = new NorthwindDataSet();&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; da.Fill(ds, ds.EmployeesForCity.TableName );&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach (NorthwindDataSet.EmployeesForCityRow dr in
ds.EmployeesForCity.Rows)&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string name = dr.LastName;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int id = dr.EmployeeID;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(
id + ": " + name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
SQL查询语句虽然不能在编译器检查，但是至少我们可以先在SQL-server中验证stored procedure，&lt;br&gt;
再运行我们的程序,比Runtime error好多了。但是万一stored procedure改了，或者是数据库改了，&lt;br&gt;
那我们又会看到Runtime error。问题的根本在于我们的代码和数据库的联系实在是太弱了。对于一&lt;br&gt;
个小程序就如此容易出现问题，那么对于那种和数据库紧密联系的大型应用就更别谈了。
&lt;/p&gt;
&lt;p&gt;
再来看看C-omega的解决方案：&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=code&gt;&lt;strong&gt;&lt;font face="Courier New" color=#3366ff&gt;&amp;nbsp;&amp;nbsp;
&amp;nbsp;rows = select * from DB.Employees where City == city; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; foreach( row in rows ) 
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; string name = row.LastName.Value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; int id = row.EmployeeID.Value;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Console.WriteLine(
id.ToString() + ": " + name);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br&gt;
&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
以上代码需要引起注意的地方:&lt;br&gt;
1. 可以将本地变量city直接放入SQL语句，不会被SQL注入攻击。&lt;br&gt;
2. 结果集是强类型的，意味着在程序编译的时候我们就知道数据库的结构，甚至可以使用VS.net&lt;br&gt;
所带的智能感知(自动完成)功能。&lt;br&gt;
3. 在rows以及row前面甚至没有使用类型名，而它们却都是强类型的。&lt;br&gt;
4. 不再含有文字类型的信息，避免了人为输入错误。&lt;br&gt;
5. 在程序编译的时候就已经和数据库连接，当数据库发生变化的时候，在编译器就会报错。
&lt;/p&gt;
&lt;p&gt;
如果你不喜欢SQL的语法，你甚至用三行代码就能搞定以上所有任务。&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class=code&gt;&lt;strong&gt;&lt;font face="Courier New" color=#3366ff&gt;DB.Employees
[City==city].{&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine( it.EmployeeID + ": " + t.LastName
);&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; };&lt;br&gt;
&lt;/font&gt;&lt;/strong&gt;&lt;/span&gt;
&lt;/p&gt;
&lt;p&gt;
从c++到C#我们常听见的一句话就是c＃是类型安全的。何谓类型安全？就是.Net Runtime支持编译期的类型检查。也就是尽量让Runtime error变成Compile
error，可以看出Cω在这个方面更进了一步。
&lt;/p&gt;
&lt;p&gt;
注：鉴于个人水平以及资料方面的原因对其内部机制实现笔者并为做深入研究。
&lt;/p&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,f5766311-2603-4dc7-9989-c16c95832f3e.aspx</comments>
      <category>DATABASE</category>
      <category>CSharp</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=92b78c16-80b7-43a2-8538-7db63ce17f07</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,92b78c16-80b7-43a2-8538-7db63ce17f07.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,92b78c16-80b7-43a2-8538-7db63ce17f07.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=92b78c16-80b7-43a2-8538-7db63ce17f07</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <span style="COLOR: #000000">
          <span style="COLOR: #008200">//*********************************************************** <br /></span>
          <br />
          <span style="COLOR: #008200">//*名称：一个程序详细研究DataReader,同时显示Command用法 <br /></span>
          <br />
          <span style="COLOR: #008200">//*功能：演示DataReader的各项操作。 <br /></span>
          <br />
          <span style="COLOR: #008200">//*说明：如果需要文字说明请查看我的BLOG里面关于ado.net的文章 <br /></span>
          <br />
          <span style="COLOR: #008200">//*作者：雪冬寒 <br /></span>
          <br />
          <span style="COLOR: #008200">//*BOLG：http://blog.csdn.net/bineon <br /></span>
          <br />
          <span style="COLOR: #008200">//*********************************************************** </span>
        </span>
        <br />
        <span style="COLOR: #000000">
          <span style="COLOR: #0000ff">using</span> System; <br /><span style="COLOR: #0000ff">using</span> System.Data; <br /><span style="COLOR: #0000ff">using</span> System.Data.SqlClient; <br /><span style="COLOR: #0000ff">using</span> System.Data.OleDb; <br /><br /><span style="COLOR: #0000ff">class</span> SqlReader <br />
{ <br />
 <span style="COLOR: #0000ff">const</span> <span style="COLOR: #0000ff">string</span> connStr = <span style="COLOR: #848284">"data source=bineon;user id=sa;password=87345587;initial catalog=contract"</span>; <br />
 SqlConnection conn;  <br /><br />
  <br />
 <span style="COLOR: #0000ff">public</span> SqlReader() <br />
 { <br />
  conn = <span style="COLOR: #0000ff">new</span> SqlConnection(connStr); <br />
 } <br /><br /><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #008200">//*演示DataReader的两种取值方法 <br /></span><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> basicReader() <br />
  <br />
  <span style="COLOR: #0000ff">string</span> sql=<span style="COLOR: #848284">"select * from friend"</span>; <br />
  SqlCommand cmd; <br />
  cmd = conn.CreateCommand(); <br />
  cmd.CommandText = sql; <br />
  conn.Open(); <br />
  SqlDataReader reader = cmd.ExecuteReader(); <br />
  <span style="COLOR: #0000ff">while</span>(reader.Read()) <br />
    <br />
   Console.WriteLine(<span style="COLOR: #848284">"No: 0}\tName: 1}\tPhoneNum: 2},\tAddress: 3}"</span>,reader.GetInt32(0).ToString(),reader.GetString(1),reader[2].ToString(),reader[<span style="COLOR: #848284">"Faddress"</span>].ToString()); <br />
  } <br />
  showSplit(); <br />
  reader.Close(); <br />
  conn.Close(); <br />
} <br /><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #008200">//*演示带参数查询的操作，使用SqlCilent <br /></span><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> hasParamReader() <br />
  <br />
  SqlCommand cmd; <br />
  cmd = conn.CreateCommand(); <br />
  <span style="COLOR: #0000ff">string</span> sql = <span style="COLOR: #848284">"select Fname,Fphone,Faddress from friend where Fid &gt; @Fid"</span>; <br />
  cmd.CommandText = sql; <br />
  SqlParameter param = <span style="COLOR: #0000ff">new</span> SqlParameter(<span style="COLOR: #848284">"@Fid"</span>,SqlDbType.Int,4); <br />
  param.value = 15; <br />
  cmd.Parameters.Add(param); <br />
  conn.Open(); <br />
  <span style="COLOR: #008200">//当关闭reader的时候同时关闭数据库连接 <br /></span><br />
  SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.CloseConnection); <br />
  <span style="COLOR: #0000ff">while</span>(reader.Read()) <br />
    <br />
   Console.WriteLine(<span style="COLOR: #848284">"Name: 0}\tPhoneNum: 1}\tAddress: 2}"</span>,reader.GetString(0),reader.GetString(1),reader.GetString(2)); <br />
  } <br />
  showSplit(); <br />
  <span style="COLOR: #008200">//无需关闭conn,系统会自动调用这个方法来关闭conn的。 <br /></span><br />
  reader.Close(); <br />
} <br /><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #008200">//*演示带参数查询的操作,使用OleDb <br /></span><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> hasOledbParamReader() <br />
  <br />
  SqlCommand cmd; <br />
  cmd = conn.CreateCommand(); <br />
  <span style="COLOR: #0000ff">string</span> sql = <span style="COLOR: #848284">"select Fname,Fphone,Faddress from friend where Fid &gt; ?"</span>; <br />
  <span style="COLOR: #0000ff">string</span> oledbConnStr = <span style="COLOR: #848284">"Provider=sqloledb;"</span> + connStr; <br />
  OleDbConnection oleConn = <span style="COLOR: #0000ff">new</span> OleDbConnection(oledbConnStr); <br />
  OleDbCommand oleCmd = <span style="COLOR: #0000ff">new</span> OleDbCommand(sql,oleConn); <br />
  oleCmd.Parameters.Add(<span style="COLOR: #848284">"nothing"</span>,15); <br />
  oleConn.Open(); <br />
  OleDbDataReader oleReader = oleCmd.ExecuteReader(); <br />
  <span style="COLOR: #0000ff">while</span>(oleReader.Read()) <br />
    <br />
   Console.WriteLine(<span style="COLOR: #848284">"Name: 0}\tPhoneNum: 1}\tAddress: 2}"</span>,oleReader.GetString(0),oleReader.GetString(1),oleReader.GetString(2)); <br />
  } <br />
  showSplit(); <br />
  oleReader.Close(); <br />
  oleConn.Close(); <br />
} <br /><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #008200">//*演示存储过程的输出参数 <br /></span><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> outParamShow() <br />
  <br />
  SqlCommand cmd; <br />
  cmd = conn.CreateCommand(); <br />
  cmd.CommandText = <span style="COLOR: #848284">"GetInfo"</span>; <br />
  cmd.CommandType = CommandType.StoredProcedure; <br />
  SqlParameter param = cmd.Parameters.Add(<span style="COLOR: #848284">"@Fid"</span>,16); <br />
  param = cmd.Parameters.Add(<span style="COLOR: #848284">"@Fname"</span>,SqlDbType.VarChar,8); <br />
  param.Direction = ParameterDirection.Output; <br />
  param = cmd.Parameters.Add(<span style="COLOR: #848284">"@Fphone"</span>,SqlDbType.VarChar,8); <br />
  param.Direction = ParameterDirection.Output; <br />
  conn.Open(); <br />
  cmd.ExecuteNonQuery(); <br />
  <span style="COLOR: #0000ff">string</span> Fname = cmd.Parameters[<span style="COLOR: #848284">"@Fname"</span>].value.ToString(); <br />
  <span style="COLOR: #0000ff">string</span> Fphone = cmd.Parameters[<span style="COLOR: #848284">"@Fphone"</span>].value.ToString(); <br />
  Console.WriteLine(Fname + <span style="COLOR: #848284">"  "</span> + Fphone); <br />
  conn.Close(); <br />
  showSplit(); <br />
} <br /><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #008200">//*演示读取多个无关记录集 <br /></span><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> multiResult() <br />
  <br />
  SqlCommand cmd; <br />
  cmd = conn.CreateCommand(); <br />
  <span style="COLOR: #0000ff">string</span> sqla = <span style="COLOR: #848284">"select Fname from friend"</span>; <br />
  <span style="COLOR: #0000ff">string</span> sqlb = <span style="COLOR: #848284">"select Fphone from friend"</span>; <br />
  cmd.CommandText = sqla + <span style="COLOR: #848284">";"</span> + sqlb; <br />
  conn.Open(); <br />
  SqlDataReader reader= cmd.ExecuteReader(); <br />
  <span style="COLOR: #0000ff">int</span> i = 1; <br />
  <span style="COLOR: #0000ff">do</span> <br />
    <br />
   Console.WriteLine(<span style="COLOR: #848284">"第"</span> + i.ToString() + <span style="COLOR: #848284">"个记录集内容如下：\n"</span>); <br />
   <span style="COLOR: #0000ff">while</span>(reader.Read()) <br />
     <br />
    Console.WriteLine(reader[0].ToString() + <span style="COLOR: #848284">"\t"</span>); <br />
   } <br />
   i++; <br />
  }<span style="COLOR: #0000ff">while</span>(reader.NextResult()); <span style="COLOR: #008200">//NextResult()移动到下一个记录集 <br /></span><br />
  reader.Close(); <br />
  conn.Close(); <br />
  showSplit(); <br />
} <br /><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #008200">//*使用DataReader获得数据库模式信息 <br /></span><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> getSchema() <br />
  <br />
  SqlCommand cmd; <br />
  cmd = conn.CreateCommand(); <br />
  <span style="COLOR: #0000ff">string</span> sql = <span style="COLOR: #848284">"select Fid,Fname,Fphone from friend"</span>; <br />
     cmd.CommandText = sql; <br />
     conn.Open(); <br />
     SqlDataReader reader = cmd.ExecuteReader(); <br />
     DataTable SchemaTable = reader.GetSchemaTable(); <br />
     <br />
     DataRowCollection SchemaColumns = SchemaTable.Rows; <br />
     DataColumnCollection SchemaProps = SchemaTable.Columns;   <br />
     <span style="COLOR: #0000ff">foreach</span>(DataRow SchemaColumn <span style="COLOR: #0000ff">in</span> SchemaColumns) <br />
       <br />
      <span style="COLOR: #0000ff">foreach</span>(DataColumn SchemaColumnProp <span style="COLOR: #0000ff">in</span> SchemaProps) <br />
        <br />
       Console.WriteLine(SchemaColumnProp.ColumnName + <span style="COLOR: #848284">"="</span> + SchemaColumn[SchemaColumnProp.ColumnName].ToString()); <br />
      } <br />
     } <br />
     reader.Close(); <br />
     conn.Close(); <br />
     showSplit(); <br />
} <br /><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #008200">//*从数据库读取二进制数据的代码段 <br /></span><br /><span style="COLOR: #008200">//*该代码段只是读取二进制的片断，不是 <br /></span><br /><span style="COLOR: #008200">//*整个程序，所以不能执行，你可以把它 <br /></span><br /><span style="COLOR: #008200">//*集成到你的WinForm项目里面。 <br /></span><br /><span style="COLOR: #008200">//************************************** <br /></span><br /><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">void</span> getBinary() <br />
  <br />
  <span style="COLOR: #008200">/* <br />
  System.IO.MemoryStream stream = new System.IO.MemoryStream(); <br />
  System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);   <br />
  int BufferSize = 1024; <br />
  byte[] Buffer = new Byte[BufferSize]; <br />
  long Offset = 0; <br />
  long BytesRead = 0; <br />
  do <br />
    <br />
   BytesRead = reader.GetBytes(2,Offset,Buffer,0,BufferSize); <br />
   writer.Writer(Buffer,0,(int)BytesRead); <br />
   writer.Flush(); <br />
   Offset += BytesRead; <br />
  } <br />
  while(BytesRead == BufferSize); <br />
  */</span> <br />
} <br /><br /><span style="COLOR: #008200">//添加输出分隔 <br /></span><br /><span style="COLOR: #0000ff">private</span> <span style="COLOR: #0000ff">void</span> showSplit() <br />
  <br />
  Console.WriteLine(<span style="COLOR: #848284">"\n********************************************************************\n"</span>); <br />
} <br /><br /><span style="COLOR: #0000ff">public</span> <span style="COLOR: #0000ff">static</span> <span style="COLOR: #0000ff">void</span> Main(<span style="COLOR: #0000ff">string</span> [] args) <br />
  <br />
  SqlReader sqlreader = <span style="COLOR: #0000ff">new</span> SqlReader(); <br />
   <br />
  sqlreader.basicReader(); <br />
   <br />
  sqlreader.hasParamReader(); <br />
   <br />
  sqlreader.hasOledbParamReader(); <br />
   <br />
  sqlreader.outParamShow(); <br />
   <br />
  sqlreader.multiResult(); <br />
   <br />
  sqlreader.getSchema(); <br />
} <br />
}</span>
        <br />
        <hr />
This weblog is sponsored by <a href="http://www.qihangnet.com">Qihangnet</a>. 
</body>
      <title>一个程序详细研究DataReader</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,92b78c16-80b7-43a2-8538-7db63ce17f07.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,92b78c16-80b7-43a2-8538-7db63ce17f07.aspx</link>
      <pubDate>Wed, 23 Mar 2005 09:08:34 GMT</pubDate>
      <description>&lt;span style="COLOR: #000000"&gt;&lt;span style="COLOR: #008200"&gt;//***********************************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*名称：一个程序详细研究DataReader,同时显示Command用法&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*功能：演示DataReader的各项操作。&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*说明：如果需要文字说明请查看我的BLOG里面关于ado.net的文章&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*作者：雪冬寒&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*BOLG：http://blog.csdn.net/bineon&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//***********************************************************&amp;nbsp;&lt;/span&gt;&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #000000"&gt;&lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System;&amp;nbsp;&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Data;&amp;nbsp;&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Data.SqlClient;&amp;nbsp;&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;using&lt;/span&gt;&amp;nbsp;System.Data.OleDb;&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;SqlReader&amp;nbsp;&lt;br&gt;
{&amp;nbsp;&lt;br&gt;
&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;connStr&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"data&amp;nbsp;source=bineon;user&amp;nbsp;id=sa;password=87345587;initial&amp;nbsp;catalog=contract"&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&amp;nbsp;SqlConnection&amp;nbsp;conn;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;SqlReader()&amp;nbsp;&lt;br&gt;
&amp;nbsp;{&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;conn&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;SqlConnection(connStr);&amp;nbsp;&lt;br&gt;
&amp;nbsp;}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*演示DataReader的两种取值方法&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;basicReader()&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;sql=&lt;span style="COLOR: #848284"&gt;"select&amp;nbsp;*&amp;nbsp;from&amp;nbsp;friend"&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlCommand&amp;nbsp;cmd;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;=&amp;nbsp;conn.CreateCommand();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd.CommandText&amp;nbsp;=&amp;nbsp;sql;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;conn.Open();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlDataReader&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;cmd.ExecuteReader();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;while&lt;/span&gt;(reader.Read())&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="COLOR: #848284"&gt;"No:&amp;nbsp;0}\tName:&amp;nbsp;1}\tPhoneNum:&amp;nbsp;2},\tAddress:&amp;nbsp;3}"&lt;/span&gt;,reader.GetInt32(0).ToString(),reader.GetString(1),reader[2].ToString(),reader[&lt;span style="COLOR: #848284"&gt;"Faddress"&lt;/span&gt;].ToString());&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;showSplit();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;reader.Close();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;conn.Close();&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*演示带参数查询的操作，使用SqlCilent&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;hasParamReader()&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlCommand&amp;nbsp;cmd;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;=&amp;nbsp;conn.CreateCommand();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"select&amp;nbsp;Fname,Fphone,Faddress&amp;nbsp;from&amp;nbsp;friend&amp;nbsp;where&amp;nbsp;Fid&amp;nbsp;&amp;gt;&amp;nbsp;@Fid"&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd.CommandText&amp;nbsp;=&amp;nbsp;sql;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlParameter&amp;nbsp;param&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;SqlParameter(&lt;span style="COLOR: #848284"&gt;"@Fid"&lt;/span&gt;,SqlDbType.Int,4);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;param.value&amp;nbsp;=&amp;nbsp;15;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd.Parameters.Add(param);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;conn.Open();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #008200"&gt;//当关闭reader的时候同时关闭数据库连接&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlDataReader&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;cmd.ExecuteReader(CommandBehavior.CloseConnection);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;while&lt;/span&gt;(reader.Read())&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="COLOR: #848284"&gt;"Name:&amp;nbsp;0}\tPhoneNum:&amp;nbsp;1}\tAddress:&amp;nbsp;2}"&lt;/span&gt;,reader.GetString(0),reader.GetString(1),reader.GetString(2));&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;showSplit();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #008200"&gt;//无需关闭conn,系统会自动调用这个方法来关闭conn的。&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;reader.Close();&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*演示带参数查询的操作,使用OleDb&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;hasOledbParamReader()&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlCommand&amp;nbsp;cmd;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;=&amp;nbsp;conn.CreateCommand();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"select&amp;nbsp;Fname,Fphone,Faddress&amp;nbsp;from&amp;nbsp;friend&amp;nbsp;where&amp;nbsp;Fid&amp;nbsp;&amp;gt;&amp;nbsp;?"&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;oledbConnStr&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"Provider=sqloledb;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;connStr;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;OleDbConnection&amp;nbsp;oleConn&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;OleDbConnection(oledbConnStr);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;OleDbCommand&amp;nbsp;oleCmd&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;OleDbCommand(sql,oleConn);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;oleCmd.Parameters.Add(&lt;span style="COLOR: #848284"&gt;"nothing"&lt;/span&gt;,15);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;oleConn.Open();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;OleDbDataReader&amp;nbsp;oleReader&amp;nbsp;=&amp;nbsp;oleCmd.ExecuteReader();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;while&lt;/span&gt;(oleReader.Read())&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="COLOR: #848284"&gt;"Name:&amp;nbsp;0}\tPhoneNum:&amp;nbsp;1}\tAddress:&amp;nbsp;2}"&lt;/span&gt;,oleReader.GetString(0),oleReader.GetString(1),oleReader.GetString(2));&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;showSplit();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;oleReader.Close();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;oleConn.Close();&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*演示存储过程的输出参数&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;outParamShow()&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlCommand&amp;nbsp;cmd;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;=&amp;nbsp;conn.CreateCommand();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd.CommandText&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"GetInfo"&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd.CommandType&amp;nbsp;=&amp;nbsp;CommandType.StoredProcedure;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlParameter&amp;nbsp;param&amp;nbsp;=&amp;nbsp;cmd.Parameters.Add(&lt;span style="COLOR: #848284"&gt;"@Fid"&lt;/span&gt;,16);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;param&amp;nbsp;=&amp;nbsp;cmd.Parameters.Add(&lt;span style="COLOR: #848284"&gt;"@Fname"&lt;/span&gt;,SqlDbType.VarChar,8);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;param.Direction&amp;nbsp;=&amp;nbsp;ParameterDirection.Output;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;param&amp;nbsp;=&amp;nbsp;cmd.Parameters.Add(&lt;span style="COLOR: #848284"&gt;"@Fphone"&lt;/span&gt;,SqlDbType.VarChar,8);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;param.Direction&amp;nbsp;=&amp;nbsp;ParameterDirection.Output;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;conn.Open();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd.ExecuteNonQuery();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;Fname&amp;nbsp;=&amp;nbsp;cmd.Parameters[&lt;span style="COLOR: #848284"&gt;"@Fname"&lt;/span&gt;].value.ToString();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;Fphone&amp;nbsp;=&amp;nbsp;cmd.Parameters[&lt;span style="COLOR: #848284"&gt;"@Fphone"&lt;/span&gt;].value.ToString();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;Console.WriteLine(Fname&amp;nbsp;+&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"&amp;nbsp;&amp;nbsp;"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;Fphone);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;conn.Close();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;showSplit();&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*演示读取多个无关记录集&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;multiResult()&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlCommand&amp;nbsp;cmd;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;=&amp;nbsp;conn.CreateCommand();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;sqla&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"select&amp;nbsp;Fname&amp;nbsp;from&amp;nbsp;friend"&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;sqlb&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"select&amp;nbsp;Fphone&amp;nbsp;from&amp;nbsp;friend"&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd.CommandText&amp;nbsp;=&amp;nbsp;sqla&amp;nbsp;+&amp;nbsp;&lt;span style="COLOR: #848284"&gt;";"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;sqlb;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;conn.Open();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlDataReader&amp;nbsp;reader=&amp;nbsp;cmd.ExecuteReader();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;1;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;do&lt;/span&gt;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="COLOR: #848284"&gt;"第"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;i.ToString()&amp;nbsp;+&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"个记录集内容如下：\n"&lt;/span&gt;);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;while&lt;/span&gt;(reader.Read())&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(reader[0].ToString()&amp;nbsp;+&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"\t"&lt;/span&gt;);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;i++;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&lt;span style="COLOR: #0000ff"&gt;while&lt;/span&gt;(reader.NextResult());&amp;nbsp;&lt;span style="COLOR: #008200"&gt;//NextResult()移动到下一个记录集&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&amp;nbsp;&amp;nbsp;reader.Close();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;conn.Close();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;showSplit();&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*使用DataReader获得数据库模式信息&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;getSchema()&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlCommand&amp;nbsp;cmd;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;cmd&amp;nbsp;=&amp;nbsp;conn.CreateCommand();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;sql&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"select&amp;nbsp;Fid,Fname,Fphone&amp;nbsp;from&amp;nbsp;friend"&lt;/span&gt;;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;cmd.CommandText&amp;nbsp;=&amp;nbsp;sql;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.Open();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SqlDataReader&amp;nbsp;reader&amp;nbsp;=&amp;nbsp;cmd.ExecuteReader();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataTable&amp;nbsp;SchemaTable&amp;nbsp;=&amp;nbsp;reader.GetSchemaTable();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataRowCollection&amp;nbsp;SchemaColumns&amp;nbsp;=&amp;nbsp;SchemaTable.Rows;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DataColumnCollection&amp;nbsp;SchemaProps&amp;nbsp;=&amp;nbsp;SchemaTable.Columns;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;foreach&lt;/span&gt;(DataRow&amp;nbsp;SchemaColumn&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;SchemaColumns)&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;foreach&lt;/span&gt;(DataColumn&amp;nbsp;SchemaColumnProp&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;in&lt;/span&gt;&amp;nbsp;SchemaProps)&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Console.WriteLine(SchemaColumnProp.ColumnName&amp;nbsp;+&amp;nbsp;&lt;span style="COLOR: #848284"&gt;"="&lt;/span&gt;&amp;nbsp;+&amp;nbsp;SchemaColumn[SchemaColumnProp.ColumnName].ToString());&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;reader.Close();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;conn.Close();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;showSplit();&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*从数据库读取二进制数据的代码段&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*该代码段只是读取二进制的片断，不是&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*整个程序，所以不能执行，你可以把它&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//*集成到你的WinForm项目里面。&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//**************************************&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;getBinary()&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;span style="COLOR: #008200"&gt;/*&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;System.IO.MemoryStream&amp;nbsp;stream&amp;nbsp;=&amp;nbsp;new&amp;nbsp;System.IO.MemoryStream();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;System.IO.BinaryWriter&amp;nbsp;writer&amp;nbsp;=&amp;nbsp;new&amp;nbsp;System.IO.BinaryWriter(stream);&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;int&amp;nbsp;BufferSize&amp;nbsp;=&amp;nbsp;1024;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;byte[]&amp;nbsp;Buffer&amp;nbsp;=&amp;nbsp;new&amp;nbsp;Byte[BufferSize];&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;long&amp;nbsp;Offset&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;long&amp;nbsp;BytesRead&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;do&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;BytesRead&amp;nbsp;=&amp;nbsp;reader.GetBytes(2,Offset,Buffer,0,BufferSize);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Writer(Buffer,0,(int)BytesRead);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;writer.Flush();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;Offset&amp;nbsp;+=&amp;nbsp;BytesRead;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;while(BytesRead&amp;nbsp;==&amp;nbsp;BufferSize);&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;*/&lt;/span&gt;&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #008200"&gt;//添加输出分隔&amp;nbsp;&lt;br&gt;
&lt;/span&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;showSplit()&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;Console.WriteLine(&lt;span style="COLOR: #848284"&gt;"\n********************************************************************\n"&lt;/span&gt;);&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
&lt;br&gt;
&lt;span style="COLOR: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;Main(&lt;span style="COLOR: #0000ff"&gt;string&lt;/span&gt;&amp;nbsp;[]&amp;nbsp;args)&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;SqlReader&amp;nbsp;sqlreader&amp;nbsp;=&amp;nbsp;&lt;span style="COLOR: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;SqlReader();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;sqlreader.basicReader();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;sqlreader.hasParamReader();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;sqlreader.hasOledbParamReader();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;sqlreader.outParamShow();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;sqlreader.multiResult();&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;
&amp;nbsp;&amp;nbsp;sqlreader.getSchema();&amp;nbsp;&lt;br&gt;
}&amp;nbsp;&lt;br&gt;
}&lt;/span&gt;
&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,92b78c16-80b7-43a2-8538-7db63ce17f07.aspx</comments>
      <category>CSharp</category>
      <category>DATABASE</category>
    </item>
    <item>
      <trackback:ping>http://www.qihangnet.com/Trackback.aspx?guid=ebd45d91-194a-4995-860d-4315a490d04f</trackback:ping>
      <pingback:server>http://www.qihangnet.com/pingback.aspx</pingback:server>
      <pingback:target>http://www.qihangnet.com/PermaLink,guid,ebd45d91-194a-4995-860d-4315a490d04f.aspx</pingback:target>
      <dc:creator>衣明志</dc:creator>
      <wfw:comment>http://www.qihangnet.com/CommentView,guid,ebd45d91-194a-4995-860d-4315a490d04f.aspx</wfw:comment>
      <wfw:commentRss>http://www.qihangnet.com/SyndicationService.asmx/GetEntryCommentsRss?guid=ebd45d91-194a-4995-860d-4315a490d04f</wfw:commentRss>
      <title>一个多表关联写入的存储过程</title>
      <guid isPermaLink="false">http://www.qihangnet.com/PermaLink,guid,ebd45d91-194a-4995-860d-4315a490d04f.aspx</guid>
      <link>http://www.qihangnet.com/PermaLink,guid,ebd45d91-194a-4995-860d-4315a490d04f.aspx</link>
      <pubDate>Wed, 23 Mar 2005 08:34:11 GMT</pubDate>
      <description>近日被一个问题给疑惑：如何向一个数据库表内插入一个数据，然后获得插入后的产生的主键值，并将该值和其他参数写入另一个表，因为一直使用mysql, access等不含存储过程的数据库，所以百死不得其解，终于从日本朋友那里得到了使用存储过程实现解决办法，其实看看也挺简单的。 都怪自己学艺不精。 &lt;br&gt;
&lt;a name="more"&gt;&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;程序代码：&lt;/b&gt; 
&lt;br /&gt;
CREATE procedure develop.insert_base_grid(@b_i int, @e_c int,@p_c varchar(192),@g_cint,@g_n
int) 
&lt;br /&gt;
as 
&lt;br /&gt;
-- 変数宣言 
&lt;br /&gt;
&lt;br /&gt;
DECLARE @parent INT -- 親レコードのID 保存 
&lt;br /&gt;
DECLARE @error INT -- エラー値 保存 
&lt;br /&gt;
-- トランザクション開始 
&lt;br /&gt;
BEGIN TRANSACTION 
&lt;br /&gt;
-- 親レコードの挿入 
&lt;br /&gt;
&lt;br /&gt;
INSERT INTO develop.syuko_base ( bills_id, employee_cd, prmss_comments,prmss_update,
prmss_registdate ) 
&lt;br /&gt;
SELECT @b_i AS チラシID, @e_c AS 出稿MDCD, @p_c AS コメント, getDate()AS 更新日, getDate() AS
登録日; 
&lt;br /&gt;
SET @error = @@ERROR 
&lt;br /&gt;&lt;&gt; 0 GOTO EXIST_ERR &lt;br/&gt;
IF @ERROR -- 親レコードのID の値を保存 
&lt;br /&gt;
SET @parent = SCOPE_IDENTITY() 
&lt;br /&gt;
&lt;br /&gt;
-- 子レコードの挿入 
&lt;br /&gt;
INSERT INTO develop.gridinfo ( prmss_id, grid_cd, grid_num) 
&lt;br /&gt;
SELECT @parent AS 出稿CD, @g_c AS グリッドCD, @g_n AS グリッド数; 
&lt;br /&gt;
SET @error = @@ERROR 
&lt;br /&gt;&lt;&gt; 0 GOTO EXIST_ERR &lt;br/&gt;
IF @ERROR 
&lt;br /&gt;
-- トランザクションのコミット 
&lt;br /&gt;
COMMIT TRANSACTION 
&lt;br /&gt;
GOTO EXIST 
&lt;br /&gt;
&lt;br /&gt;
-- エラー処理 
&lt;br /&gt;
EXIST_ERR: 
&lt;br /&gt;
ROLLBACK TRANSACTION 
&lt;br /&gt;
PRINT @error 
&lt;br /&gt;
GOTO EXIST 
&lt;br /&gt;
&lt;br /&gt;
-- 終了処理 
&lt;br /&gt;
EXIST: 
&lt;br /&gt;
GO&lt;br /&gt;
&lt;hr /&gt;
This weblog is sponsored by &lt;a href="http://www.qihangnet.com"&gt;Qihangnet&lt;/a&gt;. </description>
      <comments>http://www.qihangnet.com/CommentView,guid,ebd45d91-194a-4995-860d-4315a490d04f.aspx</comments>
      <category>DATABASE</category>
    </item>
  </channel>
</rss>