简单的ASP功能问题

时间:2010-05-28 09:36:11

标签: sql-server-2005 asp-classic

早上好,

我有以下功能:

 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行

有没有人有任何建议?

非常感谢, 乔尔

2 个答案:

答案 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附加到这些函数(意味着数据库打开),让我知道此函数需要打开数据库连接。但这当然只是个人偏好。