2015-05-03 3 views
0

Я пытаюсь обновить старый лист excel, который использует QueryTables для подключения к Microsoft SQL Server.Как превратить соединение QueryTable в соединение ADODB?

работает следующим образом:

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 становится все, но я получаю следующее сообщение об ошибке:

Run-time error '-2147467259 (80004005)': [DBNETLIB][ConnectionOpen (Invalid Instance()).]Invalid connection.

со следующим кодом:

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];" 

И я получаю следующее сообщение об ошибке:

Run-time error '-2147467259 (80004005)': [Microsoft][ODBC SQL Server Driver][DBNETLIB]Invalid connection.

Ошибки всегда возникают на SqlConn.Open.

Как получить соединение, установленное с помощью QueryTable, которое должно быть установлено как ADODB.Connection объект?

ответ

1

Эта ошибка завершится неудачей, потому что вы добавляете дополнительный текст после параметра «Доверенное_соединение». При использовании доверительного соединения, вам не нужно имя пользователя или пароль, и синтаксис отличается для SQLOLEDB чем с {} SQLServer (она должна быть Integrated Security=SSPI;.

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

Кроме того, необходимо создать источник данных и Initial Catalog в строку вместо Data Source=[SeverName] и Initial Catalog=[DBName]

Это один потерпит неудачу, потому что вы не используете параметры безопасности:.

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

Это один терпит неудачу, потому что по той же причине, что и первый , Вам нужно создать фактические параметры в строке подключения.

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 

Обратите внимание, что сервер и параметр DB не может быть необязательным. Они действительно необходимы и должны быть действительными для подключения. Вы также можете пропустить нулевые и пустые проверки для необязательных параметров строки, если вы не делаете что-то действительно странное. Они будут по умолчанию vbNullString, если ничего не передано.

+0

Я думаю, что «UserId» и «Password» должны быть «UID» и «PWD» соответственно. Я продолжаю получать: «Ошибка времени выполнения» -2147467259 (80004005) »: [DBNETLIB] [ConnectionOpen (Invalid Instance()).] Недействительное соединение." Мне нравится vbnullstring намного лучше. Моя студия Microsoft SQL Server Management подключается через проверки подлинности Windows, поэтому я пытаюсь сделать доверенное соединение. Древняя функциональная линия кода была сделана до того, как это произошло. – neogeek23

+0

@ neogeek23 - 'Uid' и' Pwd' являются только параметрами, если вы используете '{SQL Server}'. 'UserId' и' Password' являются параметрами, если вы используете 'SQLOLEDB'. – Comintern

+0

С этими параметрами я получаю сообщение об ошибке «Invalid connection string attribute», тогда как с UID и PWD я этого не делаю? Может, я где-то использую что-то не так? – neogeek23

Смежные вопросы