蛙蛙推荐:VBS的数据库操作类,这个类实现了平时主要的数据库操作,因为我们天天都在和数据库打交道,有时候用这样一个类也挺方便的,但是不知道实用性怎么样,因为在性能和错误处理方面没有做很多考虑,所以不知道它的通用性如何.
如果谁能再给这个类加上动态的错误处理的或者优化一下性能,就更完美了.PS:做这个类也是为了练习一下VBS类的使用.
<%
class classado
Private conn_c
Private rs_c
Public strconn
Private Sub Class_Initialize'定义类的初始化事件
Set conn_c=Server.CreateObject("ADODB.Connection")
End Sub
Private Sub Class_Terminate ' 设置 Terminate 事件。
rs_c.close
set rs_c=nothing
conn_c.close
set conn_c=nothing
End Sub
Public Function opendb() '打开数据库
if isempty(strconn) then
response.Write("<script>alert('没有设置数据库连接字符串');</script>")
response.end
end if
if conn_c.state=0 then
conn_c.open strconn
else
response.Write("<script>alert('数据库已经打开了');</script>")
response.end
end if
End Function
Public Function getrs(ByVal strsql) '获取记录集
if conn_c.state=0 then
opendb()
end if
Set rs_c=Server.CreateObject("ADODB.RecordSet")
rs_c.Open strsql,conn_c,1,1
Set getrs=rs_c
End Function
Public Function exesql(ByVal strsql) '执行一条sql语句,用来特定的插入,更新,删除记录
if conn_c.state=0 then
opendb()
end if
conn_c.execute(strsql)
End Function
Public Function insertrs(myform,mytable,nostr)
'此方法用来把表单提交的值插入到数据库
'如果数据库没有打开那么打开数据库
if conn_c.state=0 then
opendb()
end if
'构建查询字符串并打开记录集
set rs_add=server.CreateObject("adodb.recordset")
dim add_sql
add_sql="select * from "&mytable&""
rs_add.open add_sql,conn_c,1,3,1 'Options类型为adCmdText
rs_add.addnew
'循环form的值并给分别给记录集赋新值
for each x in myform
'保证获取的值不为空,并保证一些你指定表单元素不需要给记录集赋值,比如说提交按钮
'虽然你不需要把提交按钮传递给记录集,但它也随着表单一起给提交给服务器了,
'要想过滤到这些不需要的表单元素,请在这个方法的第三个参数(nostr)里指定
'参数的格式是构建一个把不需要提交的表单元素的名称用"|"隔开的字符串
'比如说这样"submit|myabc|wawa"
'我们这里用一个私有小函数(isno)来去除这些不需要向数据库提交的值
if isno(nostr,x) and request.form(x)<>"" then
'下面是一条测试语句,显示从表单提取元素的名称和值.
'response.write x+"="+request.form(x)+"<br>"
'判断记录集的类型,如果是数字类型(Integer,BigInt等)要把提取的值转换为数值类型
'在这里recordset.Field.type属性是用数字来表示的,具体对应关系,请查看你机器里面的adovbs.inc文件
'其中Integer对应这3,BigInt对应着20,我这里的判断或许不是很完美,除了3和20外还有其它的数值类型
'所以在表单提交前请务必做一些客户端的验证,保证在需要是数值类型数据的时候让用户能正确的输入并提交
'这样其实在服务器给记录集赋值时可以做到正确的隐式转换,不适于出现给Integer类型的记录集赋值一个不能转换为数字的字符串
'请时刻记住,从表单提取的数据始终只字符串类型
if (rs_add(x).type=20 or rs_add(x).type=3) then
rs_add(x)=clng(request.form(x))
else
rs_add(x)=request.form(x)
end if
end if
next
'更新记录集,随后关闭并清空它,
'记着在写程序的时候要尽量晚的打开对象,尽量早的关闭已经不使用的对象
rs_add.update
'response.write("添加成功")
rs_add.close
set rs_add=nothing
end function
Public Function updaters(myform,mysql,nostr)
'此方法用来把表单提交的值更新到数据库
if isempty(conn_c) then
opendb()
end if
'构建查询字符串并打开记录集
set rs_update=server.CreateObject("adodb.recordset")
rs_update.open mysql,conn_c,1,3,1 'Options类型为adCmdText
'注意这里不需要rs_update.addnew
'循环form的值并给分别给记录集赋新值
for each x in myform
if isno(nostr,x) and request.form(x)<>"" then
'response.write x+"="+request.form(x)+"<br>"
if (rs_update(x).type=20 or rs_update(x).type=3) then
rs_update(x)=clng(request.form(x))
else
rs_update(x)=request.form(x)
end if
end if
next
rs_update.update
'response.write("修改成功")
rs_update.close
set rs_update=nothing
end function
private function isno(s1,s2)
dim arr
arr=split(s1,"|")
isno=true
for each i in arr
if s2=i then isno=false
next
end function
end class
%>
举个例子来看看这个类怎么用
<!--#include file="ado_cls.asp" -->
<%
strconn="Driver={sql server};server=192.168.0.110;database=new;uid=sa;pwd=sa;"
set c=new classado
c.strconn=strconn
c.opendb()
select case trim(request.Form("active"))
case "New"
c.insertrs request.form,"qy_ml","submit4|sign|active"
response.write("<script>alert('添加成功');</script>")
case "edit"
dim editsql
editsql="select * from qy_ml where qy_ml_id="&request("id")&""
c.updaters request.form,editsql,"submit4|sign|active"
response.write("<script>alert('修改成功');</script>")
case ""
strsql="select * from qy_ml"
set r=c.getrs(strsql)
if not(r.bof and r.eof) then
arr_wawa=r.getrows()
end if
end select
%>
<table width="100%" border="1" cellspacing="1">
<% If not isempty(arr_wawa) Then %>
<% for i=0 to ubound(arr_wawa,2) %>
<tr>
<% for j=0 to ubound(arr_wawa,1) %>
<td><%= arr_wawa(j,i) %></td>
<% next %>
</tr>
<% next %>
<% Else %>
<tr>
<td>没有记录</td>
</tr>
<% End If %>
</table>