﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Frank Hawker-随笔分类-工作札记</title><link>http://www.blogjava.net/fhawk/category/1520.html</link><description>当程序员的大头鹰</description><language>zh-cn</language><lastBuildDate>Thu, 01 Mar 2007 14:15:11 GMT</lastBuildDate><pubDate>Thu, 01 Mar 2007 14:15:11 GMT</pubDate><ttl>60</ttl><item><title>FireFox的三种定制方式</title><link>http://www.blogjava.net/fhawk/archive/2006/03/14/35213.html</link><dc:creator>大头鹰</dc:creator><author>大头鹰</author><pubDate>Tue, 14 Mar 2006 05:00:00 GMT</pubDate><guid>http://www.blogjava.net/fhawk/archive/2006/03/14/35213.html</guid><wfw:comment>http://www.blogjava.net/fhawk/comments/35213.html</wfw:comment><comments>http://www.blogjava.net/fhawk/archive/2006/03/14/35213.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhawk/comments/commentRss/35213.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhawk/services/trackbacks/35213.html</trackback:ping><description><![CDATA[前几天在和同事讨论关于软件定制方式时，<A href="http://www.blogjava.com/briansun">泡泡</A>讲了FireFox的三种定制方式，我觉得对于软件设计，这三种定制方式具有非常大的可借鉴性。下面首先讲一下这三种定制方式：<BR>1、针对于普通用户(最一般的广大用户)，默认为最普遍的使用方式。一些个性化的需求可用“选项”的可视化配置方式。这些配置方式用户在入门以后就可以根据自己的需要很轻松地无障碍地定制。<BR>2、针对于高级用户。对界面进行简单地修改高级玩家肯定不满足于此。因此这些用户可以根据自己的需求，利用FireFox自身提供的机制，编写插件，主题等等，进一步满足个性化需求。<BR>3、针对于职业用户。当要进行大规模应用时，比如快速部署什么的，FireFox提供了一种完全脚本化的东东，你可以任意修改FireFox的配置，甚至是源代码来满足这方面的需求。<BR>对于需求而言，用同样的一个产品来满足所有用户的需求是一件非常困难的事情。不同的用户群有不同的使用方式。比如说，对于输入法，这种个性化非常强的东西不管做得多好，肯定还会有一部分人感到不满意。这其中确如有一千个人，就有一千个哈姆雷特一样。一千个用户使用同样的一款软件，可能就会有一千种不同的用法和要求。所以分清用户群，理清其主要需求，以确认采用什么样的机制来实现系统。在设计系统架构中就着手这方面的事，肯定会取得事半功倍的效果。<img src ="http://www.blogjava.net/fhawk/aggbug/35213.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhawk/" target="_blank">大头鹰</a> 2006-03-14 13:00 <a href="http://www.blogjava.net/fhawk/archive/2006/03/14/35213.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数字签名在OA中的一个应用</title><link>http://www.blogjava.net/fhawk/archive/2005/08/25/11000.html</link><dc:creator>大头鹰</dc:creator><author>大头鹰</author><pubDate>Thu, 25 Aug 2005 03:30:00 GMT</pubDate><guid>http://www.blogjava.net/fhawk/archive/2005/08/25/11000.html</guid><wfw:comment>http://www.blogjava.net/fhawk/comments/11000.html</wfw:comment><comments>http://www.blogjava.net/fhawk/archive/2005/08/25/11000.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/fhawk/comments/commentRss/11000.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhawk/services/trackbacks/11000.html</trackback:ping><description><![CDATA[随着国家电子签名法的颁布与实施，数字签名技术得到越来越来越广泛的应用。在OA应用中，如果使用得当，可以有效地提高系统的安全性。下面将简要描述OA系统中Word插件的应用，并结合数字签名技术，讲解如何提高系统的安全性。<BR><BR>在OA系统中利用VBA，使用Word外部插件(Addin)的技术，能够大大增强公文的表现力。但因为Word插件必须将Word下载至本地，然后才能进行编辑。而且Word是一个开放的系统，有很多种方法修改其编辑的内容，因此会显著地减弱它的安全性。在一个正式的办公环境中，如何记录公文的修改痕迹，防止恶意篡改，是一项非常重要的工作。因为Word本身不提供限制功能的技术，所以用户将公文的正文下载至本地后，无法防止客户做其想要的修改。如果提高其安全性，只能是在用户提交的数据作验证，只有作出合法修改的文档才能正确提交。未能正确提交的数据是非法数据，将不能放到系统中。<BR><BR>在Word应用中，记录一个人的修改痕迹通常是按照用户名来区分的。要修改某个人的修改痕迹，只要通过修改用户名就可以了。因此当一篇文档提交时，只有保证存在着的用户，并且这些用户是不可伪造的，这些修改痕迹才真正有意义。如果只用一个用户名，显然是不行的，因为用户可以简单地通过修改名称，就可以伪造他人的修改痕迹，而且，对这样的文档，系统不好作最后的校验。因此这里必须加入数字签名信息，通过数字签名，不管是合法用户还是非法用户都无法伪造数据。也就是所有的信息都有要通过最后数字签名信息的验证才能提交到服务，通不过，则视为非法数据。<BR><BR>实际使用中，在服务器端生产实际使用的数字签名信息，并将这些签名信息加入Word文档的保留字段中。因此用户在下载并编辑这些文档时，就已经包含这些信息。用户在修改这些文档时可以时而不时地进行校验，当用户试图伪造非法信息时，将给予严重的警告并退出。<img src ="http://www.blogjava.net/fhawk/aggbug/11000.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhawk/" target="_blank">大头鹰</a> 2005-08-25 11:30 <a href="http://www.blogjava.net/fhawk/archive/2005/08/25/11000.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于OA产品一些思考</title><link>http://www.blogjava.net/fhawk/archive/2005/07/19/7994.html</link><dc:creator>大头鹰</dc:creator><author>大头鹰</author><pubDate>Tue, 19 Jul 2005 07:50:00 GMT</pubDate><guid>http://www.blogjava.net/fhawk/archive/2005/07/19/7994.html</guid><wfw:comment>http://www.blogjava.net/fhawk/comments/7994.html</wfw:comment><comments>http://www.blogjava.net/fhawk/archive/2005/07/19/7994.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhawk/comments/commentRss/7994.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhawk/services/trackbacks/7994.html</trackback:ping><description><![CDATA[<P>今天看了一些OA的产品，发现经过这些年的发展，WebOA产品基本上已经趋于同质化。目前市场上这些产品的亮点不多，至少没有让人耳目一新的感觉。我想对于目前的OA产品未来的发展，可能还会在以下这几个方面中得到体现：<BR>1、在功能方面，WAP的OA正在兴起，这得益于手机的功能越来越强大，色彩越来越丰富。如果在这上头能研发出有一种全新体验的话，那么在接下来的几年内，这将会是OA市场一个新的增加点。<BR>2、OA系统与其它业务系统的集成。对于一个企业的OA，在目前这种状况下，并不是重点。也就是说，除非是一家非常大的企业，否则，ERP才是目前国内绝大部分企业考虑的重点，这才是这些企业的生命线。而OA只不过是一种锦上添花的东东而已。因此OA只有在能很多地与ERP系统进行集成与整合，并提高整个企业的效率，减少运营成本的前提下，才能为OA带来更为广阔的发展空间。<BR>3、功能强大的搜索引擎是OA的未来一项非常重要的功能，而且也是必不可少的功能。OA产品的使用已经相当长的一段时间了，因此产生了大量的信息。如何根据不同人的不同权限，通过功能强大的搜索引擎，使之能在大量的信息中快速准确地得到想要的信息，将是一项革命性的功能。</P><img src ="http://www.blogjava.net/fhawk/aggbug/7994.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhawk/" target="_blank">大头鹰</a> 2005-07-19 15:50 <a href="http://www.blogjava.net/fhawk/archive/2005/07/19/7994.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VC中多语编程的一些要点</title><link>http://www.blogjava.net/fhawk/archive/2005/05/25/5142.html</link><dc:creator>大头鹰</dc:creator><author>大头鹰</author><pubDate>Wed, 25 May 2005 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/fhawk/archive/2005/05/25/5142.html</guid><wfw:comment>http://www.blogjava.net/fhawk/comments/5142.html</wfw:comment><comments>http://www.blogjava.net/fhawk/archive/2005/05/25/5142.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhawk/comments/commentRss/5142.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhawk/services/trackbacks/5142.html</trackback:ping><description><![CDATA[一个程序或控件，如果想要有更大的市场，国际化是一种必然的趋势。要使软件国际化，其编码必须支持多语，否则有可能在你的程序中，仅在某个版本的操作系统底下好用，而在另外的操作系统中却是乱码。VC对多语的支持相对于VB来说还是简单了很多，其自身提供了支持多语的机制。在实际工作中，在VC中进行多语化编译，我总结出以下一些要点：<BR>1、首先应该预编译指令中定义UNICODE或_UNICODE，使用了这个预编译指令，在使用WindowsAPI时，系统就会自动使用W版的API函数及结构<BR>2、声明字符串必须用TCHAR，而不能用char<BR>3、对于字符串操作的相关函数处理，如strcpy用wcscpy的代替等等<BR>4、所有的字符串值，必须加上宏_T()<BR>5、如果在程序中使用了STL，必须使用必须使用其w版的函数及类型，比如string就得用wstring来代替，在我的程序中，使用了如下预编译指令：<BR>#ifdef _UNICODE<BR>#define tstring&nbsp; wstring<BR>#else<BR>#define tstring&nbsp; string<BR>#endif<BR>这样在程序中用tstring来声明字符串。所有与string相关的函数都必须作这这样的处理。比如stringstream、ostream等等。<BR>关于编码的问题请参考下面文章：<BR><A href="http://dev.csdn.net/develop/article/72/72002.shtm">http://dev.csdn.net/develop/article/72/72002.shtm</A><img src ="http://www.blogjava.net/fhawk/aggbug/5142.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhawk/" target="_blank">大头鹰</a> 2005-05-25 09:44 <a href="http://www.blogjava.net/fhawk/archive/2005/05/25/5142.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库优化技巧：not in及in语句的连接替代方案</title><link>http://www.blogjava.net/fhawk/archive/2005/05/17/4392.html</link><dc:creator>大头鹰</dc:creator><author>大头鹰</author><pubDate>Tue, 17 May 2005 01:04:00 GMT</pubDate><guid>http://www.blogjava.net/fhawk/archive/2005/05/17/4392.html</guid><wfw:comment>http://www.blogjava.net/fhawk/comments/4392.html</wfw:comment><comments>http://www.blogjava.net/fhawk/archive/2005/05/17/4392.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhawk/comments/commentRss/4392.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhawk/services/trackbacks/4392.html</trackback:ping><description><![CDATA[在编写SQL语句时，如果要实现一张表有而另一张表没有的数据库时，通常第一直觉的写法就是：<BR>select * from table1 where table1.id not in (select id from table2)，这种方法虽然很直观，但是in及not in的写法经常会影响其执行的效率，对于大数据量时，这个原因经常是性能的瓶颈。在SQL Server中，可以通过左连接的方法来解决，其替代写法如下：<BR>select a.* from table1 a left join table2 b on a.id=b.id where b.id is null<BR>同理，这个方法也适用于in的情况。<img src ="http://www.blogjava.net/fhawk/aggbug/4392.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhawk/" target="_blank">大头鹰</a> 2005-05-17 09:04 <a href="http://www.blogjava.net/fhawk/archive/2005/05/17/4392.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>数据库的分页存储过程</title><link>http://www.blogjava.net/fhawk/archive/2005/05/10/4126.html</link><dc:creator>大头鹰</dc:creator><author>大头鹰</author><pubDate>Tue, 10 May 2005 01:13:00 GMT</pubDate><guid>http://www.blogjava.net/fhawk/archive/2005/05/10/4126.html</guid><wfw:comment>http://www.blogjava.net/fhawk/comments/4126.html</wfw:comment><comments>http://www.blogjava.net/fhawk/archive/2005/05/10/4126.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/fhawk/comments/commentRss/4126.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/fhawk/services/trackbacks/4126.html</trackback:ping><description><![CDATA[<P>数据库分页是一种非常有用，而且非常通用的技术，下面收集整理一些通用的存储过程：<BR>1、CSDN社区邹建写的一个通用存储过程<BR>if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_show]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)<BR>drop procedure [dbo].[p_show]<BR>GO</P>
<P>/*--实现分页的通用存储过程</P>
<P>&nbsp;显示指定表、视图、查询结果的第X页<BR>&nbsp;对于表中主键或标识列的情况,直接从原表取数查询，其它情况使用临时表的方法<BR>&nbsp;如果视图或查询结果中有主键,不推荐此方法<BR>&nbsp;如果使用查询语句,而且查询语句使用了order by,则查询语句必须包含top 语句</P>
<P>--邹建 2003.09--*/</P>
<P>/*--调用示例<BR>&nbsp;exec p_show '地区资料'</P>
<P>&nbsp;exec p_show 'select top 100 percent * from 地区资料 order by 地区名称',5,3,'地区编号,地区名称,助记码'<BR>--*/<BR>CREATE Proc p_show<BR>@QueryStr nvarchar(4000),&nbsp;--表名、视图名、查询语句<BR>@PageSize int=10,&nbsp;&nbsp;&nbsp;--每页的大小(行数)<BR>@PageCurrent int=1,&nbsp;&nbsp;&nbsp;--要显示的页<BR>@FdShow nvarchar (4000)='',&nbsp;--要显示的字段列表,如果查询结果不需要标识字段,需要指定此值,且不包含标识字段<BR>@FdOrder nvarchar (1000)=''&nbsp;--排序字段列表<BR>as<BR>set nocount on<BR>declare @FdName nvarchar(250)&nbsp;--表中的主键或表、临时表中的标识列名<BR>&nbsp;,@Id1 varchar(20),@Id2 varchar(20)&nbsp;--开始和结束的记录号<BR>&nbsp;,@Obj_ID int&nbsp;&nbsp;&nbsp;&nbsp;--对象ID<BR>--表中有复合主键的处理<BR>declare @strfd nvarchar(2000)&nbsp;--复合主键列表<BR>&nbsp;,@strjoin nvarchar(4000)&nbsp;--连接字段<BR>&nbsp;,@strwhere nvarchar(2000)&nbsp;--查询条件</P>
<P><BR>select @Obj_ID=object_id(@QueryStr)<BR>&nbsp;,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' <A href="mailto:'+@FdShow">'+@FdShow</A> end<BR>&nbsp;,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by <A href="mailto:'+@FdOrder">'+@FdOrder</A> end<BR>&nbsp;,@QueryStr=case when @Obj_ID is not null then ' <A href="mailto:'+@QueryStr">'+@QueryStr</A> else ' (<A href="mailto:'+@QueryStr+'">'+@QueryStr+'</A>) a' end</P>
<P>--如果显示第一页，可以直接用top来完成<BR>if @PageCurrent=1&nbsp;<BR>begin<BR>&nbsp;select @Id1=cast(@PageSize as varchar(20))<BR>&nbsp;exec('select top <A href="mailto:'+@Id1+@FdShow+'">'+@Id1+@FdShow+'</A> from <A href="mailto:'+@QueryStr+@FdOrder">'+@QueryStr+@FdOrder</A>)<BR>&nbsp;return<BR>end</P>
<P>--如果是表,则检查表中是否有标识更或主键<BR>if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1<BR>begin<BR>&nbsp;select @Id1=cast(@PageSize as varchar(20))<BR>&nbsp;&nbsp;,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))</P>
<P>&nbsp;select @FdName=name from syscolumns where <A href="mailto:id=@Obj_ID">id=@Obj_ID</A> and status=0x80<BR>&nbsp;if @@rowcount=0&nbsp;&nbsp;&nbsp;--如果表中无标识列,则检查表中是否有主键<BR>&nbsp;begin<BR>&nbsp;&nbsp;if not exists(select 1 from sysobjects where <A href="mailto:parent_obj=@Obj_ID">parent_obj=@Obj_ID</A> and xtype='PK')<BR>&nbsp;&nbsp;&nbsp;goto lbusetemp&nbsp;&nbsp;--如果表中无主键,则用临时表处理</P>
<P>&nbsp;&nbsp;select @FdName=name from syscolumns where <A href="mailto:id=@Obj_ID">id=@Obj_ID</A> and colid in(<BR>&nbsp;&nbsp;&nbsp;select colid from sysindexkeys where @Obj_ID=id and indid in(<BR>&nbsp;&nbsp;&nbsp;&nbsp;select indid from sysindexes where @Obj_ID=id and name in(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select name from sysobjects where xtype='PK' and <A href="mailto:parent_obj=@Obj_ID">parent_obj=@Obj_ID</A><BR>&nbsp;&nbsp;&nbsp;)))<BR>&nbsp;&nbsp;if @@rowcount&gt;1&nbsp;&nbsp;--检查表中的主键是否为复合主键<BR>&nbsp;&nbsp;begin<BR>&nbsp;&nbsp;&nbsp;select @strfd='',@strjoin='',@strwhere=''<BR>&nbsp;&nbsp;&nbsp;select @strfd=@strfd+',['+name+']'<BR>&nbsp;&nbsp;&nbsp;&nbsp;,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'<BR>&nbsp;&nbsp;&nbsp;&nbsp;,@strwhere=@strwhere+' and b.['+name+'] is null'<BR>&nbsp;&nbsp;&nbsp;&nbsp;from syscolumns where <A href="mailto:id=@Obj_ID">id=@Obj_ID</A> and colid in(<BR>&nbsp;&nbsp;&nbsp;&nbsp;select colid from sysindexkeys where @Obj_ID=id and indid in(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select indid from sysindexes where @Obj_ID=id and name in(<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select name from sysobjects where xtype='PK' and <A href="mailto:parent_obj=@Obj_ID">parent_obj=@Obj_ID</A><BR>&nbsp;&nbsp;&nbsp;&nbsp;)))<BR>&nbsp;&nbsp;&nbsp;select @strfd=substring(@strfd,2,2000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;,@strjoin=substring(@strjoin,5,4000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;,@strwhere=substring(@strwhere,5,4000)<BR>&nbsp;&nbsp;&nbsp;goto lbusepk<BR>&nbsp;&nbsp;end<BR>&nbsp;end<BR>end<BR>else<BR>&nbsp;goto lbusetemp</P>
<P>/*--使用标识列或主键为单一字段的处理方法--*/<BR>lbuseidentity:&nbsp;<BR>&nbsp;exec('select top <A href="mailto:'+@Id1+@FdShow+'">'+@Id1+@FdShow+'</A> from <A href="mailto:'+@QueryStr">'+@QueryStr</A><BR>&nbsp;&nbsp;+' where <A href="mailto:'+@FdName+'">'+@FdName+'</A> not in(select top '<BR>&nbsp;&nbsp;<A href="mailto:+@Id2+'">+@Id2+'</A> <A href="mailto:'+@FdName+'">'+@FdName+'</A> from <A href="mailto:'+@QueryStr+@FdOrder">'+@QueryStr+@FdOrder</A><BR>&nbsp;&nbsp;+')'+@FdOrder<BR>&nbsp;&nbsp;)<BR>&nbsp;return</P>
<P>/*--表中有复合主键的处理方法--*/<BR>lbusepk:&nbsp;&nbsp;<BR>&nbsp;exec('select <A href="mailto:'+@FdShow+'">'+@FdShow+'</A> from(select top <A href="mailto:'+@Id1+'">'+@Id1+'</A> a.* from<BR>&nbsp;&nbsp;(select top 100 percent * from <A href="mailto:'+@QueryStr+@FdOrder+'">'+@QueryStr+@FdOrder+'</A>) a<BR>&nbsp;&nbsp;left join (select top <A href="mailto:'+@Id2+'">'+@Id2+'</A> <A href="mailto:'+@strfd+'">'+@strfd+'</A> <BR>&nbsp;&nbsp;from <A href="mailto:'+@QueryStr+@FdOrder+'">'+@QueryStr+@FdOrder+'</A>) b on <A href="mailto:'+@strjoin+'">'+@strjoin+'</A><BR>&nbsp;&nbsp;where <A href="mailto:'+@strwhere+'">'+@strwhere+'</A>) a'<BR>&nbsp;&nbsp;)<BR>&nbsp;return</P>
<P>/*--用临时表处理的方法--*/<BR>lbusetemp:&nbsp;&nbsp;<BR>select @FdName='[ID_'+cast(newid() as varchar(40))+']'<BR>&nbsp;,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))<BR>&nbsp;,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))</P>
<P>exec('select <A href="mailto:'+@FdName+'=identity(int,0,1),'+@FdShow+'">'+@FdName+'=identity(int,0,1),'+@FdShow+'</A><BR>&nbsp;&nbsp;into #tb <A href="mailto:from'+@QueryStr+@FdOrder+'">from'+@QueryStr+@FdOrder+'</A><BR>&nbsp;select <A href="mailto:'+@FdShow+'">'+@FdShow+'</A> from #tb where <A href="mailto:'+@FdName+'">'+@FdName+'</A> between '<BR>&nbsp;<A href="mailto:+@Id1+'">+@Id1+'</A> and <A href="mailto:'+@Id2">'+@Id2</A><BR>&nbsp;)</P>
<P>GO<BR><BR>2、当有排序ID（唯一）时，可以用如下存储过程：<BR>CREATE PROCEDURE SPPagediv<BR>@tblName&nbsp;&nbsp; varchar(3000),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 表名<BR>@strGetFields varchar(3000) = '*',&nbsp; -- 需要返回的列<BR>@fldName varchar(255)='',&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 排序的字段名<BR>@PageSize&nbsp;&nbsp; int = 10,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 页尺寸<BR>@PageIndex&nbsp; int = 1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 页码<BR>@doCount&nbsp; bit = 0,&nbsp;&nbsp; -- 返回记录总数, 非 0 值则返回<BR>@OrderType bit = 0,&nbsp; -- 设置排序类型, 非 0 值则降序<BR>@strWhere&nbsp; varchar(1500) = ''&nbsp; -- 查询条件 (注意: 不要加 where)</P>
<P>AS</P>
<P>declare @strSQL&nbsp;&nbsp; varchar(5000)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 主语句</P>
<P>declare @strTmp&nbsp;&nbsp; varchar(110)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 临时变量</P>
<P>declare @strOrder varchar(400)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 排序类型</P>
<P><BR>&nbsp;begin<BR>&nbsp;&nbsp;replace(@strGetFields,'''','''''')<BR>&nbsp;end<BR>&nbsp;</P>
<P>if @doCount != 0<BR>&nbsp; begin<BR>&nbsp;&nbsp;&nbsp; if @strWhere !=''<BR>&nbsp;&nbsp;&nbsp; &nbsp;set @strSQL = 'select count(*) as Total from [' + @tblName + '] where ' + @strWhere<BR>&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;set @strSQL = 'select count(*) as Total from [' + @tblName + ']'<BR>&nbsp; end<BR>--以上代码的意思是如果@doCount传递过来的不是0，就执行总数统计。以下的所有代码都是@doCount为0的情况</P>
<P>else</P>
<P>begin</P>
<P>&nbsp;</P>
<P>if @OrderType != 0</P>
<P>begin</P>
<P>&nbsp;&nbsp;&nbsp; set @strTmp = '&lt;(select min'</P>
<P>set @strOrder = ' order by [' + @fldName +'] desc'</P>
<P>--如果@OrderType不是0，就执行降序，这句很重要！</P>
<P>end</P>
<P>else</P>
<P>begin</P>
<P>&nbsp;&nbsp;&nbsp; set @strTmp = '&gt;(select max'</P>
<P>&nbsp;&nbsp;&nbsp; set @strOrder = ' order by [' + @fldName +'] asc'</P>
<P>end</P>
<P>&nbsp;</P>
<P>if @PageIndex = 1</P>
<P>begin</P>
<P>&nbsp;&nbsp;&nbsp; if @strWhere != ''&nbsp; </P>
<P>&nbsp;&nbsp;&nbsp; set @strSQL = 'select top ' + str(@PageSize) +' <A href="mailto:'+@strGetFields">'+@strGetFields</A>+ '&nbsp; from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; else</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp; set @strSQL = 'select top ' + str(@PageSize) +' <A href="mailto:'+@strGetFields">'+@strGetFields</A>+ '&nbsp; from ['+ @tblName + '] '+ @strOrder</P>
<P>--如果是第一页就执行以上代码，这样会加快执行速度</P>
<P>end</P>
<P>else</P>
<P>begin</P>
<P>--以下代码赋予了@strSQL以真正执行的SQL代码</P>
<P>set @strSQL = 'select top ' + str(@PageSize) +' <A href="mailto:'+@strGetFields">'+@strGetFields</A>+ '&nbsp; from '</P>
<P>&nbsp;&nbsp;&nbsp; + @tblName + ' where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from ' + @tblName + ' ' + @strOrder + ') as tblTmp)'+ @strOrder</P>
<P>&nbsp;</P>
<P>if @strWhere != ''</P>
<P>&nbsp;&nbsp;&nbsp; set @strSQL = 'select top ' + str(@PageSize) +' <A href="mailto:'+@strGetFields">'+@strGetFields</A>+ '&nbsp; from '</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + @tblName + ' where [' + @fldName + ']' + @strTmp + '(['</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + @fldName + '] from ' + @tblName + ' where ' + @strWhere + ' '</P>
<P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder</P>
<P>end</P>
<P>end&nbsp; </P>
<P>exec (@strSQL)</P>
<P>GO<BR><BR>这个存储过程如下文章中获得：<BR><A href="http://soft.zol.com.cn/2005/0117/144785.shtml">http://soft.zol.com.cn/2005/0117/144785.shtml</A></P><img src ="http://www.blogjava.net/fhawk/aggbug/4126.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/fhawk/" target="_blank">大头鹰</a> 2005-05-10 09:13 <a href="http://www.blogjava.net/fhawk/archive/2005/05/10/4126.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>