Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Заблокирован

Подскажите строку ADODB для подключения к SQL Server с доверенным соединением

14.11.2012, 20:23. Показов 9151. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите строку ADODB для подключения к SQL Server с доверенным соединением. Не могу вспомнить.

Оригинал: http://support.microsoft.com/kb/910696

Добавлено через 42 минуты
Пример 1: Открыть дополнительные подключения при явно не закрыть объекты наборов записей
При запуске в следующем примере кода в Visual Basic 6.0 не требуется только одно подключение. Это верно, так как объект набора записей , созданный в процедуре ExecuteQuery неявно закрыт, когда попадает в объект набора записей из области действия. В примере кода используется переменная @@SPID SQL Server для представления идентификатор процесса сервера, который используется для выполнения запроса. Если запустить код, можно заметить, что запросы возвращают то же значение в столбце @@spid . Это значит, что запросы были запущены на одном подключении к базе данных.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Sub Main()
    Dim strConn As String
    Dim cn As ADODB.Connection
    
    strConn = "Provider=SQLOLEDB;Data Source=.;" & _
              "Initial Catalog=Northwind;Trusted_Connection=Yes;"
    
    Set cn = New ADODB.Connection
    cn.Open strConn
    
    cn.Properties("Multiple Connections").Value = False
    
    ExecuteQuery cn, "SELECT @@spid, * FROM Customers"
    ExecuteQuery cn, "SELECT @@spid, * FROM Customers"
End Sub
Visual Basic
1
2
3
4
5
Private Sub ExecuteQuery(cn As ADODB.Connection, strSQL As String)
    Dim rs As ADODB.Recordset
    Set rs = cn.Execute(strSQL)
    MsgBox rs(0)
End Sub
Если использовать подобный код в Visual Basic .NET, можно заметить, что второй объект набора записей содержит другое значение для столбца @@spid . Это значение означает, что запрос был выполнен другое подключение к базе данных.

Это поведение отличается, поскольку объект набора записей , созданный в процедуре ExecuteQuery не был закрыт и будет оставаться открытым, пока сборщик мусора .NET очищает объект набора записей . Сборка мусора в Microsoft платформа.NET Framework происходит асинхронно. Если объект набора записей не был закрыт по времени, процедура ExecuteQuery вызывается снова, SQL Server поставщик OLE DB будет открыть новое подключение для выполнения второго запроса.

Если добавить вызов rs.Закрыть команды в процедуре ExecuteQuery , убедитесь, что запросы выполняются на одном подключении. Можно также явно указать SQL Server поставщик OLE DB не используется для открытия дополнительных подключений. Для этого добавьте следующий код сразу после открытия подключения:

Visual Basic
1
cn.Properties("Multiple Connections").Value = False
Этот код вызывает SQL Server поставщик OLE DB для создания исключения, когда поставщик OLE DB в противном случае будет открыть дополнительные подключения.
Пример 2: Проблемы при работе с транзакциями, если явно не закрыть объекты наборов записей
Не удается открыть дополнительные подключения при заблокированных соединений участвует в транзакции. При запуске в следующем примере кода в Visual Basic 6.0 код выполняет несколько запросов для одного соединения с открытой операции. Код вызывает следующие две функции:

Метод GetCustomers
GetOrders

Каждая функция открывает объект набора записей .

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Public Sub Main()
    Dim cn As ADODB.Connection
    Set cn = New ADODB.Connection
    cn.Open "Provider=SQLOLEDB;Data Source=.;" & _
            "Initial Catalog=Northwind;Trusted_Connection=Yes;"
    
    cn.BeginTrans
    
    GetCustomers cn
    GetOrders cn
    
    cn.RollbackTrans
    cn.Close
End Sub
Visual Basic
1
2
3
4
Public Sub GetCustomers(Connection As ADODB.Connection)
    Dim rs As ADODB.Recordset
    Set rs = Connection.Execute("SELECT CustomerID, CompanyName FROM Customers")
End Sub
Visual Basic
1
2
3
4
Public Sub GetOrders(Connection As ADODB.Connection)
    Dim rs As ADODB.Recordset
    Set rs = Connection.Execute("SELECT OrderID, CustomerID FROM Orders")
