如何用C#的ADODB.Connection执行无参数存储过程?报错求助
如何用ADODB在C#中正确执行无参数存储过程?
我尝试使用C#的ADODB连接执行一个无参数存储过程,编写了如下代码:
ADODB.Recordset oRecset1 = new ADODB.Recordset(); oConnection.CursorLocation = ADODB.CursorLocationEnum.adUseClient; object objRecAff; object parameters1; parameters1 = null; ADODB.Command cmd = new ADODB.Command(); cmd.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc; cmd.ActiveConnection = oConnection; cmd.CommandTimeout = 600; cmd.CommandText = "dbo.ImportModel"; oRecset1 = (ADODB.Recordset)cmd.Execute(out objRecAff, ref parameters1, (int)ADODB.CommandTypeEnum.adCmdStoredProc);
运行后出现错误提示:
"Parameter object is improperly defined. Inconsistent or incomplete information was provided."
请问该如何正确执行无参数存储过程?
这个错误的根源在于你给Execute方法的第二个参数传了null——ADODB的Command.Execute方法在处理无参数的情况时,不能直接传null作为ref参数,而是需要传入System.Reflection.Missing.Value来明确表示没有参数要传递。
修正后的代码如下:
ADODB.Recordset oRecset1 = new ADODB.Recordset(); oConnection.CursorLocation = ADODB.CursorLocationEnum.adUseClient; object objRecAff; ADODB.Command cmd = new ADODB.Command(); cmd.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc; cmd.ActiveConnection = oConnection; cmd.CommandTimeout = 600; cmd.CommandText = "dbo.ImportModel"; // 用Missing.Value代替null作为无参数的标识 oRecset1 = (ADODB.Recordset)cmd.Execute(out objRecAff, ref System.Reflection.Missing.Value, (int)ADODB.CommandTypeEnum.adCmdStoredProc);
另外还有一个更简洁的写法,如果你不需要获取受影响的行数,也可以直接调用适配的重载:
oRecset1 = cmd.Execute(Type.Missing, Type.Missing, (int)ADODB.CommandTypeEnum.adCmdStoredProc);
简单解释下:ADODB基于COM接口设计,ref参数不能接受null值,必须用Missing.Value来占位,表示该参数不需要传递任何内容。你之前传null会让COM组件无法正确解析参数定义,从而抛出那个参数格式错误的提示。
内容的提问来源于stack exchange,提问作者mcj
相关产品推荐
相关产品推荐

