Function 如何编写打开和关闭数据库连接的常用函数?

Function 如何编写打开和关闭数据库连接的常用函数?,function,vba,excel,Function,Vba,Excel,我是Excel VBA的初学者,非常感谢您的帮助 请告知我如何创建一个公用函数来打开和数据库连接,以及另一个函数来关闭它,以避免重复编码 这是我的密码。我被困在如何继续前进 Const connection_string As String = "Provider=SQLOLEDB.1;Password=XXX;Persist Security `Info=True;User ID=sa;Initial Catalog=TESTDB;Data Source=XXXX;

我是Excel VBA的初学者,非常感谢您的帮助

请告知我如何创建一个公用函数来打开和数据库连接,以及另一个函数来关闭它,以避免重复编码


这是我的密码。我被困在如何继续前进

Const connection_string As String = "Provider=SQLOLEDB.1;Password=XXX;Persist Security              `Info=True;User ID=sa;Initial Catalog=TESTDB;Data Source=XXXX;"

Sub DuplicateDBConnection()

'Declare variables
Set cn1 = New ADODB.Connection
Set cmd1 = New ADODB.Command
Set rs1 = New ADODB.Recordset

'Open Connection
cn1.ConnectionString = connection_string
cn1.Open

'Set and Excecute SQL Command
Set cmd1.ActiveConnection = cn1
cmd1.CommandText = "Select stock_code, name, sector_id from stock_master"
cmd1.CommandType = adCmdText
cmd1.Execute

'Open Recordset
Set rs1.ActiveConnection = cn1
rs1.Open cmd1

'Copy Data to Excel
ActiveSheet.Range("A1").CopyFromRecordset (rs1)

'Close Connection
rs1.Close
cn1.Close

'Throw Object
Set rs1 = Nothing
Set cn1 = Nothing

End Sub

我的愿望是编写通用函数,这样我就不需要一直编写代码来连接和关闭连接

Sub ConnectDB()
    'Codes to connect DB
End Sub

Sub CloseConnnection()
    'Codes to close connection
End Sub

Sub ExecuteCode()
    ConnectDB
    'Execute SQL command to manipulate data on excel and SQL database 
    CloseConnection
End Sub 