End Sub
Объект набора записей , который создается путем вызова метода функция неявно закрывается в конце этого вызова функции в Visual Basic 6.0. Это поведение описывается в "Пример 1: открыть дополнительные подключения при явно не закрыть объекты наборов записей» раздел. Тем не менее этот объект набора записей не может быть закрыт по времени, код вызывает функцию GetOrders в Visual Basic .NET. Таким образом текущее подключение к SQL Server имеет открытые результирующий набор с информацией о клиентах. Из-за занятости текущего подключения получение результатов запроса в функции GetOrders требует новый неявно создается подключение. Тем не менее нельзя создать неявная связь до тех пор, пока транзакция открыта. Таким образом код не удастся, и вы получите следующее сообщение об ошибке:
Невозможно создать новое подключение, так как в режиме ручной или распределенных транзакций.
Чтобы устранить эту проблему, необходимо явным образом закройте объекты набора записей , которые были созданы с помощью функции GetCustomers и GetOrders .
Пример 3: Проблемы при неявно создается и затем сбросить объектов наборов записей
По умолчанию метод Execute объектов подключения и команды неявно создает и возвращает новый объект набора записей . Этот объект набора записей не сохраняется в переменной объекта в Visual Basic 6.0 объект набора записей выпадает из области и сразу же закрывается. Таким образом в следующем примере кода выполняется успешно в Visual Basic 6.0. Тем не менее, вы получите сообщение об ошибке, описанное в "Пример 2: проблемы при работе с транзакциями, если явно не закрыть объекты наборов записей» раздела при переносе кода на Visual Basic .NET.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Open "Provider=SQLOLEDB;Data Source=.;" & _
        "Initial Catalog=Northwind;Trusted_Connection=Yes;"
 
cn.BeginTrans
 
cn.Execute "SELECT CustomerID, CompanyName FROM Customers"
cn.Execute "SELECT OrderID, CustomerID FROM Orders ORDER BY CustomerID"
 
cn.RollbackTrans
cn.Close
В этом примере кода вызов метода Execute объекта подключения неявно возвращают объекты набора записей . Сборка мусора в Visual Basic 6.0 немедленно закроет каждого объекта набора записей , так как возвращаемое значение не сохраняется в переменной. Сборка мусора не как Агрессивный в Visual Basic .NET. Объект набора записей , содержащий сведения о клиенте открыт, когда происходит вызов метода запроса к базе данных сведений о заказах. Таким образом, появляется сообщение об ошибке, описанное в "Пример 2: проблемы при работе с транзакциями, если явно не закрыть объекты наборов записей» раздел.

Чтобы устранить эту проблему, передайте значение adExecuteNoRecords из ExecuteOptionsEnum значение в параметре Options метода Execute . При этом можно указать, что метод Execute не должны возвращать объект набора записей , как показано в следующем примере кода.

Visual Basic
1
2
cn.Execute "SELECT CustomerID, CompanyName FROM Customers", , _
           ADODB.ExecuteOptionsEnum.adExecuteNoRecords
Проблема 2: Мы не рекомендуем ADODB основную сборку ВЗАИМОДЕЙСТВИЯ для нагрузочных сценариев
Настоятельно рекомендуется вы не с помощью PIA ADODB в нагрузочных сценариев, например, в многопользовательской компоненты ASP.NET Microsoft или Microsoft COM +. При тестировании ВЗАИМОДЕЙСТВИЯ ADODB тестеров Майкрософт тестирования найти что ADODB PIA не выполняется под нагрузкой. Если код доступа к данным .NET должен работать безотказно под нагрузкой, настоятельно рекомендуется написать код с помощью ADO.NET.
Проблема 3: Мы не рекомендуем использовать основную сборку ВЗАИМОДЕЙСТВИЯ ADODB в 64-разрядном режиме
Настоятельно рекомендуется вы не с помощью основных сборок ВЗАИМОДЕЙСТВИЯ ADODB в 64-разрядных приложений. ADODB PIA не тестировался в 64-разрядном режиме. В большинстве случаев 64-разрядных включают в себя компоненты высокой нагрузки на стороне сервера, такие как ASP.NET или COM +. ADODB PIA имеет известные проблемы при выполнении под нагрузкой. Ограниченная доступность для 64-разрядных поставщиков OLE DB делает 64-разрядном режиме менее привлекательной для работы с основной сборки ВЗАИМОДЕЙСТВИЯ ADODB.
Проблема 4: Сбоев при выполнении запроса с поздним связыванием
ADODB поддерживает следующие способы выполнения запросов с поздним связыванием. Выполнение запроса с поздней привязкой позволяет использовать привязку IDispatch COM для выполнения запросов, как будто запросов методов для объекта подключения . ADODB поддерживает следующие два вида выполнение запроса с поздним связыванием.

