Asp.net 改进数据访问类
几年前,我们(作为一家公司)面临这样一种情况:让我们的开发人员停止编写经典的asp页面,转而使用.net(反过来使用system.data进行数据访问) 作为一种所谓的“短期”度量,我编写了以下类,以使那些不习惯system.data及其所有新对象的人更容易进行切换: 该类的主要目的是尽可能保持与经典asp的使用方式类似,并保持使用方式非常简单(此外,还可以添加电子邮件警报以捕获错误yada yada yada):Asp.net 改进数据访问类,asp.net,sql-server,vb.net,tsql,ado.net,Asp.net,Sql Server,Vb.net,Tsql,Ado.net,几年前,我们(作为一家公司)面临这样一种情况:让我们的开发人员停止编写经典的asp页面,转而使用.net(反过来使用system.data进行数据访问) 作为一种所谓的“短期”度量,我编写了以下类,以使那些不习惯system.data及其所有新对象的人更容易进行切换: 该类的主要目的是尽可能保持与经典asp的使用方式类似,并保持使用方式非常简单(此外,还可以添加电子邮件警报以捕获错误yada yada yada): 公共数据库作为新的SimpleDataAccess 公共RS作为新的数据表 C
公共数据库作为新的SimpleDataAccess
公共RS作为新的数据表
ConnectDatabase()
db.Execute_Query(RS,“从IntColumn=“&tools.parseint(EmployeeID,0)&”或TextColumn='”的任何位置选择*”&db,Escape(“bla'bla”)&“按IntColumn排序”)
对于每个DB_行作为RS.行中的DataRow
Write(DB_行(“IntColumn”))
下一个
CloseDatabase()
现在,这门课糟糕的两个主要原因是:
- Sql注入(parseint和quote-escaping)必须在类之外完成-容易忘记-这里绝对需要引入参数化查询李>
- CloseDatabase()必须在页面结束时手动调用-这通常会被忘记,并且与服务器的连接保持打开状态-即使在页面完成渲染等之后
- 该类的使用非常简单,可以很容易地将旧的经典asp代码转换为.net
- 查询和连接错误的电子邮件警报在类本身中进行了不可见的处理
- 它已经完美地工作了2年多了,没有问题
希望这有帮助 我一直使用来自(Asp经典MS应用程序示例)的函数。它非常简单,可以处理参数 用法示例:
set rs = RunSQLReturnRs("Select * from Usuario where UsuarioID = ?", _
array(mp("@UsuarioID", adInteger, 0, UsuarioID)))
If not rs.eof then
UsuarioName = rs("FullName")
end if
DbHelper.ASP完整代码(多年来略有修改)
0那么
BuildErrorMessage()
退出功能
如果结束
'断开记录集
Set cmd.ActiveConnection=Nothing
Set cmd=Nothing
设置rs.ActiveConnection=Nothing
'返回结果记录集
设置RunSPReturnRS=rs
端函数
函数RunSP(strSP,params())
出错时继续下一步
'创建ADO对象
Dim命令
Set cmd=server.createobject(“ADODB.Command”)
'初始化ADO对象&存储的过程参数
cmd.ActiveConnection=GetConnectionString()
cmd.CommandText=strSP
cmd.CommandType=adCmdStoredProc
cmd.CommandTimeout=900'15分钟
collectParams cmd,params
'执行查询而不返回记录集
cmd.Execute,adExecuteNoRecords
如果err.number>0,则
BuildErrorMessage()
退出功能
如果结束
'断开记录集并清理
Set cmd.ActiveConnection=Nothing
Set cmd=Nothing
退出功能
端函数
函数RunSQL(strSP,params())
出错时继续下一步
'创建ADO对象
Dim命令
Set cmd=server.createobject(“ADODB.Command”)
'初始化ADO对象&存储的过程参数
cmd.ActiveConnection=GetConnectionString()
cmd.CommandText=strSP
cmd.CommandType=adCmdText
cmd.CommandTimeout=900'15分钟
collectParams cmd,params
'执行查询而不返回记录集
cmd.Execute,adExecuteNoRecords
如果err.number>0,则
BuildErrorMessage()
退出功能
如果结束
"清理",
Set cmd.ActiveConnection=Nothing
Set cmd=Nothing
退出功能
端函数
函数RunSQLReturnRS(sqlstmt,params())
出错时继续下一步
'创建ADO对象
Dim rs,cmd
Set rs=server.createobject(“ADODB.Recordset”)
Set cmd=server.createobject(“ADODB.Command”)
'初始化ADO对象&存储的过程参数
cmd.ActiveConnection=GetConnectionString()
cmd.CommandText=sqlstmt
cmd.CommandType=adCmdText
cmd.CommandTimeout=900'15分钟
collectParams cmd,params
'执行只读的查询
rs.CursorLocation=adUseClient
rs.Open cmd、adOpenForwardOnly、adLockReadOnly
如果err.number>0,则
BuildErrorMessage()
退出功能
如果结束
'断开记录集
Set cmd.ActiveConnection=Nothing
Set cmd=Nothing
设置rs.ActiveConnection=Nothing
'返回结果记录集
设置RunSQLReturnRS=rs
端函数
函数RunSPReturnInteger(strSP,params())
出错时继续下一步
'创建ADO对象
Dim命令
Set cmd=server.createobject(“ADODB.Command”)
'初始化ADO对象&存储的过程参数
cmd.ActiveConnection=GetConnectionString()
cmd.CommandText=strSP
cmd.CommandType=adCmdStoredProc
cmd.CommandTimeout=900'15分钟
collectParams cmd,params
'假设最后一个参数是传出的
cmd.Parameters.Append cmd.CreateParameter(“@retval”,adInteger,adParamOutput,4)
'在没有结果记录集的情况下执行并拉出“return value”参数
cmd.Execute,adExecuteNoRecords
如果err.number>0,则
BuildErrorMessage()
退出功能
如果结束
RunSPReturnInteger=cmd.Parameters(“@retval”).Value
'断开记录集,然后
<!--#include file="../bus/adovbs.inc"-->
<%
Function GetConnectionString()
GetConnectionString = "file name=c:\udl\miconnstring.udl"
End Function
Function mp(PName , PType , PSize, PValue)
mp = Array(PName, PType, PSize, PValue)
End Function
Function RunSPReturnRS(strSP, params())
On Error Resume next
' Create the ADO objects
Dim rs , cmd
Set rs = server.createobject("ADODB.Recordset")
Set cmd = server.createobject("ADODB.Command")
' Init the ADO objects & the stored proc parameters
cmd.ActiveConnection = GetConnectionString()
cmd.CommandText = strSP
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 900 ' 15 minutos
collectParams cmd, params
' Execute the query for readonly
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenForwardOnly, adLockReadOnly
If err.number > 0 then
BuildErrorMessage()
exit function
end if
' Disconnect the recordset
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
Set rs.ActiveConnection = Nothing
' Return the resultant recordset
Set RunSPReturnRS = rs
End Function
Function RunSP(strSP , params())
On Error resume next
' Create the ADO objects
Dim cmd
Set cmd = server.createobject("ADODB.Command")
' Init the ADO objects & the stored proc parameters
cmd.ActiveConnection = GetConnectionString()
cmd.CommandText = strSP
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 900 ' 15 minutos
collectParams cmd, params
' Execute the query without returning a recordset
cmd.Execute , , adExecuteNoRecords
If err.number > 0 then
BuildErrorMessage()
exit function
end if
' Disconnect the recordset and clean up
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
Exit Function
End Function
Function RunSQL(strSP , params())
On Error resume next
' Create the ADO objects
Dim cmd
Set cmd = server.createobject("ADODB.Command")
' Init the ADO objects & the stored proc parameters
cmd.ActiveConnection = GetConnectionString()
cmd.CommandText = strSP
cmd.CommandType = adCmdText
cmd.CommandTimeout = 900 ' 15 minutos
collectParams cmd, params
' Execute the query without returning a recordset
cmd.Execute , , adExecuteNoRecords
If err.number > 0 then
BuildErrorMessage()
exit function
end if
' Cleanup
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
Exit Function
End Function
Function RunSQLReturnRS(sqlstmt, params())
On Error Resume next
' Create the ADO objects
Dim rs , cmd
Set rs = server.createobject("ADODB.Recordset")
Set cmd = server.createobject("ADODB.Command")
' Init the ADO objects & the stored proc parameters
cmd.ActiveConnection = GetConnectionString()
cmd.CommandText = sqlstmt
cmd.CommandType = adCmdText
cmd.CommandTimeout = 900 ' 15 minutos
collectParams cmd, params
' Execute the query for readonly
rs.CursorLocation = adUseClient
rs.Open cmd, , adOpenForwardOnly, adLockReadOnly
If err.number > 0 then
BuildErrorMessage()
exit function
end if
' Disconnect the recordset
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
Set rs.ActiveConnection = Nothing
' Return the resultant recordset
Set RunSQLReturnRS = rs
End Function
Function RunSPReturnInteger(strSP , params())
On Error resume next
' Create the ADO objects
Dim cmd
Set cmd = server.createobject("ADODB.Command")
' Init the ADO objects & the stored proc parameters
cmd.ActiveConnection = GetConnectionString()
cmd.CommandText = strSP
cmd.CommandType = adCmdStoredProc
cmd.CommandTimeout = 900 ' 15 minutos
collectParams cmd, params
' Assume the last parameter is outgoing
cmd.Parameters.Append cmd.CreateParameter("@retval", adInteger, adParamOutput, 4)
' Execute without a resulting recordset and pull out the "return value" parameter
cmd.Execute , , adExecuteNoRecords
If err.number > 0 then
BuildErrorMessage()
exit function
end if
RunSPReturnInteger = cmd.Parameters("@retval").Value
' Disconnect the recordset, and clean up
Set cmd.ActiveConnection = Nothing
Set cmd = Nothing
Exit Function
End Function
Private Sub collectParams(cmd , argparams())
Dim params , v
Dim i , l , u
params = argparams
For i = LBound(params) To UBound(params)
l = LBound(params(i))
u = UBound(params(i))
' Check for nulls.
If u - l = 3 Then
If VarType(params(i)(3)) = vbString Then
If params(i)(3) = "" then
v = null
else
v = params(i)(3)
end if
Else
v = params(i)(3)
End If
If params(i)(1) = adLongVarChar Then
Dim p 'As New Parameter
Set p = cmd.CreateParameter(params(i)(0), params(i)(1), adParamInput)
p.Attributes = adParamLong + adParamSigned
If Not IsNull(v) Then
'Seteo para text columns is not null
p.AppendChunk v
p.Size = Len(v)
Else
'Seteo para text columns is null
p.Value = v
p.Size = 10000
End If
cmd.Parameters.Append p
Else
cmd.Parameters.Append cmd.CreateParameter(params(i)(0), params(i)(1), adParamInput, params(i)(2), v)
End If
Else
RaiseError m_modName, "collectParams(...): incorrect # of parameters"
End If
Next
End Sub
%>