在.NET程序集中向ADODB命令添加参数时出现错误

3

我有一个.NET程序集,被经典ASP页面使用。我创建了一个返回ADODB记录集的方法。在我的ADODB命令对象中,我使用以下格式提供参数到adCmdStoredProc CommandType属性...

With ADODBCmd 
.ActiveConnection = ADODBConn
.Prepared = True
.CommandType = CommandTypeEnum.adCmdStoredProc
.NamedParameters = True
.CommandText = Sql_GetMyBook   
.Parameters.Append(.CreateParameter("@book", DataTypeEnum.adChar, ParameterDirectionEnum.adParamInput, 50, MyBook))
End With

我遇到了一个转型错误...

System.Exception未被处理
Message=System.InvalidCastException: 无法将类型为“System.__ComObject”的COM对象强制转换为类型为“ADODB.InternalParameter”的类。代表COM组件的类型实例不能强制转换为不代表COM组件的类型,但只要底层的COM组件支持IID接口的QueryInterface调用,它们就可以被强制转换为接口。

出错位置在代码行:

.Parameters.Append(.CreateParameter("@book", DataTypeEnum.adChar, ParameterDirectionEnum.adParamInput, 50, MyBook))

有什么想法吗?

存储过程:

ALTER PROCEDURE [dbo].[GetMybook]
    -- Add the parameters for the stored procedure here
    @book char(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT BookTitle, Author, PulishedDate
    FROM        Library
    WHERE       BookTitle=@book
2个回答

7

微软ActiveX数据对象库中的".CreateParameter"方法返回值存在差异(无意或有意)。

2.7版本返回"ADODB.InternalParameter"(ADODB.Command对象所期望的)。

2.8版本返回"System.__ComObject"(ADODB.Command无法处理或不知道如何处理)。

为了将创建的参数附加到命令对象中,我不得不将引用从2.8更改为2.7库。

感谢Chris Behrens帮助我缩小解决方案的搜索范围。


0

我认为这与"MyBook"的值有关。从数据类型来看,我们应该期望它是一个单个字符,但错误信息似乎表明它是一个完整的COM对象。也许应该像"MyBook.Id"这样设置?


尝试将类型枚举更改为adVarChar,看看是否有任何区别。 - Chris B. Behrens
你能发布过程内容吗? - Chris B. Behrens
另一个想法...我正在努力回忆经典的ASP字符串转换函数...我想它是cstr()吧?尝试通过以下方式将MyBook运行:.Parameters.Append(.CreateParameter("@book", DataTypeEnum.adChar, ParameterDirectionEnum.adParamInput, 50, CStr(MyBook))) - Chris B. Behrens
将代码分成两行,一行是强制转换,另一行是参数赋值,并查看哪一行会生成错误。我怀疑会是强制转换那一行。问题的本质在于,由于某种原因,经典的asp引擎将MyBook解释为COM对象而不是简单的变量,它应该能够轻松地将其强制转换为System.String。下一步我会尝试的是将MyBook的值硬编码为您知道可以工作的值,然后观察会发生什么。 - Chris B. Behrens
好的...尝试第二个建议,将MyBook硬编码为类似于“1”、“A”或其他任何内容。 - Chris B. Behrens
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接