Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.125.7] |
|
Сообщ.
#1
,
|
|
|
Подскажите, плз, что делать в случае, когда выскакивает сообщение
"Драйвер 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? В таком случае где можно найти "доделанные". ЗЫ: база фокспрошная |
Сообщ.
#2
,
|
|
|
А ты ставил MDAC 2.5, 2.6?
Провер синтаксис строки. |
Сообщ.
#3
,
|
|
|
CODBCRecordset? ты б просто CRecordset'ом попробовал... эт могут быть недоработки одбц... хотя с фокспро проблем такого плана не было (ток если по запарке открывал уже открытую базу - вываливались всякие разные сообщения - каждый раз разные ;D) а ваще - лучше Dao пользоваться - гибче и быстрее.. |
Сообщ.
#4
,
|
|
|
Поставил MDAC 2.7, все равно пишет то же самое.
В запросе все верно, т.к. этот же запрос использую для чтения, и работает. Насчет CRecordset. Пробовал и им, наследовал, и т.д. Дело не в CODBCRecordset. А чем DAO лучше ODBC? Почему-то смотрю, и вижу, что все его чураются . |
Сообщ.
#5
,
|
|
|
А если попробовать напрямую обращаться к ODBC (через ф-ции Sql... )?
MFC, на мой взгляд, годится только для работы с окнами. |
Сообщ.
#6
,
|
|
|
Для примера. Может чё почерпнёшь.
<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>} <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> |
Сообщ.
#7
,
|
|
|
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; Небольшая проблемка только втом, что работаю с Мемо-полями, приходится производить кучу преобразований над строками. Но это решено. Так что всем спасибо за ответы :-) |