Привет всем.
У меня есть следующая задача: проверить, что есть некоторая база MS SQLSERVER на компе (и наличие в ней определенных таблиц). Происходит проверка во время сетапа продукта, когда еще нет нативного клиента MS SQLSERVER, поэтому используется ADO с драйвером sqloledb. Устанавливается соединение, но при попытке выполнить скрипт или получить схему происходит ошибка 800A0E78 (Operation is not allowed when the object is closed, как я понял).
Далее приведен кусочек "тестового" кода с получением Primary Keys. Что я делаю неправильно?
Заранее спасибо=)
void main(void)
{
CoInitialize(NULL);
try
{
wchar_t * username = L"Username@Domain"
wchar_t * password = L"Pass";
CHandle userToken;
if (!LogonUser(username, NULL, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, &userToken.m_h))
{
DWORD err = GetLastError();
throw err;
}
if (!ImpersonateLoggedOnUser(userToken))
{
DWORD err = GetLastError();
throw err;
}
ADODB::_RecordsetPtr pRs;
ADODB::_ConnectionPtr pCn;
HRESULT hr;
_variant_t varCriteria[3];
_bstr_t mydatabase("monitor");
_bstr_t mydbo("dbo");
_bstr_t mytable("Alarms");
varCriteria[0] = mydatabase;
varCriteria[1] = mydbo;
varCriteria[2] = mytable;
VARIANT varData;
SAFEARRAY FAR* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = 3;
psa = SafeArrayCreate(VT_VARIANT, 1, rgsabound);
for( long lIndex = 0 ; lIndex < 3 ;lIndex++)
{
hr = SafeArrayPutElement(psa, &lIndex, &varCriteria[lIndex]);
}
varData.vt = VT_VARIANT | VT_ARRAY;
V_ARRAY(&varData) = psa;
pCn.CreateInstance(__uuidof(ADODB::Connection));
pCn->Open(L"Provider=sqloledb;Data Source=prog\sqlexpress;Initial Catalog=monitor;Integrated Security='SSPI'", L"", L"", -1L);
hr = pCn->OpenSchema(ADODB::adSchemaPrimaryKeys, varData, vtMissing, &pRs);
if(FAILED(hr))
_com_issue_error(hr); //выполняется этот код
.......................
.......................
}
catch //bla-bla
{
// Сюда приходит _com_error с кодом ошибки 800A0E78
}
}