ADODB.Recordset error '800a0bb9' : Argumen

2019-01-12 07:21发布

问题:

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?

回答1:

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.



回答2:

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.



回答3:

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.



回答4:

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.



回答5:

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


标签: asp-classic