Function 如何编写打开和关闭数据库连接的常用函数?
我是Excel VBA的初学者,非常感谢您的帮助 请告知我如何创建一个公用函数来打开和数据库连接,以及另一个函数来关闭它,以避免重复编码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;
这是我的密码。我被困在如何继续前进
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的建议进行编辑,现在可以正常工作了。谢谢
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