Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Сеанс поставщика OLE DB собственного клиента SQL Server представляет одно подключение к экземпляру SQL Server.
Поставщик OLE DB собственного клиента SQL Server требует, чтобы пространство транзакций разделителя сеансов для источника данных было разделено. Все объекты команд, созданные из определенного объекта сеанса, участвуют в локальной или распределенной транзакции объекта сеанса.
Первый объект сеанса, созданный на инициализированном источнике данных, получает подключение SQL Server, установленное при инициализации. Когда выпускаются все ссылки на интерфейсы объекта сеанса, подключение к экземпляру SQL Server становится доступным для другого объекта сеанса, созданного в источнике данных.
Дополнительный объект сеанса, созданный в источнике данных, устанавливает собственное подключение к экземпляру SQL Server, как указано в источнике данных. Подключение к экземпляру SQL Server удаляется, когда приложение освобождает все ссылки на объекты, созданные этим сеансом.
В следующем примере показано, как использовать поставщик OLE DB собственного клиента SQL Server для подключения к базе данных SQL Server:
int main()
{
// Interfaces used in the example.
IDBInitialize* pIDBInitialize = NULL;
IDBCreateSession* pIDBCreateSession = NULL;
IDBCreateCommand* pICreateCmd1 = NULL;
IDBCreateCommand* pICreateCmd2 = NULL;
IDBCreateCommand* pICreateCmd3 = NULL;
// Initialize COM.
if (FAILED(CoInitialize(NULL)))
{
// Display error from CoInitialize.
return (-1);
}
// Get the memory allocator for this task.
if (FAILED(CoGetMalloc(MEMCTX_TASK, &g_pIMalloc)))
{
// Display error from CoGetMalloc.
goto EXIT;
}
// Create an instance of the data source object.
if (FAILED(CoCreateInstance(CLSID_SQLNCLI10, NULL,
CLSCTX_INPROC_SERVER, IID_IDBInitialize, (void**)
&pIDBInitialize)))
{
// Display error from CoCreateInstance.
goto EXIT;
}
// The InitFromPersistedDS function
// performs IDBInitialize->Initialize() establishing
// the first application connection to the instance of SQL Server.
if (FAILED(InitFromPersistedDS(pIDBInitialize, L"MyDataSource",
NULL, NULL)))
{
goto EXIT;
}
// The IDBCreateSession interface is implemented on the data source
// object. Maintaining the reference received maintains the
// connection of the data source to the instance of SQL Server.
if (FAILED(pIDBInitialize->QueryInterface(IID_IDBCreateSession,
(void**) &pIDBCreateSession)))
{
// Display error from pIDBInitialize.
goto EXIT;
}
// Releasing this has no effect on the SQL Server connection
// of the data source object because of the reference maintained by
// pIDBCreateSession.
pIDBInitialize->Release();
pIDBInitialize = NULL;
// The session created next receives the SQL Server connection of
// the data source object. No new connection is established.
if (FAILED(pIDBCreateSession->CreateSession(NULL,
IID_IDBCreateCommand, (IUnknown**) &pICreateCmd1)))
{
// Display error from pIDBCreateSession.
goto EXIT;
}
// A new connection to the instance of SQL Server is established to support the
// next session object created. On successful completion, the
// application has two active connections on the SQL Server.
if (FAILED(pIDBCreateSession->CreateSession(NULL,
IID_IDBCreateCommand, (IUnknown**) &pICreateCmd2)))
{
// Display error from pIDBCreateSession.
goto EXIT;
}
// pICreateCmd1 has the data source connection. Because the
// reference on the IDBCreateSession interface of the data source
// has not been released, releasing the reference on the session
// object does not terminate a connection to the instance of SQL Server.
// However, the connection of the data source object is now
// available to another session object. After a successful call to
// Release, the application still has two active connections to the
// instance of SQL Server.
pICreateCmd1->Release();
pICreateCmd1 = NULL;
// The next session created gets the SQL Server connection
// of the data source object. The application has two active
// connections to the instance of SQL Server.
if (FAILED(pIDBCreateSession->CreateSession(NULL,
IID_IDBCreateCommand, (IUnknown**) &pICreateCmd3)))
{
// Display error from pIDBCreateSession.
goto EXIT;
}
EXIT:
// Even on error, this does not terminate a SQL Server connection
// because pICreateCmd1 has the connection of the data source
// object.
if (pICreateCmd1 != NULL)
pICreateCmd1->Release();
// Releasing the reference on pICreateCmd2 terminates the SQL
// Server connection supporting the session object. The application
// now has only a single active connection on the instance of SQL Server.
if (pICreateCmd2 != NULL)
pICreateCmd2->Release();
// Even on error, this does not terminate a SQL Server connection
// because pICreateCmd3 has the connection of the
// data source object.
if (pICreateCmd3 != NULL)
pICreateCmd3->Release();
// On release of the last reference on a data source interface, the
// connection of the data source object to the instance of SQL Server is broken.
// The example application now has no SQL Server connections active.
if (pIDBCreateSession != NULL)
pIDBCreateSession->Release();
// Called only if an error occurred while attempting to get a
// reference on the IDBCreateSession interface of the data source.
// If so, the call to IDBInitialize::Uninitialize terminates the
// connection of the data source object to the instance of SQL Server.
if (pIDBInitialize != NULL)
{
if (FAILED(pIDBInitialize->Uninitialize()))
{
// Uninitialize is not required, but it fails if an
// interface has not been released. Use it for
// debugging.
}
pIDBInitialize->Release();
}
if (g_pIMalloc != NULL)
g_pIMalloc->Release();
CoUninitialize();
return (0);
}
Подключение объектов сеансов поставщика OLE DB собственного клиента SQL Server к экземпляру SQL Server может привести к значительным затратам для приложений, которые постоянно создают и освобождают объекты сеансов. Затраты можно свести к минимуму, управляя объектами сеансов поставщика OLE DB собственного клиента SQL Server. Приложения поставщика OLE DB собственного клиента SQL Server могут поддерживать подключение к объекту сеанса SQL Server, сохраняя ссылку по крайней мере на одном интерфейсе объекта.
Например, сохранение пула ссылок на объекты создания команд сохраняет активные подключения для этих объектов сеансов в пуле. Поскольку требуются объекты сеанса, код обслуживания пула передает допустимый указатель интерфейса IDBCreateCommand методу приложения, требующему сеанса. Если метод приложения больше не требует сеанса, метод возвращает указатель интерфейса обратно в код обслуживания пула, а не освобождает ссылку приложения на объект создания команды.
Замечание
В предыдущем примере используется интерфейс IDBCreateCommand , так как интерфейс ICommand реализует метод GetDBSession , единственный метод в области команд или набора строк, позволяющий объекту определить сеанс, на котором он был создан. Таким образом, объект команды и только объект команды позволяет приложению получить указатель на источник данных, из которого можно создать дополнительные сеансы.