- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
编辑:发现新错误?
我可能刚刚发现为什么我的脚本不再工作了。最近有一个 Office 更新,似乎他们已经实现了 microsoft 查询,它摆脱了我根据需要安装和配置的 ODBC 管理器。现在实际的问题可能是这个微软查询没有 UNICODE 库,并且我不知道可以将它们放在哪里以便微软查询可以读取/获取它们。或者更确切地说,我不知道如何为微软查询提供 UNICODE 库的路径,因为在管理器中无法更改它,或者也许有,但我只是没有找到它?除此之外,我无法打开 Microsoft 查询管理器,除非直接从 Excel 工作簿中打开它。
原始问题
这段代码工作了一段时间。现在使用完全相同的代码我收到运行时错误。 Here我已经在这种情况下寻求帮助并让它发挥作用。
代码如下:
Sub ConnectSQL()
Dim connstring As String
Dim sLogin As String
Dim qt As QueryTable
sLogin = "Uid=*;Pwd=*;"
sqlstringFirma = "select * from gi_kunden.tbl_Firma"
sqlstringPerson = "select * from gi_kunden.tbl_Person"
connstring = "ODBC;DSN=KundeDB;" & sLogin
ActiveWorkbook.Sheets("Firma").Select
ActiveSheet.Range("A1:T2000").Clear
For Each qt In ActiveSheet.QueryTables
qt.Delete
Next qt
With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstringFirma)
.BackgroundQuery = False
.RefreshStyle = xlOverwriteCells
.Refresh '"General ODBC error" hereeee
End With
ActiveWorkbook.Sheets("Person").Select
ActiveSheet.Range("A1:T2000").Clear
For Each qt In ActiveSheet.QueryTables
qt.Delete
Next qt
With ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstringPerson)
.BackgroundQuery = False
.RefreshStyle = xlOverwriteCells
.Refresh 'And hereee again
End With
Call Replace
ActiveWorkbook.Sheets("Firma").Select
End Sub
我确实在这里使用了 .Select 两次,我知道我应该更改它。
我在 Mac 上使用 Excel 2011,因此请注意,并非 Windows 上适用的所有内容都适用。
* 编辑*
首先:即使我激活了所有对象库,这仍然不起作用。
其次,当我打开对象浏览器时,我刚刚意识到一些事情:
“ODBCConnection”是声明的类(“Excel 的类 ODBCConnection 成员”)。但是当我在对象浏览器中单击 Excel 时,找不到“ODBCConnection”。如果我输入代码“Excel.ODBCConnection.Refresh”,它会抛出错误“找不到方法或数据成员”,仅突出显示“ODBCConnection”一词。当我仅使用 ODBCConnection.Refresh(根据对象浏览器,刷新是 ODBCConnection 的一种方法)时,会显示相同的错误。
我对“QueryTable(1).Refresh”有完全相同的问题,它抛出错误:“变量未定义”,即使它在对象浏览器中列出并声明(“Class QueryTable Member of Excel”)。
我相信与此相关的所有事情都会出现此类错误。
编辑
这会在 ActiveWorkbook.RefreshAll 行上引发相同的“常规 ODBC 错误”:
Dim strConn As String
Dim strLoginData As String
Dim QT As QueryTable
Dim strFirmSQL As String
Dim strPersSQL As String
strConn = "ODBC;DSN=KundeDB;" & strLoginData
strLoginData = "Uid=*myUid*;Pwd=*myPwd*"
strFirmSQL = "Select * From gi_kunden.tbl_firma"
strPersSQL = "Select * From gi_kunden.tbl_person"
Dim WSFirm As Worksheet
Set WSFirm = ActiveWorkbook.Sheets("Firma")
WSFirm.Range("A1:T1000").Clear
For Each QT In WSFirm.QueryTables
QT.Delete
Next QT
With WSFirm.QueryTables.Add(strConn, WSFirm.Range("A1"), strFirmSQL)
.SaveData = True
.BackgroundQuery = True
'.Refresh
End With
Dim WSPers As Worksheet
Set WSPers = ActiveWorkbook.Sheets("Person")
For Each QT In WSPers.QueryTables
QT.Delete
Next QT
With WSPers.QueryTables.Add(strConn, WSPers.Range("A1"), strPersSQL)
.SaveData = True
.BackgroundQuery = True
'.Refresh
End With
ActiveWorkbook.RefreshAll 'FAILS here
Call Replace
WSFirm.Activate
最佳答案
我无法解决你的问题,但我可以帮你调试。
第一个问题是:该错误消息是什么意思?它是否告诉您对数据运行的查询或命令有错误,或者有什么原因阻止您连接到数据库?
实际上可以编写信息丰富的错误消息,并且雷德蒙德实现查询表的任何被误导的天才都选择不传递数据库服务器和连接库发出的详细错误信息。
幸运的是,我们自己做了一些工作。
QueryTable 对象有一个连接属性 - 它是一个字符串,不是一个功能齐全的连接对象,但您可以更详细地检查它并针对 ADODB 连接对象进行测试。尝试使用此函数来测试连接字符串,看看是否有任何有用的信息:
Public Sub ConnectionTest(ConnectionString As String)<br/>
' Late-binding: requires less effort, but he correct aproach is
' to create a reference to 'Microsoft ActiveX Data Objects' -<br/>
'Dim conADO As ADODB.Connection
'Set conADO = New ADODB.Connection<br/>Dim conADO As Object
Set conADO = CreateObject("ADODB.Connection")<br/>
Dim i As Integer<br/>
conADO.ConnectionTimeout = 30
conADO.ConnectionString = ConnectionString<br/>
On Error Resume Next<br/>
conADO.Open<br/>
If conADO.State = 1 Then
Debug.Print "Connection string is valid"
Else
Debug.Print "Connection failed:"<br/><br/>
For i = 0 To conADO.Errors.Count
With conADO.Errors(i)
Debug.Print "ADODB connection returned error " & .Number & " (native error '" & .NativeError & "') from '" & .Source & "': " & .Description
End With
Next i<br/><br/>
End If<br/>
Debug.Print "Connection String: "
Debug.Print vbTab & Replace(.Connection, ";", ";" & vbCrLf & vbTab)
Debug.Print<br/><br/>
Set conADO = Nothing<br/><br/>
End Sub
...并将其插入到您的代码中:
Dim objQueryTable As Excel.QueryTable
Dim strConnect as String<br/>
set objQueryTable = ActiveSheet.QueryTables.Add(Connection:=connstring, Destination:=Range("A1"), Sql:=sqlstringFirma)<br/>
With objQueryTable
strConnect = .Connection
.BackgroundQuery = False
.RefreshStyle = xlOverwriteCells
.Refresh ' "General ODBC error" hereeee
End With<br/>
ConnectionTest strConnect ' view the output in the debug window/immediate pane
如果您看到其中的错误,则可能只是我的 ADODB 连接实现在您的 Mac Office 环境中不起作用:但您完全有可能有以下任一情况:
如果连接正常,则可能是您在数据库中运行的查询或命令才是问题的根源 - 而且我在您的问题中看到的错误消息确实指向了这个方向 - 所以我们需要深入研究再深一点。
不幸的是,我无法知道我使用的工具是否适合您:这是开发人员的调试代码,您需要修改它才能使其工作。
之所以如此繁琐,是因为实现 QueryTable 的 Office 团队做出了一些有趣的决定:QueryTable 公开的“连接”和“记录集”属性不是功能齐全的对象 - 我认为它们是接口(interface)允许 QueryTable 使用来自各种不同提供者的称为“连接”和“记录集”的对象,并公开一组通用的属性和方法。对于跨平台可用性来说,这是一个很好的决定,但这意味着需要询问这些对象的开发人员不能依赖运行时存在的任何给定方法 - 因此这仅适用于“调试”模式下的反编译代码.
您还需要在 IDE 中注册 Microsoft DAO 和 ADO 引用:当您需要能够在“本地”窗口中查看这些对象时,使用“CreateObject”进行后期绑定(bind)是错误的工具:
Public Sub ConnectionDetails(objQueryTable As Excel.QueryTable)<br/>
Dim rstADO As ADODB.Recordset
Dim conADO As ADODB.Connection<br/>
Dim rstDAO As DAO.Recordset
Dim conDAO As DAO.Connection<br/>
Dim i As Integer<br/><br/>
Set objQueryTable = Sheet1.ListObjects(1).QueryTable<br/>
With objQueryTable<br/><br/>
Debug.Print "Connection String: "
Debug.Print vbTab & Replace(.Connection, ";", ";" & vbCrLf & vbTab)
Debug.Print<br/><br/>
Debug.Print "Query Type: " & .QueryType ' Documented here: <a href="https://msdn.microsoft.com/en-us/library/office/ff835313.aspx" rel="noreferrer noopener nofollow">https://msdn.microsoft.com/en-us/library/office/ff835313.aspx</a>
Debug.Print "Query: " & .CommandText
Debug.Print "Database request type: " & .CommandType ' XlCmdType documented here: <a href="https://msdn.microsoft.com/en-us/library/office/ff197456.aspx" rel="noreferrer noopener nofollow">https://msdn.microsoft.com/en-us/library/office/ff197456.aspx</a><br/><br/>
.MaintainConnection = True<br/>
On Error Resume Next
If TypeOf .Recordset Is DAO.Recordset Then<br/><br/>
On Error Resume Next
Set rstDAO = .Recordset<br/><br/>
rstDAO.OpenRecordset
For i = 0 To DAO.Errors.Count
With DAO.Errors(i)
Debug.Print "DAO Recordset '" & Left(rstDAO.Name, 24) & "' returned error " & .Number & " from '" & .Source & "': " & .Description
End With
Next i<br/><br/>
Set conADO = DAO.DBEngine.OpenConnection(.Connection)
For i = 0 To DAO.Errors.Count
With DAO.Errors(i)
Debug.Print "DAO Connection '" & Left(conDAO.Name, 24) & "' returned error " & .Number & " from '" & .Source & "': " & .Description
End With
Next i<br/><br/>
ElseIf TypeOf .Recordset Is ADODB.Recordset Then<br/><br/>
On Error Resume Next
Set rstADO = .Recordset<br/><br/>
If rstADO.State <> 0 Then rstADO.Close
rstADO.Open
Set conADO = rstADO.ActiveConnection
For i = 0 To conADO.Errors.Count
With conADO.Errors(i)
Debug.Print "ADODB Recordset '" & Left(rstADO.Source, 24) & "' connection returned error " & .Number & " (native error '" & .NativeError & "') from '" & .Source & "': " & .Description
End With
Next i<br/>
ElseIf Err.Number <> 0 Then<br/><br/>
Debug.Print Err.Source & " Error " & Err.Number & ":" & Err.Description<br/><br/>
Else<br/><br/>
Debug.Print "recordset type is: '" & TypeName(.Recordset) & "': for further information, place a breakpoint in the code and use the 'Locals' window."<br/><br/>
End If<br/>
End With<br/>
End Sub<br/>
代码执行的操作(或尝试执行的操作)非常简单:它询问数据库并检索详细的错误消息。
他们可能会告诉您存在语法错误,或者 SQL 中缺少参数 - 如果数据库是 MS-Access,这可能会产生误导:“缺少参数”可能意味着字段名称或函数名称未知。这也可能意味着 you can't run that SQL outside an MS-Access user session 。
如果无法工作,请返回 ConnectionTest 代码并对 conADO 连接对象运行命令文本:conADO.执行strCommandText
...并再次询问错误集合。
这就是我可以用来解决这个问题的调试工具:希望另一个“Stacker”可以建议其他方法。
关于excel - 刷新 QueryTable 抛出 "General ODBC error"- VBA Excel 2011 for Mac,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35057385/
来自 java docs 公共(public) FileWriter(String fileName) 抛出 IOException 抛出: IOException - 如果指定的文件存在但它是目录而
我使用以下代码将我的 .net 客户端(基于 CQL)连接到 3 节点 Cassandra 集群。我以 30 条记录/秒的速度(从 RabbitMQ)获取数据,并且它们顺利地存储在 cassandra
如果在读取文件时缺少字段,我应该捕获 NoSuchElementException。如果缺少一个字段,我只需要跳到文件的下一行。我的问题是,我在哪里实现我的 try/catch 代码来做到这一点?这是
我正在尝试使用 ASP.NET MVC 实现 OpeinID 登录。我正在尝试按照 http://blog.nerdbank.net/2008/04/add-openid-login-support-
学习使用 Java 进行 xml 解析,并且正在编写一个测试程序来尝试各种东西。所有测试 System.out.println() 都是我在控制台中所期望的,除了 childElement 返回 [n
我正在尝试使用 SwingUtilities 创建 JFrame Thread tt = new Thread(new Runnable() { public void run
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 这个问题是由于错别字或无法再重现的问题引起的。虽然类似的问题可能是on-topi
我写了这段代码: MethodInfo method2 = typeof(IntPtr).GetMethod( "op_Explicit", Bind
我开始学习 Java,并且正在根据书本做一些练习。在执行此操作时,我遇到了以下错误:线程“main”java.util.InputMismatchException 中出现异常。我正在编写一个简单的程
我有一个文本文件,其中前两行是整数 m 和 n,然后有 m 行,每行都有 n 管道分隔值。我编写了一个程序,读取文件并使用文件中的值创建 m*n 数组,它工作了无数次,然后突然,使用相同的代码,使用相
所以我尝试使用在另一个类中生成的 bean 以在主应用程序中使用 package com.simon.spring.basics.properties; import org.spri
我还没有完成这个应用程序,但我希望在我的手机上看到它的样子。但是,它会强制关闭并引发 InstantiationException。 logcat 异常: 09-19 20:13:47.987: D/
我想从 UIViewController 加载一个基于 SwiftUI 的 View ,该 View 读取包本地的 json。仅 swiftUI 项目中的代码和绑定(bind)工作正常,当我利用 UI
'java.net.SocketTimeoutException:连接超时' 循环一段时间后我收到此错误。为什么我会收到 SocketTimeoutException?我该如何修复这个错误? @Ove
当有 null 值时抛出 ArgumentNullException() 是个好主意吗? This thread 没有提到在 null 上抛出的最明显的异常。 谢谢 最佳答案 ArgumentNull
我得到这个异常: NullReferenceException Object reference not set to an instance of an object at Namespace
所以其中一个方法的描述如下: public BasicLinkedList addToFront(T data) This operation is invalid for a sorted list
我正在使用 Intellij Idea,当我去生成 JavaDocs(通过工具 -> 生成 JavaDoc)时,我抛出了一个 IllegealArgumentException,没有关于发生了什么问题
我正在学习 C++ 中的互斥锁,但以下代码(摘自 N. Josuttis 的“C++ 标准库”)有问题。 我不明白为什么它会阻塞/抛出除非我在主线程中添加this_thread::sleep_for(
我正在试验 JavaFX 标签和组,通过鼠标拖动将它们移动到屏幕上。新节点从一些线程添加到动画组。但是,有时我会突然看到以下异常 - 我假设,当某些节点重叠时。但是不知道是什么问题……因为不涉及我的代
我是一名优秀的程序员,十分优秀!