SQL Server возвращает пустой набор записей ADODB.Connection - PullRequest
3 голосов
/ 12 января 2012

Я использую классический ASP на IIS и у меня есть скрипт для создания соединения с базой данных SQL Server с использованием следующего кода:

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 (доступ к которым осуществляется с помощью тех же учетных данных пользователя), запросы возвращают полные наборы записей.

Что еще я могу сделать / проверить, чтобы решить эту проблему? Это действительно сбивает с толку меня!

Ответы [ 3 ]

1 голос
/ 12 января 2012

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

rs.CursorLocation = adUseClient

OR

rs.CursorLocation = 3

Отправьте это, используйте rs.RecordCount для проверки количества возвращенных записей.

0 голосов
/ 12 января 2012

Убедитесь, что вы закрыли свое соединение после его использования, я не вижу близкого соединения в вашем коде или какой-либо ссылки на него. Если вы обращаетесь к базе данных только один раз в день или около того, у вас все будет хорошо, но если вы постоянно обращаетесь к базе данных, значит, вы превысили лимит подключения. Если вы не видите ошибок, это немного странно, но вы можете их где-то подавлять.

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.
0 голосов
/ 12 января 2012

Попробуйте сделать это вместо:

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 для записи буфера пользователю

...