我想将受训者保存到数据库中,所以我创建了一个这样的插入查询:
set cmd = Server.CreateObject("ADODB.Command")
cmd.ActiveConnection = objCon
cmd.CommandText = "INSERT INTO tbOpleiders([opleiderDescr], [customerID]) VALUES(?, ?) "
Set paramdesc = cmd.CreateParameter("@descr", 200, 1, 100, newOpleidingsDescr)
Set paramcust = cmd.CreateParameter("@customer", 3, 1, 1000,customerID)
cmd.Parameters.Append paramdesc
cmd.Parameters.Append paramcust
现在我没有得到“CreateParameter”我发现它是:名称,类型,方向,大小,值 第一个参数是逻辑的,但为什么应该有第二个参数(ID int字段)的大小?
并且第二个问题为什么必须将值设置为?,?而不是像C#中那样:@descr,@ customer
答案 0 :(得分:3)
如有疑问,请阅读documentation:
如果在 Type 参数中指定可变长度数据类型,则必须传递 Size 参数或设置 Parameter <的Size属性/ b>将对象附加到参数集合之前;否则会发生错误。
4 th 参数仅适用于可变长度数据类型(例如adVarChar
)。对于固定大小的数据类型(如adInteger
),可以省略(如果您提供大小,则忽略该大小):
Set paramcust = cmd.CreateParameter("@customer", 3, 1, , customerID)
至于使用命名参数:它们似乎不适用于ADO。我对我的测试数据库进行了快速测试,但即使将NamedParameters
设置为True
,参数也按照它们的附加顺序传递,而不是将它们与查询中的相应名称相匹配:
>>> Set cmd = CreateObject("ADODB.Command")
>>> cmd.ActiveConnection = cn
>>> cmd.NamedParameters = True
>>> cmd.CommandText = "INSERT INTO [Tab1] ([name], [val]) VALUES (@name, @val)"
>>> Set p1 = cmd.CreateParameter("@name", 200, 1, 20, "foobar")
>>> Set p2 = cmd.CreateParameter("@val", 3, 1, , 43)
>>> 'append parameters in correct order
>>> cmd.Parameters.Append p1
>>> cmd.Parameters.Append p2
>>> cmd.Execute
>>> 'no error here
>>> Set cmd = CreateObject("ADODB.Command")
>>> cmd.ActiveConnection = cn
>>> cmd.NamedParameters = True
>>> cmd.CommandText = "INSERT INTO [Tab1] ([name], [val]) VALUES (@name, @val)"
>>> Set p1 = cmd.CreateParameter("@name", 200, 1, 20, "foobar")
>>> Set p2 = cmd.CreateParameter("@val", 3, 1, , 43)
>>> 'append parameters in reversed order
>>> cmd.Parameters.Append p2
>>> cmd.Parameters.Append p1
>>> cmd.Execute
Data type mismatch in criteria expression. (0x80040E07)
我怀疑C#使用的是ADO.net而不是经典的ADO,这在这方面似乎有所不同。