自己写的一种很爽的用参数访问数据库的方法,避免了字符串拼接sql,拿出来晒晒......

bwangel 2008-04-03 11:17:06
库函数代码可能很长,但调用起来非常简单。
举例

执行更新:
sql = "UPDATE T_Reply SET ReplyText=?, SideCode=?, UserID=? WHERE ID=?"
Ps = Array(ReplyText,SideCode,UserID,CaseID)
Call ExecNonQuery(sql, Ps)


执行查询:
dim id,userid
id = ...
userid = ...

set rs = ExecRs("SELECT * FROM T_Advice WHERE ID=? AND UserID=?", Array(id, UserID))

do while not rs.eof
...
rs.movenext
loop

....
rs.close
set rs=nothing

个人认为最大的好处是避免了字符串拼接,从而有效防止了sql注入。再也不用过滤来过滤去了。
其次是调用简洁,再也不用写一大串什么的 set什么 conn.open什么的了。

ExecRs()函数返回的记录集是那种只进的记录集。虽然功能没有那种可以update的记录集多,但速度快,资源少。至于分页,用另外专门的函数(在我另外一个贴子里),速度也比传统分页快得多。

以下是被调用的库(sql 2000, 使用nchar和nvarchar):

Dim Conn ,rs, sql,i
Sub OpenConn()
if IsObject(Conn) then exit sub
Dim ConnStr
ConnStr = "Provider = Sqloledb; User ID =XXXX; Password =XXXX; Initial Catalog =XXXX; Data Source=." '填上自己的数据库信息
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.open ConnStr
End Sub

Sub CloseConn()
If IsObject(Conn) Then
Conn.Close
Set Conn = Nothing
End If
End Sub

'the Content below added by wang 2008-3-13
'准备参数
private function parpareCmd(sql,ps)
OpenConn
dim p, cmd, rs , pnum
set cmd = Server.CreateObject("Adodb.Command")
cmd.CommandText = sql
cmd.ActiveConnection = Conn
pnum = ParamNum(sql)

'检查参数个数是否小于必需数目。
'CreateParameter([Name] , [type] , [Direction] , [Size] , [Value] )
if (not isnull(ps)) then
if (ubound(ps)+1) < pnum then
Response.write "参数个数应该是 " & pnum & ". 但实际只传递了" & (ubound(ps)+1)
Response.end
end if
for i = 0 to pnum-1
set p = cmd.CreateParameter( , 130, ,chkLength(Ps(i)), Ps(i))
'response.write "P" & I & "=" & Ps(i) & "L:" &chkLength(Ps(i)) & "<br />"
cmd.Parameters.Append p
next
end if
set parpareCmd = cmd
end function

'通过sql中'?'号的个数得知参数个数
function ParamNum(sql)
ParamNum = 0
for i=1 to LEN(sql)
if mid(sql,i,1)="?" then ParamNum = ParamNum + 1
next
end function

'执行更新查询
function ExecNonQuery(sql,ps)
dim cmd,rs
set cmd = parpareCmd(sql,ps)
set rs = cmd.Execute
set cmd=nothing
set rs=nothing
end function

'返回单个整数,如果为空则当作0处理
function ExecInt(sql, ps)
dim cmd,rs
set cmd = parpareCmd(sql,ps)
set rs = cmd.Execute
ExecInt=TurnInt(Rs(0))
set rs=nothing
set cmd=nothing
end function

'返回单个字符串,如果为空则当作空串处理
function ExecStr(sql, ps)
dim cmd,rs
set cmd = parpareCmd(sql,ps)
set rs = cmd.Execute
if isnull(Rs(0)) then
ExecStr = ""
else
ExecStr=CStr(Rs(0))
end if
set rs=nothing
set cmd=nothing
end function

'返回一个记录集
function ExecRs(sql, ps)
dim cmd,rs
set cmd = parpareCmd(sql,ps)
set rs = cmd.Execute()
set ExecRs=rs
set cmd=nothing
end function

function chkLength(s)
if isnull(s) then
chkLength = 2
else
chkLength = max(2,len(s))
end if
end function

'数字转换,将null值视为0处理
function TurnInt(c)
if isnull(c) or c="" or not IsNumeric(c) then
TurnInt=0
else
TurnInt=CLng(c)
end if
end function

...全文
481 点赞 收藏 54
写回复
54 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
fangpeng2003 2008-04-09
mark
分就不要了^_^
回复
xiaojing7 2008-04-09
mark
回复
mataofq 2008-04-09
code is everything !
回复
ice241018 2008-04-09
up
回复
net86 2008-04-09
学习加接分
回复
pgdoryoku 2008-04-09
学习~
回复
BoyHaXin 2008-04-09
you fen yiu jie
回复
liaoliming 2008-04-08
[Quote=引用 30 楼 cesar200 的回复:]
慢慢看!!!!
[/Quote]
回复
wolfgang_l 2008-04-08
顶楼主
回复
ymle1228 2008-04-08
接分
回复
bj20082005 2008-04-08
mark
回复
lsf5921 2008-04-08
我来学习
回复
arorn 2008-04-08
学习一下!顺便接着分
回复
sniper1534 2008-04-08
jf
回复
JlinShu 2008-04-08
学习
回复
liyong888_8 2008-04-08
学习
jf
回复
bcc1o 2008-04-08
复制下来先
回复
lb3376 2008-04-05
不错!
顶一下,接分。
回复
winner2050 2008-04-05
还是asp.net NB
回复
xwwlgs 2008-04-05
路过~~
回复
加载更多回复
相关推荐
发帖
ASP
创建于2007-09-28

2.8w+

社区成员

ASP即Active Server Pages,是Microsoft公司开发的服务器端脚本环境。
申请成为版主
帖子事件
创建了帖子
2008-04-03 11:17
社区公告
暂无公告