我主要是一名PHP开发人员,但是我有一些旧的ASP,这是我们以前的开发人员中的一位失败了,所以我不知道如何解决它.我们有一个程序,该程序将一些变量发送到侦听器页面,该页面将数据与msSQL数据库的注册代码进行比较,然后让该程序知道注册代码是否有效.
我收到以下错误,其中
.Parameters.Append .CreateParameter("@code", adVarChar, 1, 50, x)
是第134行:
ADODB.Parameters error '800a0e7c'
Parameter object is improperly defined. Inconsistent or incomplete information was provided.
/checkregistrationpro.asp, line 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
...
Problem Solved: 对于手动定义adVarChar为何不起作用,我仍然不清楚.但是,会发生人为错误.通过创建一个引用msado15.dll的global.asa文件,我能够解决此问题.有关明确说明,请参见下面的Ryios帖子。
最新回答
- 2020-12-261 #
相关问题
- vbscript:如何在ASP Classic中使用cURL发布数据?curlvbscriptaspclassic2021-01-11 01:29
- asp classic:使用ASP VBScript的XML / SelectNodes出现问题xmlaspclassicvbscript2021-01-10 21:23
- 如何在经典ASP上进行参数化的SQL查询?sqlaspclassicvbscript2020-12-27 08:57
- vbscript:比较两个数组的值-经典ASParraysvbscriptaspclassiccomparison2020-11-30 16:56
- asp classic:使用Javascript下载文件javascriptaspclassicvbscript2020-11-21 20:56
常见的情况可能是您没有
adVarChar
定义,所以CreateParameter()
方法是"定义不正确"。这只是ADODB库中找到的许多命名常量之一的示例.解决这个问题的麻烦方法是自己定义值;
这种方法的问题是您必须定义所有命名的常量,这可能很麻烦.另一种方法是只跳过整个命名的常量事物,而只使用整数值,因此调用应为
尽管看起来好像您已经在使用
ParameterDirectionEnum
一样进行操作,但这并不容易阅读1
的value 这就是命名的常量adParamInput
在ADODB库中.无论如何,我都不会推荐这种方法。一种更好的方法是使用
#include
指令,以便它可以在调用页面中包含您可能需要的所有命名常量定义,而这正是大多数这样做的方式. Microsoft为此目的通过IIS(或可能不确定的MDAC库安装)提供了一个预定义的文件,称为adovbs.inc
或adovbs.asp
,通过包含此文件,您的页面将可以访问其中的所有命名常量定义。所有这些的原因是VBScript不支持类型库,因此在Client方案中,您可以自行定义它们或从
adovbs.inc
复制和粘贴 文件是您唯一的选择.但是,在服务器方案中,我们仍然具有IIS的功能,可以让我们做一些时髦的事情。如果类型库可以只添加一次并且您不必担心它,这会很好吗?不需要烦人的常量来定义吗? 面对它们,它们已经存在于类型库中了,为什么我们不能从那里获取它们呢? 好吧,我们可以感谢
METADATA
指令。这里是一个例子;
这种方法的优点是您可以将其用于任何类型库(最好公开给COM),并且可以在一页中进行定义,也可以将其添加到
global.asa
中 在整个web应用程序中进行定义。通过这种方法,您可以放心使用类似的代码;
有用链接
VBScript ADO Programming
Answer to ASP 3.0 Declare ADO Constants w/out Including ADOVBS.inc
Answer to Passing Parameters to a Stored Procedure using ASP
Using METADATA to Import DLL Constants
在定义adVarChar和其他ADO幻数的地方,完全删除它们。
相反,请将其添加到global.asa的顶部(如果不存在则创建一个)。
这将导入msado15类型库,该库已经定义了所有这些幻数.它将自动为您提取所有定义.意味着您不必自己定义adVarChar等,元数据标签将自动为您导入它们.感谢@Lankymart的意见,因为他的评论使我发现了这个问题并将其弄清楚,而且效果很好。
现在,打开一个空白的测试ASP页面,并在显式打开选项的基础上向其中添加一些测试代码。
如果收到未定义adVarChar的错误,则说明msado15.dll不在服务器上.因此,您将需要与Godaddy等联系,以使他们告诉您那里存在的MSADO版本的路径,并更改元数据标记以引用正确的版本。