Получить/создать набор записей из данных SQL Server в Excel vba

Я хочу получить доступ/получить/создать набор записей с SQL Server в Excel vba.

Я пробовал следующие методы, но они возвращают ошибку.

Код 1:

Dim conn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim sConnString As String

sConnString = "Provider=sqloledb; Server=192.168.0.204; Database=REPORTdb2"
Set Conn = New ADODB.Connection
Set rs = New ADODB.Recordset
conn.Open sConnString 
Set rs = conn.Execute("select * from Table1;")

в строке conn.Open sConnString возникает ошибка:

Неверная спецификация авторизации

Код2:

sConnString = "Provider=SQLOLEDB;Data Source=192.168.0.204;" & _
              "Initial Catalog=ReportDB2;" & _
              "Integrated Security=SSPI;"
Set conn = New ADODB.Connection
Set rs = New ADODB.Recordset

conn.Open sConnString 
Set rs = conn.Execute("SELECT * FROM Table1;")

Выдает ошибку

Не удается сгенерировать контекст SSPI


person curious K    schedule 14.03.2016    source источник
comment
Вы пытались подключиться к серверу с помощью SSMS, чтобы проверить IP-адрес и убедиться, что вашей учетной записи Windows разрешено подключаться к серверу? Кстати, я уверен, что вы установили ссылку в VBE на Microsoft ActiveX Data Objects 2.8 or above?   -  person Ralph    schedule 14.03.2016
comment
извините, я новичок в VBA, но я могу получить доступ, используя опцию создания соединения из Excel. Данные --> из другого источника --> с сервера Sql. Там я использую только IP-адрес. И теперь он может получить отличный доступ. Я хочу получить доступ к данным без установки файла подключения, т.е. непосредственного кодирования из модуля. И исх. это коррекция, т.е. 2,8   -  person curious K    schedule 14.03.2016
comment
Если приведенное ниже решение решило вашу проблему, закройте этот вопрос следующим образом: stackoverflow.com/tour В противном случае сообщите мне, что не так.   -  person Ralph    schedule 15.03.2016


Ответы (1)


Следующий код требует в VBE ссылку на Microsoft Active Data Objects 2.8 Library или выше:

Public Sub AdoTestConnection()
Dim conServer As ADODB.Connection
Dim rstResult As ADODB.Recordset
Dim strDatabase As String
Dim strServer As String
Dim strSQL As String

Set conServer = New ADODB.Connection
conServer.ConnectionString = "PROVIDER=SQLOLEDB; " _
    & "DATA SOURCE=192.168.0.204; " _
    & "INITIAL CATALOG=REPORTdb2; " _
    & "User ID=sa;" _
    & "Password="
On Error GoTo SQL_ConnectionError
conServer.Open
On Error GoTo 0

Set rstResult = New ADODB.Recordset
strSQL = "set nocount on; "
strSQL = strSQL & "select * from Table1;"
rstResult.ActiveConnection = conServer
On Error GoTo SQL_StatementError
rstResult.Open strSQL
On Error GoTo 0

'To copy the result to a sheet you may use the following code
'It will copy your table 'Table1' to the first sheet in your Excel file.
ThisWorkbook.Sheets(1).Range("A1").CopyFromRecordset rstResult

Exit Sub

SQL_ConnectionError:
MsgBox "Problems connecting to the server." & Chr(10) & "Aborting..."
Exit Sub

SQL_StatementError:
MsgBox "Connection established. Yet, there is a problem with the SQL syntax." & Chr(10) & "Aborting..."
Exit Sub

End Sub

С включенной обработкой ошибок для

  1. установить соединение с SQL-сервером и
  2. попытка передать команду T-SQL на сервер для обработки

вы сможете легко решить проблему с подключением к серверу. Приведенный выше код вернет только 1 в случае успеха (для тестового запуска). После этого вы можете заменить команду SQL на команду из приведенного выше примера.

person Ralph    schedule 14.03.2016
comment
Появляется сообщение: Проблемы с подключением к серверу. Прерывание... Вы можете видеть в моем Code2, что это дает ошибку для контекста SSPI - person curious K; 14.03.2016
comment
Вы установили ссылку на Microsoft Active Data Objects 2.8 Library в VBE, как указано в решении? Кроме того, попробуйте изменить INITIAL CATALOG=REPORTdb2; в приведенном выше примере на INITIAL CATALOG=master;. - person Ralph; 14.03.2016
comment
Да, я уже отметил для библиотеки 2.8 и имя каталога правильное REPORTDB2 - person curious K; 14.03.2016
comment
Когда вы можете подключиться к серверу с помощью Data-->from other source-->From Sql Server, вы выбираете Use Windows Authentication или используете Use the following User Name and Password? SSPI означает, что он использует аутентификацию Windows (первый вариант). Если вы вводите имя пользователя и пароль, код VBA необходимо изменить. - person Ralph; 14.03.2016
comment
Ой! из варианта я использую имя пользователя как sa, а пароль пуст - person curious K; 14.03.2016
comment
можете ли вы исправить этот код или помочь мне получить доступ к базе данных моего сервера и получить данные таблицы с именем сервера: 192.168.0.204 имя базы данных: reportdb2 и имя таблицы: имя пользователя Table1: пароль sa пуст - person curious K; 14.03.2016
comment
здесь вы упоминаете, что SSPI означает, что он использует аутентификацию Windows (первый вариант). Если вы вводите имя пользователя и пароль, код VBA необходимо изменить. Итак, что изменить, если я хочу получить доступ к имени пользователя как sa без пароля. - person curious K; 14.03.2016
comment
IP-адрес уже есть в приведенном выше коде (как видите). Кроме того, база данных уже находится в приведенном выше коде. Теперь я также изменил имя пользователя и пароль для вас. Я очень надеюсь, что это устранит все препятствия, и вы сможете запускать код без проблем. - person Ralph; 14.03.2016
comment
Да, первая ошибка удалена. Он подключается к серверу, но не заполняет записи из таблицы. даже я проверяю с помощью MsgBox rstResult.RecordCount, он показывает -1, а для сообщения об ошибке следующего оператора находится индекс вне диапазона. - person curious K; 18.03.2016
comment
Рад, что вопрос с подключением к серверу решен и исправлен. Для дальнейших вопросов, пожалуйста, откройте новый вопрос и закройте этот как решенный. Эти вопросы и ответы уже слишком велики, чтобы добавить к ним. Но вы можете добавить сюда ссылку на новый вопрос, и я обязательно помогу вам и в этом. - person Ralph; 18.03.2016