На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела C/C++: Базы данных
Модераторы: B.V.
  
    > Драйвер ODBC не поддерживает динамических...
      Подскажите, плз, что делать в случае, когда выскакивает сообщение
      "Драйвер ODBC не поддерживает динамических подмножеств данных"
      Затык происходит, когда доходит до

      CDatabase            KTSSettingDB;
      CString                  strConnect(_T("DSN=KTSSettingsDB;UID=;PWD=;"));
      char                  szPort[200];
      // Коннектимся к базе
      TRY
        {
             // Открываем базу данных, используя предварительно созданный
             // псевдо DSN
             KTSSettingDB.OpenEx(strConnect, CDatabase::noOdbcDialog);
             // Распределяем записи
             CODBCRecordset recset(&KTSSettingDB);

           // подготовим запрос
          wsprintf( szPort,
           "SELECT id_realmoduls, prop_rmod FROM realmoduls WHERE id_objects = \%d AND    
                  id_moduls = 7 AND parent_rmod = 0", nObjectID);

             recset.Open(szPort, CRecordset::dynaset); <- вот здесь

      Это недоделанные драйвера ODBC?
      В таком случае где можно найти "доделанные".
      ЗЫ: база фокспрошная
        А ты ставил MDAC 2.5, 2.6?

        Провер синтаксис строки.
          :D
          CODBCRecordset?
          ты б просто CRecordset'ом попробовал...
          эт могут быть недоработки одбц...
          хотя с фокспро проблем такого плана не было (ток если по запарке открывал уже открытую базу - вываливались всякие разные сообщения - каждый раз разные  ;D)
          а ваще - лучше Dao пользоваться - гибче и быстрее..
            Поставил MDAC 2.7, все равно пишет то же самое.
            В запросе все верно, т.к. этот же запрос использую для чтения, и работает.

            Насчет CRecordset. Пробовал и им, наследовал, и т.д. Дело не в CODBCRecordset.
            А чем DAO лучше ODBC? Почему-то смотрю, и вижу, что все его чураются :).
              А если попробовать напрямую обращаться к ODBC (через ф-ции Sql... )?
              MFC, на мой взгляд, годится только для работы с окнами.
                Для примера. Может чё почерпнёшь.

                ExpandedWrap disabled
                  <br>// Получаем имя Excel-ODBC драйвера<br>CString CListXLSDlg::GetExcelDriver()<br>{<br>    char szBuf[2001];<br>    WORD cbBufMax = 2000;<br>    WORD cbBufOut;<br>    char *pszBuf = szBuf;<br>    CString sDriver = _T("");<br><br>    // Получаем имена проинсталированных драйверов<br>    // ("odbcinst.h" должен быть включён в проект )<br>    if (!SQLGetInstalledDrivers(szBuf, cbBufMax, &cbBufOut)) <br>            return sDriver;<br>    // Ищем драйвер...<br>    do<br>    {<br>        if (strstr(pszBuf, "Excel") != 0)<br>        {   // Нашли !<br>            sDriver = CString(pszBuf); break;<br>        }<br>        pszBuf = strchr(pszBuf, '\0') + 1;<br>    }<br>    while (pszBuf[1] != '\0');<br>    return sDriver;<br>}


                ExpandedWrap disabled
                  <br>// Создаю файл Report.xls<br><br>UINT CListXLSDlg::ListPatientsXLSThread()<br>{<br>   CDatabase database;<br>   CString sDriver = GetExcelDriver();// Название драйвера в ODBC менеджере<br>   if(!strlen(sDriver))<br>   {<br>      CString str;<br>      str.Format(_T("Драйвер для создания файла типа .XLS не установлен."));<br>      AfxMessageBox(str);<br>      return 0;<br>   }<br>   CString sExcelFile = m_sExcelPuth;     <br>   sExcelFile += _T("Report.xls");<br>   CString sSql = _T("");<br>   CFileFind   fFindfile;<br>   if(fFindfile.FindFile(sExcelFile)) ::DeleteFile(sExcelFile);<br>   TRY {<br>      // Формируем строку для доступа минуя DSN<br>         sSql .Format(_T("DRIVER={\%s}; DSN=''; FIRSTROWHASNAMES=1; READONLY=FALSE; CREATE_DB=\"\%s\"; DBQ=\%s"), sDriver, sExcelFile, sExcelFile);<br>      // Создаём таблуцу Excel<br>      if( database.OpenEx(sSql, CDatabase::noOdbcDialog) ) {<br>         // Создаём структуру таблицы<br>         // .......... //<br>         database.Close();<br>      }      <br>   }<br>   CATCH_ALL(e) {<br>      database.Close();<br>      e->Delete();<br>      AfxMessageBox(_T("Ошибка при внесении данных."));<br>   }<br>   END_CATCH_ALL;<br>   m_editResult.SetWindowText(_T("Процесс завершен"));<br>   return 0;<br>}<br>





                Сообщение отредактировано: Gurza -
                  Re: Gurza
                  Спасибо за пример, я его сохраню :). Я попробовал через DAO, получилось. Мне всего-то надо было отредактировать записи. Мог бы, в принципе, и на SQL, да вот решил сделать с помощью MFC-ых классов. Но вот насчет переносимости проги на другие компы еще не знаю, будет ли там через DАО работать  :-/.

                  Получилось после преобразования из ODBC вот что
                  CDaoDatabase      KTSSettingDB;
                  COleVariant      destination;
                  CString            strConnect(_T("DSN=KTSSettingsDB;UID=;PWD=;"));
                  CString            strProperties, strPropertiesResult;
                  char            szPort[200];
                  // Коннектимся к базе
                  TRY
                  {
                       KTSSettingDB.Open(NULL, FALSE, FALSE, strConnect);
                       // Распределяем записи
                       CDaoRecordset recset(&KTSSettingDB);
                       // подготовим запрос
                       wsprintf( szPort,
                       "SELECT prop_rmod FROM realmoduls WHERE id_objects = \%d AND id_moduls = 7 AND parent_rmod = 0", ((CMainFrame*)(AfxGetApp()->m_pMainWnd))->m_nObjectSelID);

                       recset.Open(dbOpenDynaset, szPort);
                       recset.Move(0);
                       recset.Edit();
                                                     
                       destination = recset.GetFieldValue("prop_rmod");
                       strProcProperties = destination.pbVal;
                       //////////
                       // здесь преобразование данных
                       ////////////
                       
                       recset.SetFieldValue("prop_rmod", (LPCTSTR)strPropertiesResult);
                       recset.Update();
                       // Закрываем базу данных
                       recset.Close();
                       KTSSettingDB.Close();                            
                  }
                  CATCH(CDaoException, e)
                  {
                       // Открытие базы данных вызвало исключение, проще говоря ошибку...
                       AfxMessageBox("Database error: " + e->m_pErrorInfo->m_strDescription);
                       KTSSettingDB.Close();                            
                       return;
                  }
                  END_CATCH;      

                  Небольшая проблемка только втом, что работаю с Мемо-полями, приходится производить кучу преобразований над строками. Но это решено. Так что всем спасибо за ответы :-)
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0345 ]   [ 16 queries used ]   [ Generated: 9.05.24, 01:32 GMT ]