Создайте запрос «с именем» с помощью свойства Name объекта Command .
Выполнение вызова хранимой процедуры.

При миграции кода из Visual Basic 6.0 до Visual Basic .NET, могут возникнуть проблемы с этими формами.

Следующие примеры иллюстрируют эти проблемы.
Пример 1: Если создать второй запрос с поздним связыванием, имеет то же имя, запрос завершится
В следующем примере кода создается два запроса с поздним связыванием, использующие то же значение для свойства Name объекта Command .

Visual Basic
1
2
3
4
5
6
7
8
9
10
Dim cn As ADODB.Connection
Dim cmd As ADODB.Command
Dim rs As ADODB.Recordset
Dim strConn As String
    
'Open a new Connection.
strConn = "Provider=SQLOLEDB;Data Source=.;" & _
          "Initial Catalog=Northwind;Trusted_Connection=Yes"
Set cn = New ADODB.Connection
cn.Open strConn
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
'Create a Command object, and then set the Name property 
'to enable the Command object as a late-bound method call.
Set cmd = New ADODB.Command
cmd.CommandText = "SELECT COUNT(*) FROM Customers"
cmd.Name = "GetCount"
Set cmd.ActiveConnection = cn
    
'Execute the Command object as a late-bound method call on the Connection.
Set rs = New ADODB.Recordset
cn.GetCount rs
Debug.Print rs(0).Value
rs.Close
Set rs = Nothing
    
'Release the Command object.
Set cmd = Nothing
    
'Create a new Command object, and then set the Name property
'to enable the Command object as a late-bound method call.
Set cmd = New ADODB.Command
cmd.CommandText = "SELECT COUNT(*) FROM Orders"
cmd.Name = "GetCount"
Set cmd.ActiveConnection = cn
    
'Execute the Command object as a late-bound method call on the Connection object.
Set rs = New ADODB.Recordset
cn.GetCount rs
Debug.Print rs(0).Value
rs.Close
Set rs = Nothing
    
'Clean up.
cn.Close
В Visual Basic 6.0 как только объект команды имеет значение Nothing, объект удаляется сборкой мусора. Объект подключения уведомляется, что объект команды были уничтожены. Таким образом Если второй объект команды связан с объектом подключения , конфликт не существует.

Когда подобный код выполняется в Visual Basic .NET, объект команды не может быть удален сборщиком мусора по времени, связанный с объектом подключения второй объект команды . Таким образом может появиться следующее сообщение об ошибке исключения:
Объект уже присутствует в коллекции. Не удается добавить.
Чтобы устранить эту проблему, вручную отделить первый объект команды из объекта подключения . Чтобы сделать это, необходимо явно вызовите cmd.ActiveConnection метода очистки объекта команды . Для этого используйте следующий код.

'Visual Basic 6.0 syntax
Set cmd.ActiveConnection = Nothing

'Visual Basic .NET syntax
cmd.ActiveConnection = Nothing

Пример 2: При вызове с поздним связыванием запрос на повторное подключение запрос не
В следующем примере кода выполняет следующие задачи в том порядке, в котором они перечислены.

Создайте два объекта подключения .
Создайте объект команды для каждого объекта подключения . Каждый объект команды имеет то же значение для свойства Name .
Выполнение каждой команды с помощью выполнения запроса с поздним связыванием.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Dim strConn As String, strSQL As String
Dim cn1 As ADODB.Connection, cn2 As ADODB.Connection
Dim cmd1 As ADODB.Command, cmd2 As ADODB.Command
Dim rs1 As ADODB.Recordset, rs2 As ADODB.Recordset
    
