ADODB.Recordset error '800a0bb9' : Argumen

2019-01-12 07:11发布

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

The above code is in classic asp.

I am getting the following error:

ADODB.Recordset error '800a0bb9'
Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.

Dows anyone know the cause this error and how to fix it?

标签: asp-classic
5条回答
我命由我不由天
2楼-- · 2019-01-12 07:20

Unless you need to navigate back and forth in the recordset, just use the default settings:

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

Also, your code is wide open for SQL Injection attacks - you better learn about it and change your code to use Parameters instead.

查看更多
虎瘦雄心在
3楼-- · 2019-01-12 07:22

I feel like I searched the whole internet and couldn't find the solution to this problem, and just as I was about to give up, I realized that I had declared my connection variable within an "If" statement and because the if statement did not execute neither did my command to the database giving the error as mentioned in your question.

查看更多
干净又极端
4楼-- · 2019-01-12 07:25

The most like cause is that you haven't included "ADOVBS.INC" or the equavalent META:-

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

Hence the adxxxx constants do not exist. However your primary mistake is not including Option Explicit at the top your script. This will save you bucket loads of time hunting silly mistakes and typos.

BTW What happens if ATTUserDataID contained "0; DELETE ATTJournals;" ?
Avoid composing SQL using concatenation like the plague. Search for "ASP SQL Injection" to find examples of using parameterised command objects instead.

查看更多
在下西门庆
5楼-- · 2019-01-12 07:39
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
查看更多
乱世女痞
6楼-- · 2019-01-12 07:44

First, when I devoleped application with vbscript I used always the numbers to open a recordset. I recommend following line:

rsPlanID.Open strSQL, m_objConn, 3, 3

Make sure that you include the file adovbs.inc first. The numbers are conntected to the different types of recordset properties. And don't foregt to open the databse connection first.

Second, I think you don't need the line

rsPlanID.CursorLocation = adUseClient 

Thrird, see also this thread. Maybe it is a good template for you.

查看更多
登录 后发表回答