如何利用 vc ado 连接 Sql Server2005 实现分页存储过程
/*----------------------------------------------
*procedure name : prcPageResult
* author : FuChun
* create date : 2006-10-04
*/
CREATE PROCEDURE prcPageResult
-- 获得某一页的数据 --
@currPage int = 1, --当前页页码 (即Top currPage)
@showColumn varchar(2000) = '*', --需要得到的字段 (即 column1,column2,......)
@tabName varchar(2000), --需要查看的表名 (即 from table_name)
@strCondition varchar(2000) = '', --查询条件 (即 where condition......) 不用加where关键字
@ascColumn varchar(100) = '', --排序的字段名 (即 order by column asc/desc)
@bitOrderType bit = 0, --排序的类型 (0为升序,1为降序)
@pkColumn varchar(50) = '', --主键名称
@pageSize int = 20 --分页大小
AS
BEGIN -- 存储过程开始
-- 该存储过程需要用到的几个变量 --
DECLARE @strTemp varchar(1000)
DECLARE @strSql varchar(4000) --该存储过程最后执行的语句
DECLARE @strOrderType varchar(1000) --排序类型语句 (order by column asc或者order by column desc)
BEGIN
IF @bitOrderType = 1 -- bitOrderType=1即执行降序
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' DESC'
SET @strTemp = '<(SELECT min'
END
ELSE
BEGIN
SET @strOrderType = ' ORDER BY '+@ascColumn+' ASC'
SET @strTemp = '>(SELECT max'
END
IF @currPage = 1 -- 如果是第一页
BEGIN
IF @strCondition != ''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@strCondition+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+@strOrderType
END
ELSE -- 其他页
BEGIN
IF @strCondition !=''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@strCondition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+
' '+@pkColumn+' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@showColumn+' FROM '+@tabName+
' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currPage-1)*@pageSize)+' '+@pkColumn+
' FROM '+@tabName+@strOrderType+') AS TabTemp)'+@strOrderType
END
END
EXEC (@strSql)
END -- 存储过程结束
------------------------------------------------
GO
给对应的值,然后执行
go
create proc Fenye
@pageindex int, --用户要查询的页码
@pagesize int, --每页几条
@pagecount int output, --一共查询了多少页
@recordcount int output --一共有多少条数据
as
begin
--把用户要的数据查询出来
--先把数据查询到临时表里面
select ID,Name,Sex into #linshibiao from Users
--再从临时表中进行分页查询
select * from
(select *,rn=ROW_NUMBER() over(order by ID asc) from Users) as t
where t.rn between (@pageindex-1)*@pagesize+1 and @pageindex*@pagesize
--2.设置 @pagecount @recordcount 的值
--计算总的记录条数
set @recordcount=(select COUNT(*) from #linshibiao);
--计算所有的页数
set @pagecount=CEILING(@recordcount*0.1/@pagesize)
end
执行分页存储过程
go
declare
@pagecount int,
@recordcount int
exec Fenye 1,2,3,5;
DROP PROCEDURE dbo.Proc_Util_Page
GO
/*
分页
调用方法:EXEC Proc_Util_Page 'country,city', 'table', ' where 1=1', ' order by mid asc', 'mid', 1, 1, 0, ''
输入:
1.字段(不可为空)
2.表名(不可为空)
3.条件(可以为空,需要where)
4.排序(可以为空,需要order by,需要asc和desc字符)
5.主键(可以为空)
6.当前页数
7.每页记录数
8.输出总记录条数(若<1则执行count)
9.输出sql语句
返回:记录集
*/
CREATE PROCEDURE dbo.Proc_Util_Page
(
@sField nvarchar(1000),
@sTable nvarchar(1000),
@sWhere nvarchar(1000),
@sOrderby nvarchar(1000),
@sPkey nvarchar(50),
@iPageIndex int,
@iPageSize int,
@iRecordCount int OUTPUT,
@sOutsql nvarchar(4000) OUTPUT
)
--WITH ENCRYPTION
AS
BEGIN
SET NOCOUNT ON
DECLARE @iRC int, @sSQL nvarchar(4000), @sW nvarchar(1000), @sOB nvarchar(1000), @sT nvarchar(100)
SELECT @iRC = @iRecordCount, @sSQL = '', @sW = ' WHERE 1=1 ', @sOB = ''
--判断条件
IF RTRIM(@sWhere) != '' AND @sWhere IS NOT NULL
BEGIN
SET @sW=' ' + @sWhere + ' '
END
--判断总记录数
IF @iRC<1
BEGIN
SET @sSQL='SELECT @iRC=Count(*) FROM ' + @sTable + @sW
EXEC sp_executesql @sSQL,N'@iRC int OUT',@iRC OUT
END
--判断页数是否超出范围
SELECT @iPageIndex=(CASE WHEN @iRC<(@iPageIndex-1)*@iPageSize THEN CEILING(@iRC/@iPageSize) WHEN @iPageIndex<1 THEN 1 ELSE @iPageIndex END)
--判断排序
IF RTRIM(@sOrderby) != '' AND @sOrderby IS NOT NULL
BEGIN
SELECT @sOB=' ' + @sOrderby + ' '
END
--如果是第一页
IF @iPageIndex=1
BEGIN
SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sW+@sOB
GOTO step4
END
--看有否主键
IF RTRIM(@sPkey) = '' OR @sPkey IS NULL
GOTO step1
ELSE
--看是否按主键排序
BEGIN
DECLARE @sOB1 nvarchar(1000), @sPkey1 nvarchar(50)
SELECT @sOB1 = UPPER(@sOrderby), @sPkey1 = UPPER(@sPkey)
IF CHARINDEX(@sPkey1 + ' ASC', @sOB1)>0
BEGIN
SET @sT='>(SELECT MAX('
GOTO step2
END
IF CHARINDEX(@sPkey1 + ' DESC', @sOB1)>0
BEGIN
SET @sT='<(SELECT MIN('
GOTO step2
END
GOTO step3
END
--如果无主键
step1:
BEGIN
SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sW + ' AND EXISTS (SELECT TOP '+CAST((@iPageIndex-1)*@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sW+@sOB+')'+@sOB+')'
GOTO step4
END
--纯按主键排序
step2:
BEGIN
SET @sSQL='SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sField+' FROM '+@sTable+@sW+' AND '+@sPkey+@sT+@sPkey+') FROM (SELECT TOP '+CAST((@iPageIndex-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sW+@sOB+') AS tbTemp)'+@sOB
GOTO step4
END
--不纯按主键排序
step3:
BEGIN
SET @sSQL='SELECT '+@sField+' FROM '+@sTable+@sW + ' AND ' + @sPkey+' IN (SELECT TOP '+CAST(@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sW + ' AND ' + @sPkey+' NOT IN(SELECT TOP '+CAST((@iPageIndex-1)*@iPageSize AS nvarchar)+' '+@sPkey+' FROM '+@sTable+@sW+@sOB+')'+@sOB+')'+@sOB
GOTO step4
END
--输出最终执行的分页sql语句并执行
step4:
SELECT @sOutsql = @sSQL, @iRecordCount = @iRC
--print(@sSQL)
EXEC(@sSQL)
SET NOCOUNT OFF
END
GO
---调用分页存储过程
declare @iRecordCount int,
@sOutsql nvarchar(4000)
EXEC Proc_Util_Page '字段,字段,字段,字段,字段', '表名', ' where 1=1', ' order by id asc', 'id', 1, 10, @iRecordCount output, @sOutsql output
弋崔盆炎: 如果你会编程,这是很简单就可以实现的. 但是懂编程的人,一般情愿写sql语句. 实现这个的原理,就是用软件连接数据库,自己根据条件拼成sq查询l语句,然后呈现在页面上. 好多语言都可以实现.比如VC 就可以用ado实现.
双柏县19595715300: VC ADO的ConnectionString怎么填写啊应该,谢谢 - ?
弋崔盆炎: 这是SQL的 ConnectionString=“data souse=.(表示本地可以是IP本地Ip为127.0.0.1); database=要链接的数据库名称;UID=sa(sq用户名);PWD=密码”
双柏县19595715300: 急..哪位高手,能详细的给我讲一下vc连接数据库的步骤...着急用,,谢谢. - ?
弋崔盆炎: VC++ ADO操作数据库方法步骤 大致步骤:1, 引入ADO库定义文件,初始化COM环境2, 初始化connection指针,连接数据库并打开3, 利用已经建立好的连接,通过connection,command或者recorder对象操作数据库,对数据进行查询,处...
双柏县19595715300: 请问c#如何连接sq server2005l数据库实现登录功能? - ?
弋崔盆炎: 下面的代码就是个简单的例子...是使用C# 查数据的基本操作..user是需要验证的用户名..pass 是需要验证的密码. string user = ""; string pass = ""; using (SqlConnection conn = new SqlConnection()) { ...
双柏县19595715300: 如何使用vc 6.0通过 ADO连接SQL SERVER 2008Express拜托各位了 3Q - ?
弋崔盆炎: void CCysrvDlg::IniteDB() { Readconfig(&m_dbaddr,&m_dbname,&m_struid,&m_dbpwd,&m_strport); CString strconnect; strconnect.Format("driver={SQL Server};Server=%s;DATABASE=%s;UID=%s;PWD=%s",m_dbaddr,m_dbname,m_struid...
双柏县19595715300: VC用ADO访问Access怎样向空白表中添加数据 - ?
弋崔盆炎: vSQL="INSERT INTO 表名字 (字段1, 字段2) VALUES ('“ + A + ”','“ + B +”')"; //A,B是字符串 vSQL="INSERT INTO 表名字 (字段1, 字段2) VALUES (“ + A + ”,“ + B +”)"; //A,B是数字 //
双柏县19595715300: 在vc6.0中实现使用ADO连接SQL server数据库的源代码 - ?
弋崔盆炎: #import "msado15.dll" no_namespace replace("EOF","adoEOF") _ConnectionPtr m_Connection; _RecordsetPtr m_Recordset; 两个智能指针随便用
双柏县19595715300: 怎样用vc++ 6.0访问SQL Server数据库 - ?
弋崔盆炎: 这个不是一句两句可以说清楚的 给你语句还有其他工作要做 比如用ADO连接数据源前的准备工作 1)在头文件中引入相应的库文件(一般放在StdAfx.h中). …… #import "c:\...
双柏县19595715300: vc数据库dao使用 - ?
弋崔盆炎: 现在都不怎么用dao了,ado比较方便,下面是我以前在网上找的例子:一、ADO简介 ADO(ActiveX Data Object)是Microsoft数据库应用程序开发的新接口,是建立在OLE DB之上的高层数据库访问技术,请不必为此担心,即使你对OLE DB,...
双柏县19595715300: vc++调用dll - ?
弋崔盆炎: 1,隐式连接.将制作好的.dll.lib.h三个文件COPY到你要用的工程下,然后在工程中加入#pragma comment(lib,"somedll.lib") somedll.lib 其中somedll是你要调用的库的名字..然后直接调用你的funa就可以了2.显式连接 typedef int (* lpFuna)(int,int); ...