您的位置:首页 > 编程语言

存储过程分页代码

2004-07-20 11:26 302 查看
CREATE Proc p_show
@QueryStr nvarchar(4000), --表名、视图名、查询语句
@PageSize int=10,?? --每页的大小(行数)
@PageCurrent int=1,?? --要显示的页
@FdShow nvarchar (4000)='', --要显示的字段列表,如果查询结果有标识字段,需要指定此值,且不包含标识字段
@FdOrder nvarchar (1000)='' --排序字段列表
as
declare @FdName nvarchar(250) --表中的主键或表、临时表中的标识列名
?,@Id1 varchar(20),@Id2 varchar(20) --开始和结束的记录号
?,@Obj_ID int??? --对象ID
--表中有复合主键的处理
declare @strfd nvarchar(2000) --复合主键列表
?,@strjoin nvarchar(4000) --连接字段
?,@strwhere nvarchar(2000) --查询条件

select @Obj_ID=object_id(@QueryStr)
?,@FdShow=case isnull(@FdShow,'') when '' then ' *' else ' '+@FdShow end
?,@FdOrder=case isnull(@FdOrder,'') when '' then '' else ' order by '+@FdOrder end
?,@QueryStr=case when @Obj_ID is not null then ' '+@QueryStr else ' ('+@QueryStr+') a' end

--如果显示第一页,可以直接用top来完成
if @PageCurrent=1
begin
?select @Id1=cast(@PageSize as varchar(20))
?exec('select top '+@Id1+@FdShow+' from '+@QueryStr+@FdOrder)
?return
end

--如果是表,则检查表中是否有标识更或主键
if @Obj_ID is not null and objectproperty(@Obj_ID,'IsTable')=1
begin
?select @Id1=cast(@PageSize as varchar(20))
? ,@Id2=cast((@PageCurrent-1)*@PageSize as varchar(20))

?select @FdName=name from syscolumns where id=@Obj_ID and status=0x80
?if @@rowcount=0?? --如果表中无标识列,则检查表中是否有主键
?begin
? if not exists(select 1 from sysobjects where parent_obj=@Obj_ID and xtype='PK')
?? goto lbusetemp? --如果表中无主键,则用临时表处理

? select @FdName=name from syscolumns where id=@Obj_ID and colid in(
?? select colid from sysindexkeys where @Obj_ID=id and indid in(
??? select indid from sysindexes where @Obj_ID=id and name in(
???? select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
?? )))
? if @@rowcount>1? --检查表中的主键是否为复合主键
? begin
?? select @strfd='',@strjoin='',@strwhere=''
?? select @strfd=@strfd+',['+name+']'
??? ,@strjoin=@strjoin+' and a.['+name+']=b.['+name+']'
??? ,@strwhere=@strwhere+' and b.['+name+'] is null'
??? from syscolumns where id=@Obj_ID and colid in(
??? select colid from sysindexkeys where @Obj_ID=id and indid in(
???? select indid from sysindexes where @Obj_ID=id and name in(
????? select name from sysobjects where xtype='PK' and parent_obj=@Obj_ID
??? )))
?? select @strfd=substring(@strfd,2,2000)
??? ,@strjoin=substring(@strjoin,5,4000)
??? ,@strwhere=substring(@strwhere,5,4000)
?? goto lbusepk
? end
?end
end
else
?goto lbusetemp

/*--使用标识列或主键为单一字段的处理方法--*/
lbuseidentity:
?exec('select top '+@Id1+@FdShow+' from '+@QueryStr
? +' where '+@FdName+' not in(select top '
? +@Id2+' '+@FdName+' from '+@QueryStr+@FdOrder
? +')'+@FdOrder
? )
?return

/*--表中有复合主键的处理方法--*/
lbusepk:?
?exec('select '+@FdShow+' from(select top '+@Id1+' a.* from
? (select top 100 percent * from '+@QueryStr+@FdOrder+') a
? left join (select top '+@Id2+' '+@strfd+'
? from '+@QueryStr+@FdOrder+') b on '+@strjoin+'
? where '+@strwhere+') a'
? )
?return

/*--用临时表处理的方法--*/
lbusetemp:?
select @FdName='[ID_'+cast(newid() as varchar(40))+']'
?,@Id1=cast(@PageSize*(@PageCurrent-1) as varchar(20))
?,@Id2=cast(@PageSize*@PageCurrent-1 as varchar(20))

