ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 15630|回复: 9

[分享] 吐血推荐---excel VBA调用SQLserver中带参数的存储过程

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-1-9 23:09 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:ADO技术
1,不带参数的,直接在连接或Recordset 中用“EXEC 过程名”调用即可。
Private Sub cmdPrepareNewMinSalary_Click()
    Dim conEmployees As ADODB.Connection
    Dim strProcedure As String
   
    Set conEmployees = Application.CurrentProject.Connection
    strProcedure = "CREATE PROCEDURE SetNewMinSalary " & _
                   "AS " & _
                   "Update Employees " & _
                   "SET HourlySalary = 12.50;"
   
    conEmployees.Execute strProcedure
    conEmployees.Close
End Sub
调用程序如下:
Private Sub cmdNewMinSalary_Click()
    Dim conEmployees As ADODB.Connection
    Dim strProcedure As String
   
    Set conEmployees = Application.CurrentProject.Connection
    strProcedure = "EXECUTE SetNewMinSalary;"
   
    conEmployees.Execute strProcedure
    conEmployees.Close
End Sub

2,带一个参数的,也可以直接调用,如下例子
Private Sub cmdCreateProcedure_Click()
    Dim conEmployees As ADODB.Connection
    Dim strProcedure As String
   
    Set conEmployees = Application.CurrentProject.Connection
    strProcedure = "CREATE PROCEDURE SetNewMinSalary " & _
                   "(NewMinSalary Currency) " & _
                   "AS " & _
                   "Update Employees " & _
                   "SET HourlySalary = NewMinSalary " & _
                   "WHERE HourlySalary < NewMinSalary;"
                  
    conEmployees.Execute strProcedure
   
    MsgBox "The new stored procedure has been created."
    conEmployees.Close
End Sub

调用时直接输入一个参数。
Private Sub cmdExecuteProcedure_Click()
    Dim conEmployees As ADODB.Connection
    Dim strProcedure As String
   
    Set conEmployees = Application.CurrentProject.Connection
    strProcedure = "EXECUTE SetNewMinSalary 14.50;"
   
    conEmployees.Execute strProcedure
   
    MsgBox "The minimum hourly salary has been set to 14.50/hr"
    conEmployees.Close
End Sub

3:最麻烦的是带有多参数的,如下面的例子带有两个参数。
直接从SQL server复制过程如下:
CREATE PROCEDURE [dbo].[Max_2ExcelDB]
(
        @Territory varchar(10)='All',
        @Country varchar(10)='CN'
)
AS
        set nocount on
        if @Territory='All'
                BEGIN
                        select * from CustomerDB
                        set nocount off
                END
        else
                begin
                        select a.* from CustomerDB a left join DistributorDB b
                        on a.Distributor=b.Distributor
                        where b.Territory in (@Territory,'Open') and a.Country=@Country
                end
        set nocount off
调用程序如下,这时候就要请出ADODB.Command对象了:
Sub CallmyProc()
    Dim conn As ADODB.Connection
    Dim MyProc As ADODB.Command
   
    Dim sSql As String
    Dim SrcArr

    Set conn = New ADODB.Connection
    Set MyProc = New ADODB.Command
    conn.ConnectionString = connStr(1)
    conn.Open
   
    If conn.State = adStateOpen Then
        With MyProc
            .ActiveConnection = conn
            .Prepared = True
            .CommandText = "Max_2ExcelDB"
            .CommandType = adCmdStoredProc
            .Parameters.Append .CreateParameter("@Territory", adChar, adParamInput, 10, "South")
            .Parameters.Append .CreateParameter("@Country", adChar, adParamInput, 10, "CN")
            ThisWorkbook.Sheets("sheet4").Cells(1, 1).CopyFromRecordset .Execute
        End With
    Else
        MsgBox " 无法打开数据库"
    End If

    conn.Close
    Set conn = Nothing
    Set MyProc = Nothing
End Sub

4,更麻烦的是带有多参数,还有返回参数的,也是用Adodb.command对象解决。下面代码来自网络http://www.officefans.net/cdb/viewthread.php?tid=91224
Set 连接 = CreateObject("ADODB.Connection")
Set 过程 = CreateObject("ADODB.Command")
连接.Open "Driver={SQL Server};Server=192.168.1.2;Database=数据库名_A;uid=共用登录;pwd=123456"
起始日期="2007-12-1"
截止日期="2008-3-1"
With 过程
.ActiveConnection = 连接
.Prepared = True
.CommandText = "vba_分数统计"
.CommandType = 4
.Parameters.Append .CreateParameter("@起始日期", 200, 1, 20, 起始日期)  ‘append 与后面的点. 需要加空格,即将createparameter返回值传给append方法。
.Parameters.Append .CreateParameter("@截止日期", 200, 1, 20, 截止日期)
.Parameters.Append .CreateParameter("@姓名", 200, 1, 50, Worksheets(2).Cells(2, 1).Value)
.Parameters.Append .CreateParameter("@返回分数", 2, 2)
.Execute
Worksheets(1).Cells(1,1).Value = .Parameters("@返回分数")
.Close
Set 连接 = Nothing
end with

评分

3

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-1-9 23:41 | 显示全部楼层
上面的例子中为参数赋值采取的是追加参数法,即用createparameter及append方法;
还可以更简单一些的直接赋值,如例3中:
            .Parameters(1).Value = "North"
            .Parameters(2).Value = "CN"

TA的精华主题

TA的得分主题

发表于 2015-1-10 10:02 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-2-3 16:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习!!!!

TA的精华主题

TA的得分主题

发表于 2015-2-10 17:44 | 显示全部楼层
后台通过用过程写存储过程时,出现'这种对象不支持该操作的'的错误,求助,该怎么解决

查詢.rar

17.87 KB, 下载次数: 61

TA的精华主题

TA的得分主题

发表于 2016-4-15 16:45 | 显示全部楼层
请问:调用ORACLE存储过程时,如上述几类情况,其语句有何差异呢?谢谢

TA的精华主题

TA的得分主题

发表于 2016-4-22 08:54 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习!!!!

TA的精华主题

TA的得分主题

发表于 2018-1-1 10:55 | 显示全部楼层
你好,看了你的VBA连接MS SQL存储过程的文章。
想请你收费帮助  使用VBA连接存储过程,请帮助。
但是因为没有权限,所以无法与你联系
请联系我,Q:2850145987

TA的精华主题

TA的得分主题

发表于 2018-6-10 07:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-7-31 18:30 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-23 16:05 , Processed in 0.035632 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表