2010-05-28 65 views
0

早安,簡單的ASP功能問題

我有以下功能:

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 

而下面的數據庫連接:

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

你在哪裏包括dbConnect?在包含block_databaseoverview.asp之前,需要包含它。 – 2010-05-28 09:42:27

+1

哪一行是30? – 2010-05-28 09:42:58

+0

第30行是: 如果queryDatabaseCountRecordSet.EOF Then – 2010-05-28 09:59:51

回答

2

,因爲我感動ASP/ADO,但我有一些模糊的記憶有關EOF並不總是作爲一個可靠的指標,很長一段時間:

If (rst.BOF And rst.EOF) Then 
-- 
Else 
-- 
End If 

順便說一句,你不應該」這實際上就是以這種方式確定記錄數。最好執行一個只返回count的語句或proc,而不是返回行然後對它們進行計數。

+1

這聽起來更合理,但我怎麼能實現這一點。 – 2010-05-28 09:49:38

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附加到這些函數(意思是數據庫打開),讓我知道這個函數需要打開數據庫連接。但這當然只是個人喜好。