Ошибка ADODB.Recordset '800a0bb9': аргументы имеют неправильный тип - PullRequest
5 голосов
/ 08 декабря 2011
Set rsPlanID = Server.CreateObject("ADODB.Recordset")
rsPlanID.CursorLocation = adUseClient

strSQL = "SELECT PlanID FROM ATTJournals WHERE ATTUserDataID = " & ATTUserDataID 
rsPlanID.Open strSQL, m_objConn, adOpenStatic, adLockOptimistic

If Not rsPlanID.EOF Then
    response.Write "New PlanID:"  & rsPlanID("PlanID")
End If

Код выше приведен в классическом asp.

Я получаю следующую ошибку:

Ошибка ADODB.Recordset '800a0bb9'
Аргументынеправильного типа, находятся за пределами допустимого диапазона или конфликтуют друг с другом.

Дау, кто-нибудь знает причину этой ошибки и как ее исправить?

Ответы [ 5 ]

14 голосов
/ 08 декабря 2011

Наиболее похожая причина в том, что вы не указали "ADOVBS.INC" или эквивалентный META: -

<!--METADATA
TYPE="TypeLib"
NAME="Microsoft ActiveX Data Objects 2.6 Library"
UUID="{00000206-0000-0010-8000-00AA006D2EA4}"
VERSION="2.6"
-->

Следовательно, константы adxxxx не существуют. Однако ваша основная ошибка не включает Option Explicit в верхней части вашего скрипта. Это сэкономит вам кучу времени на охоту за глупыми ошибками и опечатками.

Кстати, что произойдет, если ATTUserDataID содержит "0; DELETE ATTJournals;"
Избегайте составления SQL с использованием конкатенации, как чумы. Выполните поиск «ASP SQL Injection», чтобы найти примеры использования параметризованных командных объектов.

1 голос
/ 08 декабря 2011

Если вам не нужно перемещаться вперед и назад в наборе записей, просто используйте настройки по умолчанию:

strSQL = "SELECT PlanID FROM ATTJournals WHERE ATTUserDataID = " & ATTUserDataID 
Set rsPlanID = m_objConn.Execute(strSQL)

Кроме того, ваш код широко открыт для атак с использованием SQL-инъекций - вам лучше узнать об этом и изменить код, чтобы использовать вместо него параметры.

0 голосов
/ 07 января 2014

Мне кажется, что я искал весь Интернет и не смог найти решение этой проблемы, и, как только я собирался сдаться, я понял, что объявил переменную соединения в операторе "If", и потому что если оператор не выполнялся, моя команда в базу данных не выдавала ошибку, как указано в вашем вопросе.

0 голосов
/ 27 декабря 2013
Function SQL_getRecordset(strQuery)

'On Error Resume Next
 'Create Database connection object
  Set objConnection = CreateObject("ADODB.Connection")

  'Create Recordset object
  Set objrecordset = CreateObject("ADODB.Recordset")

  'Specify the connection string
  strConnectionstring = "Provider=SQLOLEDB.1;Data Source=*<Server name>*;Initial Catalog=*<database>*;Integrated Security=SSPI"
  objConnection.Open strConnectionstring

  'Execute the Query
  Set objrecordset = objConnection.Execute(strQuery)

  'Return Recordset
  Set SQL_getRecordset = objrecordset

  'Release objects from the memory
  Set objConnection = Nothing
  Set objrecordset = Nothing

End Function
0 голосов
/ 08 декабря 2011

Во-первых, когда я разработал приложение с помощью VBScript, я всегда использовал числа, чтобы открыть набор записей.Я рекомендую следующую строку:

rsPlanID.Open strSQL, m_objConn, 3, 3

Убедитесь, что вы сначала включили файл adovbs.inc.Числа связаны с различными типами свойств набора записей.И не забывайте сначала открыть соединение с базой данных.

Во-вторых, я думаю, вам не нужна строка

rsPlanID.CursorLocation = adUseClient 

Thrird, см. Также эту тему ,Может быть, это хороший шаблон для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...