2012-01-12 66 views
3

我在IIS上運行傳統的ASP和使用下面的代碼有一個腳本來創建一個SQL Server數據庫的連接:SQL Server返回空記錄ADODB.Connection

Dim adoConn As Object 
adoConn = Server.CreateObject("ADODB.Connection") 
adoConn.Open ("Provider=SQLOLEDB; Data Source=localhost; Initial Catalog=Engineering_Test; User ID=*********; Password=*******") 

我然後運行SQL查詢選擇關閉此連接如下:

Dim rs As Object 
rs = Server.CreateObject("ADODB.Recordset") 

SQL = "SELECT [User ID] FROM [Users] WHERE [Username]='" & username & "' AND [Password]='" & password & "'" 
rs.Open(SQL, adoConn, 3, 3) 

所有工作正常,但後來我發現我有很多的服務器上睡眠的進程,並已開始拒絕連接,因爲我大概已經刷爆了所有允許連接到服務器。實際上,我在屏幕上看到的是我的SQL查詢返回空記錄集,實際上它們應該包含多行。

因此我殺死了服務器上的所有睡眠進程,重新啓動SQL Server和IIS,但是,我正在執行的SQL查詢仍然返回空記錄集,沒有顯示任何錯誤,並且按預期編譯了所有內容。

當我使用遠程桌面登錄到服務器並在SQL Server Management Studio中執行完全相同的查詢(通過相同的用戶憑據訪問)時,查詢返回完整的記錄集。

還有什麼我可以做/檢查解決這個問題?這真是讓我莫名其妙!

+1

關於你的空記錄集問題,在'SET NOCOUNT ON;'help的前面加上你的語句前綴? – 2012-01-12 11:24:31

+0

不,不幸的是,它仍然返回一個空記錄集,現在rs.RecordCount的值等於-1而不是0 – user1145348 2012-01-12 11:44:11

+0

檢查如果您使用的SQLOLEDB驅動程序已安裝與您的SQL Server 2000安裝相對應服務器,如果沒有,則使用適當的本地客戶端驅動程序在某些情況下,如果不使用正確的驅動程序,我會報告奇怪的行爲 – Rafael 2012-01-12 15:00:36

回答

0

儘量不要做這樣的:

dim adoConn, dsn 
set adoConn = server.createobject("adodb.connection") 
dsn = "Provider=SQLOLEDB; Data Source=localhost; Initial Catalog=Engineering_Test; User ID=*********; Password=*******" 
conn.connectiontimeout = 300 
conn.commandtimeout = 300 
response.buffer = true 

if conn.state = 0 then 
    conn.open dsn 
end if 

sql = "SELECT [User ID] FROM [Users] WHERE [Username]='" & username & "' AND [Password]='" & password & "'" 
set rs = conn.execute(sql) 

if rs.eof then 
    response.write("No user matches the criteries.") 
else 
    id = rs("User ID") 

    response.write("The user's ID: " & id) 
end if 

response.buffer會幫助你,如果你以後需要從數據庫中提取大量行的,在這裏你可以使用response.flush到緩衝區寫入用戶

+0

感謝您的回覆,但不幸的是,這也不起作用,我不認爲問題是一個編程的問題,我改變了SQL選擇到SQL插入聲明,並工作得很好。 – user1145348 2012-01-12 12:00:54

+0

我想知道它是否可以與服務器上的內存有關?而不能將記錄集存儲在IIS/SQL Server的內存中?我對這種服務器端的東西瞭解不多。 – user1145348 2012-01-12 12:01:42

+0

在這種情況下,你應該扔掉服務器並獲得一個新的;) – Behrens 2012-01-12 12:03:29

1

嘗試添加此行的代碼,打開記錄

rs.CursorLocation = adUseClient 

OR

rs.CursorLocation = 3 

發表後,請使用rs.RecordCount檢查返回的記錄數。

0

請確保您在使用後關閉連接,但在您的代碼中沒有看到關閉連接或任何對它的引用。如果你每天只能訪問一次數據庫,那麼你會好起來的,但如果你不斷地訪問數據庫,那麼你的連接數就會超出限制。如果你沒有看到那種奇怪的錯誤,但你可以在某處壓制它們。

Dim rs As Object 
rs = Server.CreateObject("ADODB.Recordset") 

SQL = "SELECT [User ID] FROM [Users] WHERE [Username]='" & username & "' AND [Password]='" & password & "'" 
rs.Open(SQL, adoConn, 3, 3) 

... DO SOMETHING ... 

rs.Close '<-- Close the current connection when done using it.