如何在Excel中通过VBA执行SQL Server存储过程并传入变量参数
VBA调用带参数SQL Server存储过程解决方案
前置要求:请先在VBA编辑器的「工具-引用」中勾选Microsoft ActiveX Data Objects 6.1 Library(版本号根据你的环境选最高的即可),避免运行报错。
完整修正代码
Sub reverse_posted() Dim con As ADODB.Connection Dim cmd As ADODB.Command Dim documentNo As Long ' 输入校验,避免无效输入报错 On Error Resume Next documentNo = InputBox("请输入需要重新过账的发票号") If Err.Number <> 0 Or documentNo <= 0 Then MsgBox "输入无效,请输入正确的数字发票号", vbExclamation Exit Sub End If On Error GoTo 0 ' 初始化数据库连接 Set con = New ADODB.Connection con.Open "Provider=SQLOLEDB;Data Source=ashcourt_app1;Initial Catalog=ASHCOURT_Weighsoft5;Integrated Security=SSPI;Trusted_Connection=Yes;" ' 配置存储过程执行命令 Set cmd = New ADODB.Command With cmd .ActiveConnection = con .CommandType = adCmdStoredProc .CommandText = "ashcourt_balfour_reverse_posting" ' 仅填写存储过程名称即可,不要拼接参数 ' 创建并传入对应@document_no的参数 .Parameters.Append .CreateParameter("@document_no", adInteger, adParamInput, , documentNo) ' 执行存储过程,UPDATE操作无返回结果集,不需要用Recordset接收 .Execute End With ' 释放资源 Set cmd = Nothing con.Close Set con = Nothing MsgBox "操作完成", vbInformation End Sub
核心改动说明
- 原代码错误将输入参数直接拼接到存储过程名称后,正确做法是通过
CreateParameter方法单独创建参数对象,追加到命令的参数集合中,既符合规范也可以避免SQL注入风险 - 你的存储过程是UPDATE更新操作,没有查询结果返回,因此不需要声明使用Recordset对象,减少不必要的资源占用
- 新增输入校验逻辑,避免用户输入非数字、点击取消时出现运行报错
内容的提问来源于stack exchange,提问作者Darren Wardill
相关产品推荐
相关产品推荐

