如何将QueryTable连接转换为ADODB连接?

我正在尝试更新使用QueryTables连接到Microsoft SQL Server的旧Excel表。

以下是工作:

With ActiveSheet.QueryTables.Add(Connection:= _ "ODBC;DSN=[dbname];UID=[name];PWD=[pass];APP=Microsoft Office 2003;WSID=[machine name];DATABASE=[dbname];AutoTranslate=No;QuotedId=No;AnsiNPW=No" _ , Destination:=Range("A20")) .CommandText = Array("[a valid query]") 

有一些更复杂的事情,我希望能够处理这个QueryTable获取的信息,但我不断收到以下错误:

运行时错误“-2147467259(80004005)”:[DBNETLIB] [ConnectionOpen(Invalid Instance())。]无效的连接。

用下面的代码:

 Private SqlConn As ADODB.Connection Private Sub InitiateSqlConn(Optional User As String, Optional Pass As String, Optional Server As String, Optional DB As String) If SqlConn Is Nothing Then Dim strConn As String Set SqlConn = New ADODB.Connection If IsNull(User) Or IsEmpty(User) Or User = "" Then User = "[user]" End If If IsNull(Pass) Or IsEmpty(Pass) Or Pass = "" Then Pass = "[pass]" End If If IsNull(Server) Or IsEmpty(Server) Or Server = "" Then Server = "[ServerName]" End If If IsNull(DB) Or IsEmpty(DB) Or DB = "" Then DB = "[DBName]" End If strConn = "Provider=SQLOLEDB;Data Source=" & Server & ";Initial Catalog=" & DB & ";" SqlConn.Open "Provider=SQLOLEDB;Data Source=[SeverName];Initial Catalog=[DBName];Trusted_connection=yes;", "[User]", "[Pass]" End If End Sub Public Sub QueryInto(QR As String, ByRef RS As ADODB.Recordset, Optional User As String, Optional Pass As String, Optional Server As String, Optional DB As String) InitiateSqlCon User, Pass, Server, DB RS.Open QR, SqlConn End Sub 

我也试过了:

  SqlConn.Open "Driver={SQL Server};Server=[SeverName];Database=[DBName];UID=[User];PWD=[Pass];" 

我得到以下错误:

运行时错误'-2147467259(80004005)':[Microsoft] [ODBC SQL Server驱动程序] [DBNETLIB]无效的连接。

在SqlConn.Open上总是出现错误。

如何将build立与QueryTable的连接build立为ADODB.Connection对象?

这个会失败,因为你在“Trusted_connection”参数之后附加了额外的文本。 如果使用可信连接,则不需要用户名或密码,SQLOLEDB的语法与{SQLServer}的语法不同(它应该是Integrated Security=SSPI;

 SqlConn.Open "Provider=SQLOLEDB;Data Source=[SeverName];Initial Catalog=[DBName];Trusted_connection=yes;", "[User]", "[Pass]" 

您还需要将数据源和初始目录构build到string中,而不是Data Source=[SeverName]Initial Catalog=[DBName]

这一个会失败,因为你没有使用任何安全参数:

 strConn = "Provider=SQLOLEDB;Data Source=" & Server & ";Initial Catalog=" & DB & ";" 

这个失败的原因与第一个相同。 您需要将实际参数构build到连接string中。

 SqlConn.Open "Driver={SQL Server};Server=[SeverName];Database=[DBName];UID=[User];PWD=[Pass];" 

它应该看起来更像这样:

 Private Sub InitiateSqlConn(Optional User As String, Optional Pass As String) If SqlConn Is Nothing Then Dim strConn As String Dim Server As String Dim DB As String 'These can't be optional. They are required. Server = "TheActualNameOfTheServerHere" DB = "TheActualNameOfTheDatabaseHere" Set SqlConn = New ADODB.Connection If User = vbNullString Or Pass = vbNullString Then 'No credentials. Try a trusted connection. strConn = "Provider=SQLOLEDB;Data Source=" & Server & _ ";Initial Catalog=" & DB & ";Integrated Security=SSPI;" Else 'Credentials. strConn = "Provider=SQLOLEDB;Data Source=" & Server & _ ";Initial Catalog=" & DB & ";User Id=" & User & _ "; Password=" & Pass & ";" End If SqlConn.Open strConn End If End Sub 

请注意,服务器和数据库参数不能是可选的。 他们实际上是必需的,并且必须有效才能连接。 你也可以跳过对可选string参数的空和空的检查,除非你真的很奇怪。 如果没有传递,他们将默认为vbNullString。