exec('select '+@FdName+'=identity(int,0,1),'+@FdShow+'
? into #tb from'+@QueryStr+@FdOrder+'
?select '+@FdShow+' from #tb where '+@FdName+' between '
?+@Id1+' and '+@Id2
?)
GO

2.java
2.java
package net.db;
import java.sql.*;
import javax.sql.DataSource;
import javax.naming.*;

import javax.naming.InitialContext;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.sql.*;
?
public class DBPool {
? protected DataSource ds? = null;
? protected Context ic = null;
? protected? Connection conn = null;
? protected? Statement stmt = null;
? protected ResultSet rs=null;
? public DBPool() {
???? try{?
??ic = new InitialContext();
?????? ds =(DataSource)ic.lookup("java:comp/env/jdbc/TestDB");???
?????? conn? = ds.getConnection();
??? }
??? catch(javax.naming.NamingException e) {
????? System.err.println("DB_link(): " + e.getMessage());
??? }
??? catch(SQLException ex) {
????? System.err.println("sql.executeQuery: " + ex.getMessage());
??? }
? }
?
?? /**
?? * 执行Select语句
?? * @param sql? 查询语句
?? * @return java.sql.ResultSet? 返回结果集
?? * @throws java.sql.SQLException
?? */
? public ResultSet executeQuery(String sql) throws java.sql.SQLException
? {
??? try {
????? //conn = DriverManager.getConnection(strConn,userName,password);
????? //conn.setAutoCommit(true);
????? stmt = conn.createStatement();
????? rs = stmt.executeQuery(sql);
??? }catch(SQLException ex) {
??ex.printStackTrace();
????? throw new SQLException("LinkSQL.executeQuery err: '" + ex.getMessage() + "'.");
????? //System.err.println("执行SQL语句出错:" + ex.getMessage());
??? }
??? return rs;
? } // public ResultSet executeQuery

???? /**
??? **执行可分页的
??? */
? public ResultSet executeQuery3(String sql){
??try{
???//ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
???stmt=conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
??? rs=stmt.executeQuery(sql);
??}catch(java.sql.SQLException e2){
???System.out.println("errorQuery:"+e2.toString()+e2.getMessage());
??}
??return rs;
?}
? /**
? *执行存储过程的处理语句
? *@param sql
? *@return boolean 执行成功标志
? */
? public boolean execute(String sql){
?boolean flag=false;
??? try {
?????? stmt = conn.createStatement();
??? stmt.execute(sql);//提交存储过程的SQL语句
??? conn.commit();
?????? flag=true;
??? }
??? catch(SQLException ex) {
?????? //System.err.println(ex.getMessage());
??? }finally{
? // close();
??????? return flag;
?????
?}//end try
? }

? public void executeUpdate(String sql) throws Exception {
??? Statement stmt = null;
??? //rs=null;
??? try {
??? stmt= conn.createStatement();
??? stmt.executeUpdate(sql);
??? }
??? catch(SQLException ex) {
????? throw new Exception("sql.executeQuery: " + ex.getMessage());
??? }
??? finally
??? {
??? ?try{if (stmt!=null) stmt.close();} catch(Exception e){}
??? }
? }

? public void closeStmt(){
??? /*try{
????? stmt.close();
???? }
??? catch(SQLException e){
????? e.printStackTrace();
???? }*/
? }
? public void closeConn(){
/*
??? try{
????? conn.close();
???? }
??? catch(SQLException e){
????? e.printStackTrace();
???? }
???? */
???? close();
? }

? public void close()
? {?
??try{
???if(rs!=null) rs.close();
???if(conn!=null)
???{
????if(!conn.isClosed())
????{
?????if(stmt!=null) stmt.close();
?????conn.close();?
????}
?????
???}
??}catch(SQLException e){
????e.printStackTrace();
???//?throw e;
??}
??finally
??{
???rs=null;
???stmt=null;
???conn=null;?
??}
?}? //end public closeConn

}
?

???

?
学院名称:
??
系部名称:???????
[align=left]姓名:[/align]

?????
?

4.servelt.xml
在? 下加入以下内容:
??debug="5" reloadable="true" crossContext="true">

??

prefix="localhost_DBTest_log." suffix=".txt"
timestamp="true"/>

auth="Container"
type="javax.sql.DataSource"/>

factory
org.apache.commons.dbcp.BasicDataSourceFactory

maxActive
100

maxIdle
30

maxWait
10000

username
sa

password
sa

driverClassName
com.microsoft.jdbc.sqlserver.SQLServerDriver

url
jdbc:microsoft:sqlserver://localhost:1433;databasename=Northwind
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息