Свойство ADODB Connection.ConnectionString не возвращает имя сервера

Я использую библиотеку ActiveX Data Objects 6.1 в Excel VBA для доступа к базе данных SQL Server 2012. Я могу нормально подключаться и выполнять запросы, но после подключения, похоже, невозможно определить, к какому серверу подключен объект connection, поскольку свойство connectionString не возвращает ту же строку, которая использовалась для открытия соединения:

Public Sub connectDB()
        Dim conn As New Connection
        Dim strServer As String, strDatabase As String, strUser As String, strPassword As String
        strServer = "****": strDatabase = "****": strUser = "****": strPassword = "****"

        conn.ConnectionString = "Driver={SQL Server};Server=" & strServer & ";Database=" & strDatabase & ";UID=" & strUser & ";PWD=" & strPassword
        Debug.Print conn.ConnectionString
        conn.Open
        Debug.Print conn.ConnectionString
End Sub

Выходы:

Driver={SQL Server};Server=****;Database=****;UID=****;PWD=****

Provider=MSDASQL.1;

Другими словами, как только соединение открыто, свойство connectionString сбрасывается на что-то бесполезное. Connection.DefaultDatabase возвращает базу данных, но нет способа определить сервер по объекту connection.

Если у меня есть код, которому передается объект подключения во время выполнения, было бы неплохо иметь возможность видеть, к какому серверу он подключен, без необходимости выполнять sys.dm_exec_connections (что кажется пустой тратой ресурсов, и вам нужны довольно высокие разрешения для его запуска) . Есть ли способ?


person aucuparia    schedule 11.08.2015    source источник
comment
1. Зачем нужно читать имя сервера после подключения? 2. Почему бы вам не использовать глобальные переменные для сохранения сервера, чтобы вы могли читать его каждый раз, когда вам это нужно   -  person EngJon    schedule 11.08.2015
comment
Да, есть обходные пути. Но если мой код получает объект connection из другого кода, который мне иначе не нужно изменять, было бы лучше просто получить строку подключения или сервер из подключения.   -  person aucuparia    schedule 11.08.2015
comment
Существует свойство, которое отключает удаление данных из строки подключения. Однако, если вы планируете читать из другого кода, в этом коде свойство также должно быть установлено на true.   -  person EngJon    schedule 11.08.2015
comment
Можете ли вы опубликовать информацию об имуществе в ответе? Я не смог его найти (хотя в процессе поиска я нашел свойство имени сервера, так что спасибо за это!)   -  person aucuparia    schedule 11.08.2015


Ответы (1)


Имя сервера (вместе с большим количеством другой интересной информации, включая версию СУБД, поддерживаемые функции, специальные символы и т. д.) является одним из Connection. /windows/desktop/ms677577(v=vs.85).aspx" rel="nofollow">динамические свойства, доступ к которым осуществляется через коллекцию Properties:

connection.Properties("Server Name").Value

возвращает имя сервера. Для поставщика Microsoft OLE DB для драйверов ODBC (и, возможно, других) полная строка подключения также находится в свойстве «Расширенные свойства». Вы можете перечислить свойства, выполнив:

Dim prop As Property
For Each prop In conn.Properties
    Debug.Print prop.Name, prop.Value
Next prop

Какие именно свойства вы получаете для любого данного подключения, зависит от используемого вами провайдера — списки см. в MSDN.

person aucuparia    schedule 11.08.2015
comment
Всегда ли можно прочитать имя сервера через это свойство? Свойство, которое я имел в виду в комментарии выше, было Persist Security Info. Его также можно найти внутри conn.Properties. Похоже, что это предназначено только для строки подключения, поэтому имя сервера не будет затронуто. - person EngJon; 11.08.2015