[asp] 通用数据库层_存储过程系列_操作方法
作者:cmscn 日期:2008-12-27
考虑到多数人用ASP入门"编程"..偶还是把这些函数_过程发一下.
--------------之所以说是函数库..因为偶把
class dbClass
'// 我把中间的方法函数 过程Sub 直接拿出来.. 也就不是个"类"(累) 了。
ASP整类是真的是有点累 .除了多 Set db = new dbClass 麻烦一下外 不知道效果到底是否很高?
End Class
不多说。 如果面向对象很习惯用类了。。 OK 你把代码中的 Class dbClass 和 End Class 前注释去掉,.
在写ASP偶还是习惯Call 来调用。。 函数主体代码就不贴了, 虽说谈不上很高级,封装之类.. 但应该能为写ASP的家伙门省一点点事情. 不习惯用CMS的同志适合。
以下是dbClass函数库『可以直接调用完成功能』的Public方法列表:
Public Function Open(ByVal ConStr) '//参数:ConStr数据库连接字符串,返回成功打开连接对象
Public Sub SetConn(ByVal oCon) '//设置Open方法返回的连接对象为当前可以用对象..
Public Function SelectSql(ByVal SqlString,ByVal N,ByVal M) '//执行sql语句返回rs记录集 N,M为游标
Public Sub SelectText(oRs,ByVal SqlString,ByVal N,ByVal M) '//过程形式,都个参数 是返回的 记录集对象名称
Public Sub CloseConn() '//关闭数据库连接
Public Sub ShowErr(ByVal Str) '//打印信息 并且停止运行程序
Public Sub Close(ByVal orss) '//关闭记录集对象 参数为要关闭的记录集名称
Public Function ExeSql(ByVal SqlString) '//执行非查询sql语句"Insert Update Delete",执行成功返回True,否则返回False
Public Function LookTable(ByVal TableName)'//查询数据库某表是否存在 参数为要查询的数据表名,存在则返回True,否则返回False
Public Function DataTrans(ByVal sqlArray) '//执行多条数据库,实现数据库事务处理
Public Function SelectLine(ByVal Cols,ByVal WhereStr,ByVal TableName)'//查询某表某字段值,返回该字段值
Public Function Insert(ByVal ArrAddList,ByVal TableName) '// 插入方法,哈希表
Public Function Update(ByVal ArrAddList,ByVal WhereStr,ByVal TableName)'//跟上面方法差不多多了个条件参数
Public Function Delete(ByVal KeyID,ByVal Key,ByVal TableName) '//删除一条或多条数据
Public Function GetTables(ByVal isCount)'//获得当前库,参数为1返回表的个数(数值型),非1或空返回表名:table|table(字符型)
Public Function GetRows(ByVal table,ByVal where) '//获得某表符合某条件的记录总数 返回(数值型)
Public Function ExeProcedureArray(cmd,ByVal procedureName,ByVal parameterArray) '//执行有参数存储过程
Public Function ExeProcedure(cmd,ByVal procedureName) '//执行无参数存储过程
Public Function GetPreID(ByVal ID,ByVal KeyCols,ByVal TableName) '//返回当前ID的上一条记录
Public Function GetNextID(ByVal ID,ByVal KeyCols,ByVal TableName) '//返回当前ID的下一条记录
Public Function SaveXML(ByVal sql,ByVal filePath,ByVal rootName)'// 根据sql语句生成XML
<%
'/******************************
'类库:dbClass
'库名称:数据库操作
'日期:2007-6-8
'作者:敏哥
'描述:数据库的各种操作
'最后修改:2008-3-8
'******************************/
'------------------------------------------------------------------------------
' Public Function Open(ByVal ConStr) '//参数:ConStr数据库连接字符串,返回成功打开连接对象
' Public Sub SetConn(ByVal oCon) '//设置Open方法返回的连接对象为当前可以用对象..
' Public Function SelectSql(ByVal SqlString,ByVal N,ByVal M) '//执行sql语句返回rs记录集 N,M为游标
' Public Sub SelectText(oRs,ByVal SqlString,ByVal N,ByVal M) '//过程形式,都个参数 是返回的 记录集对象名称
'实例:[同时操作三个数据库]' Set acess = Open(ConStr_acess) '//Acess数据库连接字符串
' Set mssql = Open(ConStr_mssql) '//MSSQL数据库连接字符串
' Set mysql = Open(ConStr_mysql) '//MySql数据库连接字符串
' Call SetConn(mysql) '//当前操作 MySql 数据库 切记:这里不是字符串 是对象类型
'Set rs = SelectSql("Select UserName FROM [Book] Where ID=1001",1,3)'//1,3是游标,可读写 请参考游标说明
'Call SelectText(rs,"Select UserName FROM [Book] Where ID=1001",1,3)'//同样功能
' if Not rs.eof Then '// 上面返回rs记录集 就可以写操作代码了..
'把上面 Call SetConn(这里换成"acess"或者 "mssql") 可以达到随时切换数据库
'如果只有一个数据库 可以简化写成 Call SetConn(Open("数据库连接字符串"))
'SelectSql方法函数 和 SelectText过程 下面有介绍
'------------------------------------------------------------------------------
' Public Sub CloseConn() '//关闭数据库连接
' Public Sub ShowErr(ByVal Str) '//打印信息 并且停止运行程序
' Public Sub Close(ByVal orss) '//关闭记录集对象 参数为要关闭的记录集名称
' Public Function ExeSql(ByVal SqlString) '//执行非查询sql语句"Insert Update Delete",执行成功返回True,否则返回False
' Public Function LookTable(ByVal TableName) '//查询数据库某表是否存在 参数为要查询的数据表名,存在则返回True,否则返回False
'------------------------------------------------------------------------------
' Public Function DataTrans(ByVal sqlArray) '//执行多条数据库,实现数据库事务处理
' 实例 [修改三个表的数据,只要其中一条sql语句执行不成功就返回False,否则返回True]
' Dim arr(2) '申明数组大小为3
' arr(0)="Update [table] Set UserName='ZhongMin'"
' arr(1)="Delete FROM [Table] Where ID=1001"
' arr(2)="insert into Table(UserName) Values('ZhongMin')"
' if DataTrans(arr) then Response.Write("执行成功")
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Public Function SelectLine(ByVal Cols,ByVal WhereStr,ByVal TableName)'//查询某表某字段值,返回该字段值
' 实例 [查询Admin表中 Sex字段]
' Dim re:re=SelectLine("Sex","Where ID=1001","Admin") '//返回值类型跟数据库字段类型一致
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Public Function Insert(ByVal ArrAddList,ByVal TableName) '// 插入方法,哈希表
' 示例: [往admin插入一条数据]
' Dim ArrayList(2) '//申明数据列表 数组
' ArrayList(0)="Sex=男" '//Sex为数据表中的列名,如果值"男"是变量那就在后面直接 &Sex变量
' ArrayList(1)="Name="&myName '//变量赋值 没有类型区分
' ArrayList(2)="Time="&Now() '//日期型直接赋值
' Dim re:re=Insert(ArrayList,"Admin") '// 数据列表,表名 成功返回True,否则返回:False
' if re=True Then Response.Write("添加成功")
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Public Function Update(ByVal ArrAddList,ByVal WhereStr,ByVal TableName)'//跟上面方法差不多多了个条件参数
'// 示例: [修改admin一条数据]
'// Dim ArrayList(1) '//申明数据列表 数组
' ArrayList(0)="Name="&myName '//变量赋值 没有类型区分
' ArrayList(1)="Time="&Now() '//日期型直接赋值
' Dim re:re=Update(ArrayList,"Where ID=1001","Admin") '// 数据列表,条件where,表名 成功返回True,否则返回:False
' if re=True Then Response.Write("修改成功")
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Public Function Delete(ByVal KeyID,ByVal Key,ByVal TableName) '//删除一条或多条数据
'// 示例: [修改admin一条数据]
'// Dim ID:ID=Request("ID") '//删除的记录ID号,可以是多条例如: 1,2,3
'// Dim re:re=Delete(ID,"以数据表字段ID查询主键","Admin")
' if re=True Then Response.Write("删除成功")
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Public Function GetTables(ByVal isCount)'//获得当前库,参数为1返回表的个数(数值型),非1或空返回表名:table|table(字符型)
'// 示例 [获得当前数据库的表名]
'// Response.Write GetTables(1) '//输出: 3
'// Response.Write GetTables(0) '//输出: "admin|User|Book"
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Public Function GetRows(ByVal table,ByVal where) '//获得某表符合某条件的记录总数 返回(数值型)
' Response.Write GetRows("Admin","Where ID=1001") 输出: 1
' Response.Write GetRows("Admin","") 输出: 5 '//条件参数为空查询所有 表里有5条数据
'------------------------------------------------------------------------------
' Public Function ExeProcedureArray(cmd,ByVal procedureName,ByVal parameterArray) '//执行有参数存储过程
' Public Function ExeProcedure(cmd,ByVal procedureName) '//执行无参数存储过程
' 上面的 cmd 参数下面会用到,名称根据传入保持一致.
'------------------------------------------------------------------------------
' 示例: [执行有参数存储过程 "Pro_Page"]
' 下面会给出此万能分页存储过程代码的,存储过程为网上提供.
'// 存储过程[Pro_Page] 参数解释如下:
'// 参数:tableName :表名
'// 参数:strFields :返回列
'// 参数:fldName :排序字段
'// 参数:pSize :页值
'// 参数:pIndex :当前页
'// 参数:doCount :非0返回统计数
'// 参数:OrderType :非0则升序排序
'// 参数:strWhere :条件语句 免写where字符
'// 参数: rsCount :记录集总数
'// 到这里得还介绍个方法函数 CreateParameter
' 原型: Function CreateParameter(ByVal ParName,ByVal ParType,ByVal returnType,ByVal ParLen,ByVal ParValue)
' 解释参数:CreateParameter(参数名称,参数类型,返回类型,参数数组长度,参数值)
'// ASP可以使用如下代码:
' Dim rss(7) '//申明参数列表 数组
' rss(0)=CreateParameter("@tblName",200,1,500,tableName)
' rss(1)=CreateParameter("@strGetFields",200,1,1000,strFields)
' rss(2)=CreateParameter("@fldName",200,1,255,fldName)
' rss(3)=CreateParameter("@PageSize",3,1,500,pSize)
' rss(4)=CreateParameter("@PageIndex",3,1,500,pIndex)
' rss(5)=CreateParameter("@doCount",3,1,500,doCount)
' rss(6)=CreateParameter("@OrderType",3,1,500,OrderType)
' rss(7)=CreateParameter("@strWhere",200,1,1500,strWhere)
'// 有人可能对其中的 200,500,1,3 看不懂 这里可以搜索 存储过程参数类型 可以找到介绍
' Set rs = ExeProcedureArray(cmd,"Pro_Page",rss) '//调用方法 执行Pro_Page有参存储过程 返回记录集
' 如果定义了存储过程定义了输出参数 那就可以用 Response.Write cmd("输出参数名")
'// 无参数存储过程就好介绍了
' Set rs = ExeProcedureArray(cmd,"pp_Page") '//调用方法 执行pp_Page无参存储过程 返回记录集
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Public Function GetPreID(ByVal ID,ByVal KeyCols,ByVal TableName) '//返回当前ID的上一条记录
' Public Function GetNextID(ByVal ID,ByVal KeyCols,ByVal TableName) '//返回当前ID的下一条记录
'示例: [当前ID=3,查询上一条记录 和 下一条记录]
'// Dim ID:ID=Request("ID")
' Response.Write GetProID(ID,"ID","Admin") '//输出:4
' Response.Write GetNextID(ID,"ID","Admin") '//输出:2
'------------------------------------------------------------------------------
'------------------------------------------------------------------------------
' Public Function SaveXML(ByVal sql,ByVal filePath,ByVal rootName)'// 根据sql语句生成XML
'// 示例: [生成查询admin表的xml数据,xml文件名为当前目录adminXmlFile.xml,xml文件根节点为 adminRoot ]
'// Dim re:re=SaveXML("Select ID,Name,Sex FROM [Admin]",Server.MapPath("adminXmlFile.xml"),"adminRoot")
'// if re then Response.Write("生成成功!!")
'// 生成的XML数据预览
'<?xml version="1.0" encoding="gb2312" ?>
'<adminRoot>
' <Admin>
' <ID>1001</ID>
' <Name>ZhongMin</Name>
' <Sex>男</Sex>
' </Admin>
'</adminRoot>
结合_存储过程进一步扩展代码
Asp:
'// 参数解释如下:
'// 参数:tableName :表名
'// 参数:strFields :返回列
'// 参数:fldName :排序字段
'// 参数:pSize :页值
'// 参数:pIndex :当前页
'// 参数:doCount :非0返回统计数
'// 参数:OrderType :非0则升序排序
'// 参数:strWhere :条件语句 免写where字符
'// 参数: rsCount :记录集总数
'// 得到查询记录总数 :Function GetTableCount(tableName,strWhere)
'// 得到查询记录集 :Function GetTabRows(tableName,strFields,fldName,pSize,pIndex,OrderType,strWhere)
示例: 用存储过程查询 admin 表 type 字段为 'zhongmin' 的值 并且分页
Dim rsPageSize:rsPageSize=20 '//每页显示记录数
Dim w:w="type='zhongmin'" '//查询条件
Dim rsCount:rsCount=GetTableCount("Admin",w) '// 查询到记录总数
Set rs =GetTabRows("Admin","ID,Name,Sex","ID",rsPageSize,1,1,w)
if not rs.eof then
Do while not rs.eof
'// 循环体
rs.MoveNext
Else
Response.write("没有记录")
End if
Call ShowPage(rsPageSize,rsCount) '// 分页
Call Close(rs)
asp 代码文件:
点击下载此文件
sql 存储过程代码:
复制内容到剪贴板代码:
Create PROCEDURE Pro_Page
@tblName varchar(500), -- 表名
@strGetFields varchar(1000) = '', -- 需要返回的列
@fldName varchar(255)='', -- 排序的字段名
@PageSize int = 10, -- 页尺寸
@PageIndex int = 1, -- 页码
@doCount bit = 0, -- 返回记录总数, 非 0 值则返回
@OrderType bit = 0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) = '' -- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(5000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount != 0
begin
if @strWhere !=''
set @strSQL = 'select count(*) as Total from ' + @tblName + ' where '+@strWhere
else
set @strSQL = 'select count(*) as Total from ' + @tblName + ''
end
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况:
else
begin
if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by [' + @fldName +'] desc'
--如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by [' + @fldName +'] asc'
end
if @PageIndex = 1
begin
if @strWhere != ''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '
from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder
else
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ '
from '+ @tblName + ' '+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin
--以下代码赋予了@strSQL以真正执行的SQL代码
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where [' + @fldName + ']' + @strTmp + '(['+ @fldName + '])
from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + ']
from ' + @tblName + '' + @strOrder + ') as tblTmp)'+ @strOrder
if @strWhere != ''''
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from '
+ @tblName + ' where [' + @fldName + ']' + @strTmp + '(['
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
+ @fldName + '] from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
end
exec (@strSQL)
GO
附上 ASP 操作 xml 的详细代码:
http://bbs.blueidea.com/thread-2901174-1-5.html
评论: 0 | 引用: 0 | 查看次数: 692
发表评论