【发布时间】:2018-04-23 21:18:12
【问题描述】:
我正在尝试创建一个 VBA 脚本,该脚本将从 RecordSet.Source 属性的视图 (SELECT * FROM view_name) 中提取结果,但是在尝试时,我的 CloseConnection 错误处理程序不断被捕获。我可以使用像SELECT * FROM tbl_name 这样的简单查询从表中获取结果,没有任何问题。
下面是我正在使用的代码。注意:我的 Const 变量已删除 Provider 和 Database 信息。
我想这真的归结为是否有可能像从表中一样从视图中获取结果?
Option Explicit
Const ConStrMSSQL As String = _
"Provider=provider_name;Database=database_name;Trusted_Connection=yes;"
Sub test()
Dim formConnect As ADODB.connection
Dim formData As ADODB.recordSet
Dim formField As ADODB.Field
Set formConnect = New ADODB.connection
Set formData = New ADODB.recordSet
formConnect.ConnectionString = ConStrMSSQL
formConnect.Open
On Error GoTo CloseConnection
With formData
.ActiveConnection = formConnect
.Source = "SELECT * FROM v_data_extract_658"
.LockType = adLockReadOnly
.CursorType = adOpenForwardOnly
.Open
End With
On Error GoTo CloseRecordset
Sheets("test").Range("A1").Select
For Each formField In formData.Fields
ActiveCell.Value = formField.Name
ActiveCell.Offset(0, 1).Select
Next formField
Sheets("test").Range("A2").CopyFromRecordset formData
On Error GoTo 0
CloseRecordset:
formData.Close
CloseConnection:
formConnect.Close
End Sub
这是错误信息:
运行时错误 2147467259 (80004005):从 SQL Server 收到未知令牌
【问题讨论】:
-
在所有条件相同的情况下,查询视图应该看起来与查询表完全一样。注释掉错误处理程序:你得到的错误信息是什么?
-
我强烈建议您摆脱那些 ON ERROR GOTO。您需要了解错误。你所拥有的是一种我称之为 try/squelch 的反模式。优雅地处理错误并告诉用户发生了什么事。仅仅关闭窗口是一种“处理”错误的可怕方式。当程序刚刚关闭时,作为用户非常令人沮丧。
-
@SeanLange 你说得很好。请注意,这些错误处理程序不是最终产品;更多只是占位符。
-
是的,这应该可以正常工作。但请确保您有权访问视图中引用的所有对象。例如,视图可能会引用您无权访问的链接服务器资源。例如,我已经看到 DEV 中的查询构建在 STAGE/TEST 中的对象之上。
-
@TimWilliams 这是错误消息:运行时错误 2147467259 (80004005):从 SQL Server 收到未知令牌
标签: sql sql-server vba excel