根据Kittoe的建议进行编辑,现在可以正常工作了。谢谢

  • 类别: A.创建了一个名为AdoDbHelper的类,私有实例 B在AdoDbHelper中,将“选项比较数据库”更改为“选项比较文本”

  • 模块: 创建这样一个函数

  • 代码如下:

    Const connection_string As String = "Provider=SQLOLEDB.1;Password=XXX;Persist Security              `Info=True;User ID=sa;Initial Catalog=TESTDB;Data Source=XXXX;"
    
    Sub Test()
    
    Dim sourceDb As New AdoDbHelper
    Dim sourceRs As New ADODB.Recordset
    
    sourceDb.Connect (connection_string)
    
    Set sourceRs = sourceDb.OpenRecordset("Select stock_code, name, sector_id from     stock_master")
    
    With sourceRs
        'Do stuff!
    
         ActiveSheet.Range("A1").CopyFromRecordset sourceRs
    
        .Close
    End With
    
    sourceDb.Disconnect
    
    Set sourceRs = Nothing
    Set sourceDb = Nothing
    
    End Sub
    

    使用Microsoft ActiveX数据对象库x.x:

    在VBA窗口中,转到工具>引用>Microsoft ActiveX数据对象库x.x

    我通常使用2.7实现向下兼容性。现在,您可以创建ADODB对象来打开连接、执行查询(选择/更新/删除/…),并将查询结果(称为记录集)用于excel的其余部分、表格和特定单元格

    为了确保始终使用相同的连接,请创建一个公共连接对象,并在所有子例程中引用该对象。在每个子例程中,首先检查它是否已由(
    conn
    作为我的
    ADODB.Connection
    对象)设置:

    子例程Setup_连接类似于:

    Private Sub Setup_Connection
        Dim strConnection as String
    
        If conn = Nothing Then
            'Choose your own database connection details
            strConnection = "Provider=SQLOLEDB.1;Integrated Security=SSPI;" & _
                    "Persist Security Info=False;" & _
                    "Initial Catalog=DatabaseName;" & _
                    "Data Source=DATABASESERVER"
            Set conn = New ADODB.Connection
            With conn
                .Open strConnection
                .CommandTimeout = 30
            End With
        End If
    End Sub  
    

    这类事情最好在课堂上完成。右键单击“IDE”中的VBA项目,然后转到“插入->类模块”。给你的类命名一些有意义的东西,比如clsAdoHelper(如果你喜欢匈牙利符号)、adodhelper或其他东西。以下是您将放入此类中的代码示例:

    Option Compare Database
    Option Explicit
    
    Private WithEvents conn As ADODB.Connection
    Private WithEvents rs As ADODB.Recordset
    
    Public Sub Connect(ConnectionString As String)
        If Not conn Is Nothing Then
            Debug.Print "A connection is already open."
            Exit Sub
        End If
    
        If ConnectionString = CurrentProject.Connection.ConnectionString Then
            Set conn = CurrentProject.Connection
        Else
            Set conn = New ADODB.Connection
            conn.Open ConnectionString
        End If
    End Sub
    
    Public Sub Disconnect()
        If Not conn Is Nothing Then
            If conn.State <> 0 Then
                conn.Close
            End If
    
            Set conn = Nothing
        End If
    End Sub
    
    Public Sub Execute(SQL As String)
        If conn Is Nothing Then
            Debug.Print "No connection open."
            Exit Sub
        End If
    
        conn.Execute (SQL)
    End Sub
    
    Public Function OpenRecordset(SQL As String, Optional CursorLocation As ADODB.CursorLocationEnum = adUseClient, Optional CursorType As ADODB.CursorTypeEnum = adOpenForwardOnly, Optional LockType As ADODB.LockTypeEnum = adLockReadOnly) As ADODB.Recordset
        If conn Is Nothing Then
            Debug.Print "No connection open."
            Exit Function
        End If
    
        If Not rs Is Nothing Then
            Debug.Print "A recordset is already open."
            Exit Function
        End If
    
        Set rs = New ADODB.Recordset
    
        With rs
            .CursorLocation = CursorLocation
            .CursorType = CursorType
            .LockType = LockType
            .Open SQL, conn
        End With
    
        Set OpenRecordset = rs
    End Function
    
    Public Sub BeginTransaction()
        conn.BeginTrans
    End Sub
    
    Public Sub CommitTransaction()
        conn.CommitTrans
    End Sub
    
    Public Sub RollbackTransaction()
        conn.RollbackTrans
    End Sub
    
    Private Sub conn_BeginTransComplete(ByVal TransactionLevel As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
        Debug.Print "Transaction started."
    End Sub
    
    Private Sub conn_CommitTransComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
        Debug.Print "Transaction committed."
    End Sub
    
    Private Sub conn_ConnectComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
    
    End Sub
    
    Private Sub conn_Disconnect(adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
    
    End Sub
    
    Private Sub conn_ExecuteComplete(ByVal RecordsAffected As Long, ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pCommand As ADODB.Command, ByVal pRecordset As ADODB.Recordset, ByVal pConnection As ADODB.Connection)
        Debug.Print "SQL execution complete."
    End Sub
    
    Private Sub conn_RollbackTransComplete(ByVal pError As ADODB.Error, adStatus As ADODB.EventStatusEnum, ByVal pConnection As ADODB.Connection)
        Debug.Print "Transaction rolled back."
    End Sub
    
    选项比较数据库
    选项显式
    Private WithEvents连接为ADODB.Connection
    私有,事件作为ADODB.Recordset
    公共子连接(连接字符串为字符串)
    如果不是康涅狄格,那就什么都不是了
    Debug.Print“连接已打开。”
    出口接头
    如果结束
    如果ConnectionString=CurrentProject.Connection.ConnectionString,则
    Set conn=CurrentProject.Connection
    其他的
    Set conn=新的ADODB.连接
    连接开放连接字符串
    如果结束
    端接头
    公共子系统()
    如果不是康涅狄格,那就什么都不是了
    如果连接状态为0,则
    关闭连接
    如果结束
    设置连接=无
    如果结束
    端接头
    公共子执行(SQL作为字符串)
    如果康恩什么都不是
    调试。打印“未打开连接”
    出口接头
    如果结束
    连接执行(SQL)
    端接头
    作为ADODB.Recordset的公共函数OpenRecordset(SQL为字符串,可选游标位置为ADODB.CursorLocationEnum=ADOSClient,可选游标类型为ADODB.CursorTypeEnum=ADOPENFORADONLY,可选锁定类型为ADODB.LockTypeEnum=adLockReadOnly)
    如果康恩什么都不是
    调试。打印“未打开连接”
    退出功能
    如果结束
    如果不是的话,那么rs什么都不是
    Debug.Print“记录集已打开。”
    退出功能
    如果结束
    Set rs=New ADODB.Recordset
    用rs
    .CursorLocation=CursorLocation
    .CursorType=CursorType
    .LockType=LockType
    .打开SQL,康涅狄格州
    以
    Set OpenRecordset=rs
    端函数
    公共子部门管理()
    康涅狄格州
    端接头
    公共小组委员会交易()
    康涅狄格州委员会
    端接头
    公共子回滚事务()
    控制回滚传输
    端接头
    私有子连接开始完成(ByVal TransactionLevel为Long,ByVal Peror为ADODB.Error,adStatus为ADODB.EventStatusEnum,ByVal pConnection为ADODB.Connection)
    打印“事务已启动”
    端接头
    专用子连接提交传输完成(ByVal peror作为ADODB.Error,adStatus作为ADODB.EventStatusEnum,ByVal pcconnection作为ADODB.Connection)
    打印“事务已提交”
    端接头
    专用子连接完成(ByVal peror作为ADODB.Error,adStatus作为ADODB.EventStatusEnum,ByVal pcconnection作为ADODB.Connection)
    端接头
    专用子连接断开(adStatus作为ADODB.EventStatusEnum,ByVal pcconnection作为ADODB.Connection)
    端接头
    私有子连接执行完成(ByVal记录影响为Long,ByVal peror为ADODB.Error,adStatus为ADODB.EventStatusEnum,ByVal pCommand为ADODB.Command,ByVal预命令集为ADODB.Recordset,ByVal pcconnection为ADODB.Connection)
    打印“SQL执行完成”
    端接头
    专用子连接\u RollbackTransComplete(ByVal Peror作为ADODB.Error,adStatus作为ADODB.EventStatusEnum,ByVal pConnection作为ADODB.Connection)
    打印“事务回滚”
    端接头
    
    使用新类:

    Dim sourceDb As New AdoDbHelper
    Dim sourceRs as New ADODB.Recordset
    
    sourceDb.Connect (<insert connection string here>)
    
    Set sourceRs = sourceDb.OpenRecordSet(<insert SQL string here>)
    
    With sourceRs
        'Do stuff!
    
        .Close
    End With
    
    sourceDb.Disconnect
    
    Set sourceRs = Nothing
    Set sourceDb = Nothing
    
    Dim sourceDb作为新的AdoDbHelper
    作为新ADODB.Recordset的Dim源
    sourceDb.Connect()
    Set sourceRs=sourceDb.OpenRecordSet()
    使用源代码
    “做点什么!
    .结束
    以
    断开连接
    设置sourceRs=Nothing
    设置sourceDb=Nothing
    
    这并不是我写过的最好的代码,但它应该给你一个良好的开端。如果您在理解这个类是如何工作的方面有困难,我建议您对OOP和VBA中的类做一些研究。您会注意到,这里仍然有一些必要的biolerplate代码,但是大部分的正常工作已经在类方法中为您完成了。如果您想将数据操作逻辑放入它自己的函数中,您可以将使用类创建的ADODB.Recordset对象传递给它(这将用块替换


    我不建议用这样的逻辑污染类,因为您希望类处理所有可能的ADODB连接的通用连接/断开连接/异常处理。这样你就可以在其他项目中重复使用它了。

    你试过什么吗?您当前使用什么代码打开连接?是的,请查看我的示例代码(有效)和伪代码。谢谢!谢谢你
    Dim sourceDb As New AdoDbHelper
    Dim sourceRs as New ADODB.Recordset
    
    sourceDb.Connect (<insert connection string here>)
    
    Set sourceRs = sourceDb.OpenRecordSet(<insert SQL string here>)
    
    With sourceRs
        'Do stuff!
    
        .Close
    End With
    
    sourceDb.Disconnect
    
    Set sourceRs = Nothing
    Set sourceDb = Nothing