sql - 插入/更新/删除语句后 ADODb 连接刷新(Excel/Access 联动)
问题描述
我制作了一个 Excel 界面来与 Access 数据库进行交互。目标是多人可以在只读模式下打开 Excel 界面,但仍使用 ActiveX 控件同时对数据库进行操作。
我有 3 个按钮显示 3 个用户窗体:一个用于“插入条目”,一个用于“删除条目”,一个用于“修改条目”。在这些用户表单中,我们可以分别输入新条目的值,然后通过 VBA 代码检查其有效性、确认删除一行或修改用户在表格显示上选择的条目的值。数据输入+确认后,与Access db建立ADO连接,执行sql查询。
例如,这里是“删除”用户窗体的代码,其他的都建立在相同的模型上。
Private Sub CommandButton1_Click()
Dim lineArr() As Variant
lineArr = returnSelectedLine
Call doSqlInsert(CStr(lineArr(1)))
Unload Me
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Private Sub UserForm_Terminate()
Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
End Sub
Private Sub UserForm_Activate()
Dim lineArr() As Variant
lineArr = returnSelectedLine
Me.Label8.Caption = "Are you sure you want to delete the article number " & lineArr(1) & " ? This action is irreversible."
End Sub
Sub doSqlInsert(art As String)
Dim cn As Object
Dim strFile As String
Dim strCon As String
Dim quer As String
strFile = ThisWorkbook.Path + "\etwDb.accdb"
strCon = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & strFile
Set cn = CreateObject("ADODB.Connection")
cn.Open strCon
quer = "DELETE FROM Dvpt WHERE [Article] = " & art & ";"
cn.Execute quer
cn.Close
Set cn = Nothing
End Sub
Function returnSelectedLine()
Dim rw As Integer
Dim res(0 To 7) As Variant
Dim i As Integer
rw = ActiveCell.Row
With ThisWorkbook.Worksheets("Liste dvpt")
For i = 0 To 7
res(i) = .Cells(rw, i + 2)
Next i
End With
returnSelectedLine = res
End Function
这运作良好,并正确影响数据库上的数据。但是,此数据库也使用 QueryTable 对象(连接处于读取模式)显示在 Excel 文件中,我尝试在每个用户窗体终止时刷新该对象(请参阅 参考资料Private Sub UserForm_Terminate
),但这并不能始终如一地工作。有时,我需要再做一两个动作(或再刷新一两次)才能显示更改,有时它会立即出现。
指示:工作表被编程,因此只能选择一个唯一的单元格,并且只能在 QueryTable 区域中选择。如果用户尝试在表格之外选择某些内容,则选择会返回到表格,因此我可以Selection.ListObject.QueryTable.Refresh
毫无歧义地使用。
ADO 连接是否有执行时间?我是否以错误的方式刷新了我的 QueryTable?是什么导致了这种延迟?
谢谢你的帮助
解决方案
不是答案,而是一个想法,太大而无法评论。您可以使用连接的事件,因此创建一个类 clsCustomConnection。像这样
Private WithEvents cn As ADODB.Connection
Public Sub Initialise(strConnectionString As String)
Set cn = New ADODB.Connection
cn.ConnectionString = strConnectionString
cn.Open
End Sub
Public Sub Execute(strSQL As String)
cn.Execute strSQL
End Sub
Private Sub cn_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)
' Refresh any query tables of interest, based on the Error/Status
End Sub
然后在一个模块中有这样的东西:
Sub Testing()
Dim cnCustom As clsCustomConnection
Dim strConnectionString As String
Dim strSQL As String
Set cnCustom = New clsCustomConnection
cnCustom.Initialise strConnectionString
cnCustom.Execute strSQL
End Sub
这将使用连接来告诉其余代码它的成功/失败,通过使用连接的事件。
推荐阅读
- autodesk-forge - 适用于 Navisworks 的 Autodesk 设计自动化 API
- r - 如何根据条形图中的用户输入过滤某些数据?
- python - 从python中的两个字典列表中合并具有相同键的字典
- django - 如何在 django 中使用外键字段进行排序并避免同一行的多个结果
- google-sheets-formula - 使用公式将天转换为周,然后是月,然后是年
- python - 在 A* 搜索中计算自定义成本函数
- python - MEXOR Codechef 十月挑战
- ruby-on-rails - 返回子类常量数组的不同元素
- java - org.springframework.http.converter.HttpMessageNotReadableException:缺少所需的请求正文 Spring boot 项目
- css - CSS卡片翻转效果——如何让它每次点击都向同一个方向翻转?