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'
参数类型错误,超出可接受的范围,或彼此冲突。
Dows有人知道导致此错误的原因以及如何修复它?
答案 0 :(得分:14)
最相似的原因是您没有包含“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
。这样可以节省大量的时间来寻找愚蠢的错误和拼写错误。
BTW如果ATTUserDataID
包含“0; DELETE ATTJournals”,会发生什么? ?
避免使用像瘟疫这样的连接来编写SQL。搜索“ASP SQL注入”以查找使用参数化命令对象的示例。
答案 1 :(得分:0)
首先,当我使用vbscript编写应用程序时,我总是使用数字来打开记录集。我建议按照以下行:
rsPlanID.Open strSQL, m_objConn, 3, 3
确保首先包含文件adovbs.inc。这些数字与不同类型的记录集属性相关联。并且不要首先打开数据库连接。
其次,我认为你不需要这一行
rsPlanID.CursorLocation = adUseClient
三,请参阅this thread。也许这对你来说是一个很好的模板。
答案 2 :(得分:0)
除非您需要在记录集中来回导航,否则只需使用默认设置:
strSQL = "SELECT PlanID FROM ATTJournals WHERE ATTUserDataID = " & ATTUserDataID
Set rsPlanID = m_objConn.Execute(strSQL)
此外,您的代码对于SQL注入攻击是敞开的 - 您最好了解它并更改代码以使用参数。
答案 3 :(得分:0)
我觉得我在整个互联网上搜索并且无法找到解决这个问题的方法,就像我即将放弃一样,我意识到我已经在一个&#34中声明了我的连接变量;如果& #34;声明,因为if语句没有执行,我的命令也没有给出数据库中的错误,如你的问题所述。
答案 4 :(得分:-1)
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