strConn = "Provider=SQLOLEDB;Data Source=.;" & _
          "Initial Catalog=Northwind;Trusted_Connection=Yes;"
strSQL = "SELECT COUNT(*) FROM Customers"
    
'Open connections.
Set cn1 = New ADODB.Connection
Set cn2 = New ADODB.Connection
cn1.Open strConn
cn2.Open strConn
    
'Create commands so that the commands can be executed as late-bound methods.
Set cmd1 = New ADODB.Command
Set cmd2 = New ADODB.Command
cmd1.CommandText = strSQL
cmd2.CommandText = strSQL
cmd1.Name = "GetCount"
cmd2.Name = "GetCount"
Set cmd1.ActiveConnection = cn1
Set cmd2.ActiveConnection = cn2
    
'Execute queries as late-bound methods.
Set rs1 = New ADODB.Recordset
Set rs2 = New ADODB.Recordset
cn1.GetCount rs1
cn2.GetCount rs2
MsgBox rs1(0).Value
MsgBox rs2(0).Value
    
'Clean up.
rs1.Close
rs2.Close
cn1.Close
cn2.Close
В этом примере кода завершается успешно при работе с Visual Basic 6.0. Однако в этом примере кода происходит сбой при использовании Visual Basic .NET. Эта проблема возникает из-за следующих причин:

Как ADODB подготавливает эти запросы в качестве метода с поздней привязкой
Предположения об этих методах выполняется компилятором Visual Basic .NET

При установке свойства ActiveConnection объекта Command , ADODB проверяет, имеет ли объект команды задать свойство Name . Если значение свойства Name , ADODB готовит запрос таким образом, запрос может выполняться как с поздним связыванием метода объекта подключения . В этом примере два объекта команд имеют одинаковое значение для свойства CommandText . Тем не менее это очень простой пример. Несмотря на то, что объекты команд имеют одинаковое значение для свойства Name , командных объектов может иметь значения CommandText , которые будут выполнять очень разные запросы. Таким образом ADODB создает уникальный метод подписи для метода с поздней привязкой.

Компилятор Visual Basic .NET не делает это отличительные особенности. При первом вызове запрос «GetCount» компилятор Visual Basic .NET кэширует подписи метода в случае, если другой вызов метода GetCount для объекта подключения . Когда код вызывает второй запрос «GetCount», Visual Basic .NET повторно использует кэшированный сигнатуру для второго метода GetCount . Поскольку ADODB создает уникальный метод подписи, сбое вызова во второй запрос с поздним связыванием.

Решения этой проблемы не существует для этого сценария.
Проблема 5: Можно установить некоторые ADODB варианта типы данных для строковых типов данных
Модель объекта ADODB позволяет задать некоторые свойства строки или других объектов ADODB. Например свойства ActiveConnection объекта набора записей отображается в обозревателе объектов Visual Basic 6.0 как тип данных Variant и может быть присвоено объект подключения или строку подключения.

Если вы создали свой собственный объект и для поддержки этой функции, необходимо создать отдельный свойствам. Чтобы сделать это, используйте код, аналогичный следующему примеру кода.

Visual Basic
1
2
3
4
5
6
7
Public Property Let ActiveConnection (ByVal value As String)
    'Add logic here.
End Property
 
Public Property Set ActiveConnection (ByRef value As Object)
    'Add logic here.
End Property
Платформа.NET Framework является немного более строгие и не допускает использование нескольких методов доступа к свойству с различными типами данных. ADODB PIA позволяет задать свойства ActiveConnection объекта набора записей для объекта подключения . Если требуется задать свойства ActiveConnection в строку, необходимо использовать метод let_ActiveConnection , как показано в следующем примере кода.

Visual Basic
1
2
3
4
5
6
7
Dim strConn As String
Dim rs As ADODB.Recordset
    
strConn = "Provider=SQLOLEDB;Data Source=.;" & _
          "Initial Catalog=Northwind;Trusted_Connection=Yes;"
rs = New ADODB.Recordset
rs.let_ActiveConnection(strConn)
Тот же подход является обязательным, если вы установите следующие свойства:

Свойство Source объекта набора записей
Свойства ActiveConnection объекта команды

