2012-01-12 1 views
3

Я бегу классический ASP на IIS и есть скрипт для создания подключения к базе данных SQL Server, используя следующий код:SQL Server Возвращает Empty Recordset 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? –

+0

Нет, к сожалению, нет, он по-прежнему возвращает пустой набор записей, и теперь значение rs.RecordCount равно -1 вместо 0 – user1145348

+0

. Убедитесь, что если вы используете драйвер SQLOLEDB, который вы установили, соответствующий SQL-сервер 2000, установленный в вашем сервер, если нет, то используйте соответствующий драйвер родного клиента. В некоторых случаях я сообщал о нечетном поведении, когда не использовал правильный драйвер. – Rafael

ответ

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

+0

Мне интересно, может ли это быть чем-то связанным с памятью на сервере?И не удается сохранить набор записей в памяти в IIS/SQL Server? Я не очень разбираюсь в такого рода серверных вещах. – user1145348

+0

В этом случае вы должны действительно выбросить сервер и получить новый;) – Behrens

1

Попробуйте добавить эту строку в код, прежде чем открыть набор записей

rs.CursorLocation = adUseClient 

ИЛИ

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.