Ошибка при попытке получить схему на ADO (C++)
От: ariets  
Дата: 30.10.08 10:27
Оценка:
Привет всем.
У меня есть следующая задача: проверить, что есть некоторая база 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 
   }
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.