Database 这在编程上是个坏主意吗?
目前,我正在尝试为我们的网站创建一些编码捷径。现在要查询数据库并返回记录集,必须调用2个函数:Database 这在编程上是个坏主意吗?,database,asp-classic,ado,Database,Asp Classic,Ado,目前,我正在尝试为我们的网站创建一些编码捷径。现在要查询数据库并返回记录集,必须调用2个函数: GetDBConn将打开的ado连接对象返回给传入的连接字符串 GetRS基于传入的ado连接和sql返回记录集对象 set objConn = GetDBConn(connString, commandTimeout, connTimeout, cursorType) set objRs = GetRS(objConn, sql) 我想把这两个函数写成一个函数,但我的问题是。。。我非常确定,当
GetDBConn
将打开的ado连接对象返回给传入的连接字符串
GetRS
基于传入的ado连接和sql返回记录集对象
set objConn = GetDBConn(connString, commandTimeout, connTimeout, cursorType)
set objRs = GetRS(objConn, sql)
我想把这两个函数写成一个函数,但我的问题是。。。我非常确定,当完成ado连接时,您应该关闭并销毁它们。如果我dim
新函数内的连接,查询数据库并返回记录集,我无法关闭并销毁函数内的连接,否则函数返回的记录集将变得无用(即,该连接对象从未显式关闭/销毁)。可以吗?它会对SQL/Web服务器产生任何负面影响吗
谢谢不关闭连接将导致SQL server资源出现问题。根据您的硬件和建立的连接数量,您可能不会注意到问题。或者它可能使服务器无法访问…不关闭连接将导致SQL server资源出现问题。根据您的硬件和建立的连接数量,您可能不会注意到问题。或者它可能会使服务器无法访问…将其用于记录集可能不是一个好主意(太容易忘记关闭它们),但是打开/关闭连接应该不会有问题。我在所有传统的经典ASP网站上使用以下两个功能:
conn.asp
:
<%
Dim oConn
Sub openConn()
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open sConn 'connection string here'
End Sub
Sub closeConn()
If IsObject(oConn) Then
On Error Resume Next
If oConn.State = 1 Then
oConn.Close
End If
Set oConn = Nothing
Err.Clear
On Error Goto 0
End If
End Sub
%>
然后我包括conn.asp
并在页面顶部使用openConn()
一次,在底部使用closeConn()
下一步错误恢复时的
通常被视为“糟糕的编码”实践,但在这种情况下,我认为这是适当的,否则您使用的所有页面都会出现错误closeConn()
对于那些因任何原因而导致连接状态失败的边缘情况,启用该选项。将其用于记录集可能不是一个好主意(很容易忘记关闭它们),但是打开/关闭连接不应该是一个问题。我在所有传统的经典ASP网站上使用以下两个功能:
conn.asp
:
<%
Dim oConn
Sub openConn()
Set oConn = Server.CreateObject("ADODB.Connection")
oConn.Open sConn 'connection string here'
End Sub
Sub closeConn()
If IsObject(oConn) Then
On Error Resume Next
If oConn.State = 1 Then
oConn.Close
End If
Set oConn = Nothing
Err.Clear
On Error Goto 0
End If
End Sub
%>
然后我包括conn.asp
并在页面顶部使用openConn()
一次,在底部使用closeConn()
下一步错误恢复时的
通常被视为“糟糕的编码”实践,但在这种情况下,我认为这是适当的,否则您使用的所有页面都会出现错误closeConn()
对于那些因任何原因而失败的边缘情况,oConn.State
。我一直使用MS reference应用程序提供的dbhelper.asp
这些函数总是返回一个断开连接的记录集,因此您永远不会遇到麻烦
功能如下所示:
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 minutes
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
我一直使用MS reference应用程序提供的dbhelper.asp 这些函数总是返回一个断开连接的记录集,因此您永远不会遇到麻烦 功能如下所示:
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 minutes
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
请注意您的标签选择。。。下次使用前,请检查
ASP
标记的说明。@JoelCoehoorn:对不起,我的错。以后就可以了。请注意您的标签选择。。。下次使用前,请检查ASP
标记的说明。@JoelCoehoorn:对不起,我的错。将来可以。这条线是什么?“collectParams cmd,params”是另一个函数,用于收集param数组并将其放入命令中。源代码在答案中的下载链接中。这一行是什么?“collectParams cmd,params”是另一个函数,用于收集param数组并将其放入命令中。源代码在答案中的下载链接中。