【发布时间】:2016-06-01 09:55:45
【问题描述】:
我主要是一名 PHP 开发人员,但我有一些旧的 ASP 是我们以前的开发人员之一制作的,它坏了,我不知道如何修复它。我们有一个程序将一些变量发送到侦听器页面,该页面将这些数据与注册码和 msSQL 数据库进行比较,然后让程序知道注册码是否有效。
我在哪里遇到以下错误
.Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x)
是第 134 行:
ADODB.Parameters 错误'800a0e7c'
参数对象定义不正确。提供的信息不一致或不完整。
/checkregistrationpro.asp,第 134 行
我已经在包含文件中指定了我没有包含在代码中的任何命名常量,因此与此无关。
我的连接字符串(我已经验证这些设置是正确的):
set conn = Server.CreateObject("ADODB.Connection")
set cmd = Server.CreateObject("ADODB.Command")
sConnString = "Provider=sqloledb; Data Source=MYDATASOURCE; Initial Catalog=MYCATALOG; User ID=MYUSERID; Password='MYPASSWORD';"
conn.Open sConnString
我的代码:
...
Function BlockInjectCode(StrVal)
BlockInjectCode = Replace(StrVal,"--","")
BlockInjectCode = Replace(BlockInjectCode,"'","")
BlockInjectCode = Replace(BlockInjectCode,"""","")
if instr(lcase(BlockInjectCode),"<") > 0 then
BlockInjectCode = ""
end if
End Function
x = BlockInjectCode(Request.QueryString("rid"))
uid = BlockInjectCode(Request.QueryString("uid"))
chkcode = BlockInjectCode(Request.QueryString("Code"))
CheckPro = BlockInjectCode(Request.QueryString("pro"))
CheckProProd = BlockInjectCode(Request.QueryString("prod"))
CheckProMac = BlockInjectCode(Request.QueryString("mac"))
MacAdd = CheckProMac
CodeValid = False
if x <> "" and uid <> "" then
'-- Get information about this registration code.
sqlStr = "select * from MYTABLE where Code = ? and IsValid = 1"
set cmdCodes = Server.CreateObject("ADODB.Command")
Set cmdCodes.ActiveConnection = Conn
cmdCodes.CommandText = sqlStr
with cmdCodes
.Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x)
end With
Set rsCodes = cmdCodes.execute
...
【问题讨论】:
-
你需要给 adVarChar 一个值,它现在是空的并且是无效的。使用文档:w3schools.com/asp/met_comm_createparameter.asp。 adVarChar 的值应该是 200。我实际上有一个很好的函数,它可以使用 VarType 自动执行此操作,当我备份我的 VM 并关闭源代码时,我会为你发布它。
-
此外,如果您在导致错误的页面的第一行添加 ,它将打开严格的变量检查并在未定义变量时抛出错误,这会告诉你确定 adVarChar 是否在任何地方都没有价值。
-
@Ryios 我不建议在
global.asa中定义它们,尽管您可以我的建议是让 IIS 直接从类型库为您加载它们,这样您就不必再定义了只需将METADATA指令添加到页面/global.asa。 -
如果可以的话,我实际上是 .net 开发人员,mvc 5/6,nuget 等。我正在进行的这个项目是公司最后一个经典项目,做出的决定在我对任何事情有发言权之前,这已经过去了。由于我们在生产中还有大量其他经典的 asp 东西,所以我现在制作的东西在清理不良代码并使其更容易移植到 .net 或 java spring 时派上用场。
-
您可能只是遇到了问题,因为旧服务器上的应用程序池可能设置为经典模式,而新服务器上的应用程序池可能是集成模式。或者,新的应用程序池可能在 64 位模式下运行,而应用程序依赖于只有 32 位版本的 dll,因此它需要在 32 位模式下运行才能工作。也有可能您在 global.asa 中的 typelib 元数据标记为 ADO 指的是新服务器上不存在的 ado DLL,这在您的错误上下文中更有意义。
标签: vbscript asp-classic dllimport adodb