ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助,vba中SQL语句能否多次重复执行!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2016-6-14 09:24 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
vba中SQL语句能否多次重复执行,条件语句带一个变量,每次只执行第一个,后面几个都查询不到数据。oracle数据库源.

TA的精华主题

TA的得分主题

发表于 2016-6-14 16:08 | 显示全部楼层
LZ你问的比较笼统,可能你的意思是,相让数据库返回,多组数据集,每组数据集都有一个独立的SQL语句,当然参数变量等都可能不一样,一般呢VBA用ADO对象和语法来解决,对于这类多记录集返回的,主要是有两种方式,用多个recordset对象来对应多个返回记录集,也就类似于,把你想要的多个SQL,分别运行一次,一次只运行一个查询的SQL,
第二种方式呢,用一句SQL,默认打开的是你的第一句SQL,然后你的recordset对象用NextRecordset方法,来切到你的下一个记录集,

建议你用第一种方式,

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-14 18:57 | 显示全部楼层
Renco 发表于 2016-6-14 16:08
LZ你问的比较笼统,可能你的意思是,相让数据库返回,多组数据集,每组数据集都有一个独立的SQL语句,当然 ...

谢谢老师!我上面的问题,我自己解决了!但是不知道我理解的是不是正确的!
下面是我之前的代码,每次只能更新最先遍历的那个工作表:
Private Sub 更新数据_Click()
    Dim Conn As Object, rs As Object
    Dim ws As Worksheet
    Dim gzbm As String
    Dim strConn As String
    Dim sql As String
    On Error Resume Next

    Set Conn = CreateObject("ADODB.connection")
    Set rs = CreateObject("ADODB.Recordset")
    strConn = "Provider=MSDAORA.1; user id="
    strConn = strConn & txt用户名.Value
    strConn = strConn & "; password=" & txt密码.Value
    strConn = strConn & "; data source = " & txt数据库.Value
    strConn = strConn & "; Persist Security Info=True"

    For Each ws In Worksheets
        If ws.Name <> "增加工作表" Then
            gzbm = ws.Name
            Conn.Open strConn
            sql = "SELECT RQ,SCSJ,FROM SD.DBA01 DBA01 WHERE (MZ='" & gzbm & "') ORDER BY RQ"
            rs.Open sql, Conn
            ThisWorkbook.Sheets(gzbm).[A3].CopyFromRecordset rs
            Conn.Quit
            Set Conn = Nothing
        End If
    Next
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-6-14 19:09 | 显示全部楼层
我的解决问题之后的代码在下面,也就是把Set Conn = CreateObject("ADODB.connection"),Set rs = CreateObject("ADODB.Recordset") 把这两句放在For Each……循环里面。我认为是这样,代码开始执行时候前面两句Set rs、Set Con执行了,当第一个SQL执行完后,Conn.Quit ,Set Conn = Nothing 这两句关闭了数据库,第二次循环执行的时候从FOR each……开始执行,没有执行Set rs、Set Con,相当于数据没有再次连接上。 不知道这么理解对不对!
   
Private Sub 更新数据_Click()
    Dim Conn As Object, rs As Object
    Dim ws As Worksheet
    Dim gzbm As String
    Dim strConn As String
    Dim sql As String
    On Error Resume Next
    strConn = "Provider=MSDAORA.1; user id="
    strConn = strConn & txt用户名.Value
    strConn = strConn & "; password=" & txt密码.Value
    strConn = strConn & "; data source = " & txt数据库.Value
    strConn = strConn & "; Persist Security Info=True"

    For Each ws In Worksheets
        If ws.Name <> "增加井号" Then
            gzbm = ws.Name
            Set Conn = CreateObject("ADODB.connection")
            Set rs = CreateObject("ADODB.Recordset")
            Conn.Open strConn
            sql = "SELECT RQ,SCSJ,FROM SD.DBA01 DBA01 WHERE (MZ='" & gzbm & "') ORDER BY RQ"
            rs.Open sql, Conn
            ThisWorkbook.Sheets(gzbm).[A3].CopyFromRecordset rs
            Conn.Quit
            Set Conn = Nothing
        End If
    Next
End Sub

TA的精华主题

TA的得分主题

发表于 2016-6-15 11:30 | 显示全部楼层
从资源和效率方面,应当把
Set Conn = CreateObject("ADODB.connection")
            Set rs = CreateObject("ADODB.Recordset")
Conn.Open
放在For..next 外面
从数据连接方面,我们是先连接到数据库源,再去打开我们需要的数据集,这循环中,原则上我们只要连接数据库源一次就行了,所以不必要在For 。。。next里如下进行个更改:

Private Sub 更新数据_Click()
    Dim Conn As Object, rs As Object
    Dim ws As Worksheet
    Dim gzbm As String
    Dim strConn As String
    Dim sql As String
    On Error Resume Next
    strConn = "Provider=MSDAORA.1; user id="
    strConn = strConn & txt用户名.Value
    strConn = strConn & "; password=" & txt密码.Value
    strConn = strConn & "; data source = " & txt数据库.Value
    strConn = strConn & "; Persist Security Info=True"
   
   Set Conn = CreateObject("ADODB.connection")
    Set rs = CreateObject("ADODB.Recordset")

   Conn.Open strConn

    For Each ws In Worksheets
        If ws.Name <> "增加井号" Then
            gzbm = ws.Name
           
            sql = "SELECT RQ,SCSJ,FROM SD.DBA01 DBA01 WHERE (MZ='" & gzbm & "') ORDER BY RQ"
            rs.Open sql, Conn
            ThisWorkbook.Sheets(gzbm).[A3].CopyFromRecordset rs
            rs.close   '记得用完了,要关闭
           
        End If
    Next

  Conn.close   'ADO的Connection,没有Quit的用法,而是用Close来关闭,后面用 Set 对象=Nothing 来释放资源

Set rs = Nothing
Set Conn = Nothing
End Sub

TA的精华主题

TA的得分主题

发表于 2018-7-27 21:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Renco 发表于 2016-6-15 11:30
从资源和效率方面,应当把
Set Conn = CreateObject("ADODB.connection")
            Set rs = CreateOb ...

您好!请教您一个问题,我使用ADO+SQL查询数据表,采用自连接方式,执行第一次SQL后,代码中有CNN.CLOSE和SET CNN=NOTHING语句,当修改数据源的数据后,再次执行SQL,得到的结果是修改前的数据,
请问有没有什么办法在不关闭工作簿的情况下,让再次执行SQL可以查询到最新数据。经测试,如果把工作簿关掉,再打开,执行SQL可以查询到前面修改的数据。

TA的精华主题

TA的得分主题

发表于 2018-7-27 21:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2022-12-21 11:19 | 显示全部楼层
左手转弯 发表于 2016-6-14 18:57
谢谢老师!我上面的问题,我自己解决了!但是不知道我理解的是不是正确的!
下面是我之前的代码,每次只 ...

传一下文件看看可以吗,感兴趣
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-3 20:54 , Processed in 0.037436 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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