Эти свойства принимают объекты. Чтобы задать эти свойства строки, необходимо использовать соответствующий метод let_MethodName .
Проблема 6: Исключение InvalidCastException возникает при вызове метода Parameters.Append
PIA ADODB, поставляемый с Microsoft Visual Studio .NET 2003 и Visual Studio 2005 имеется известная проблема, возникающая при вызове метода Parameters.Append вместе с объектом параметра , который был создан с помощью конструктора по умолчанию.

В следующем примере кода вызовет исключение InvalidCastException .

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim cmd As ADODB.Command
Dim p As ADODB.Parameter
 
cmd = New ADODB.Command
cmd.CommandText = "SELECT CustomerID FROM Orders WHERE OrderID = ?"
 
p = New ADODB.Parameter
p.Name = "@OrderID"
p.Type = ADODB.DataTypeEnum.adInteger
p.Value = 10248
 
cmd.Parameters.Append(p)
Чтобы обойти эту проблему, создайте объекты параметров с помощью метод CreateParameter объекта команды , как показано в следующем примере кода.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Dim cmd As ADODB.Command
Dim p As ADODB.Parameter
 
cmd = New ADODB.Command
cmd.CommandText = "SELECT CustomerID FROM Orders WHERE OrderID = ?"
 
p = cmd.CreateParameter()
p.Name = "@OrderID"
p.Type = ADODB.DataTypeEnum.adInteger
p.Value = 10248
 
cmd.Parameters.Append(p)
Проблема 7: Проблем работы с компонентами, которые ожидают ADO 2.8 интерфейсов
ADODB основную сборку ВЗАИМОДЕЙСТВИЯ, которая входит в состав Visual Studio 2005 — это же компонент, который поставляется вместе с Visual Studio .NET 2003 и был создан с использованием Microsoft платформа.NET Framework 1.1. ADODB был построен для взаимодействия с ADO 2.7 интерфейсов и не был обновлен для работы с ADO 2.8 интерфейсов.

Таким образом дополняющая ADODB вместе с компонентами, которые предоставляют 2,8 интерфейсы ADO будет невозможно. Этот сценарий не поддерживается с помощью основных сборок ВЗАИМОДЕЙСТВИЯ ADODB.

ВОПРОС ЗАКРЫТ!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.11.2012, 20:23
Ответы с готовыми решениями:

Подключение к БД пользователей и ошибка "Пользователь не связан с доверенным соединением с SQL Server"
Доброе время суток! Прошу прощения, если такая тема уже была, но через поиск ничего не нашёл. При подключении к БД без указания...

Не видит строку подключения к SQL server
Всем приветик! Дома делала лабораторку по ASp.Net. Простенький сайт с полями для регистрации нового студента. Заполняем Имя, Фамилию,...

Драйвер с++ для подключения к ms sql server
Доброе уремяни суток, уважаемые форумчани!!! Подскажите пожалуйста. Исходники драйвера или какой то сторонний драйвер для работы с базой...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2012, 20:23
Помогаю со студенческими работами здесь

Управление записями в БД через интерфейс в Excel(ADODB + MS SQL Server)
Всем привет. Есть задача сделать пользовательский интерфейс для изменения данных в БД через интерфейс в Excel. Доступно: MS SQL...

Ошибка подключения к SQL (SQL Server не существует, или доступ запрещен.)
Привет Всем уважаемые форумчане! Вопрос такой, у себя на ПК (На котором пишу программу) - запускаю свою программу, спокойно всё...

Не получается задать строку для связи с БД SQL Server
Собственно проблема в том что,я создал таблицы в БД,но Я выложил фотку,где именно они создались! Проблема не могу(точнее не знаю)как ...

как сгенерить строку коннекта для MS SQL Server-а?
Как будет выглядеть строка коннекта для MS SQL Server-а, подобной этой: db.Open 'DSN=ishop; UID=sa;PWD=;database=ishop' можно ли...

Как получить Record.count в конструкции вида: Set conn = Server.CreateObject('ADODB.Connection')SQL = 'SELECT * FROM tbl'
Подскажите как получить Record.count в конструкции вида: Set conn = Server.CreateObject('ADODB.Connection')SQL = 'SELECT * FROM tbl' ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru