早上好,
我有以下功能:
FUNCTION queryDatabaseCount(sqlStr)
SET queryDatabaseCountRecordSet = databaseConnection.Execute(sqlStr)
If queryDatabaseCountRecordSet.EOF Then
queryDatabaseCountRecordSet.Close
queryDatabaseCount = 0
Else
QueryArray = queryDatabaseCountRecordSet.GetRows
queryDatabaseCountRecordSet.Close
queryDatabaseCount = UBound(QueryArray,2) + 1
End If
END FUNCTION
以下dbConnect:
SET databaseConnection = Server.CreateObject("ADODB.Connection")
databaseConnection.Open "Provider=SQLOLEDB; Data Source ="&dataSource&"; Initial Catalog ="&initialCatalog&"; User Id ="&userID&"; Password="&password&""
但由于某种原因,我收到以下错误:
ADODB.Recordset error '800a0e78'
关闭对象时不允许操作。
/UBS/DBMS/includes/blocks/block_databaseoverview.asp,第30行
有没有人有任何建议?
非常感谢, 乔尔
答案 0 :(得分:2)
很长一段时间以来,我接触了asp / ado,但我对EOF的一些模糊记忆并不总是一个可靠的指标:
If (rst.BOF And rst.EOF) Then
--
Else
--
End If
顺便说一句,你不应该真的以这种方式确定记录数。最好执行一个只返回计数的语句或proc,而不是返回行然后计算它们。
答案 1 :(得分:0)
正如已经指出的那样:使用计数而不是你的代码(你的代码会将所有数据加载到内存中!)
function queryDatabaseCount(sTable, sSomeCondition)
dim sSql
dim Result
Result = 0
sSql = "select Count(*) as Cnt from " & sTable
if sSomeCondition <> "" then
sSql = sSql & " where " & sSomeCondition
end if
objRec.Source = sSql
objRec.Open
Result = Fld("Cnt")
objRec.Close
queryDatabaseCount = Result
结束功能
将其称为
dim i
SET databaseConnection = Server.CreateObject("ADODB.Connection")
SET objRec = Server.CreateObject("ADODB.Recordset")
objRec.ActiveConnection = databaseConnection
i = queryDatabaseCount("MyTable", "SomeField = 1")
databaseConnection.Close
SET databaseConnection = nothing
没有测试过这段代码,但它应该可以解决问题(或者非常接近解决方案)。
正如旁注:我倾向于将后缀_DBO附加到这些函数(意味着数据库打开),让我知道此函数需要打开数据库连接。但这当然只是个人偏好。