powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / ошибка ODBC в MFC
11 сообщений из 11, страница 1 из 1
ошибка ODBC в MFC
    #34573897
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, есть потребность открывать mdb файл и делать запросы. Как самое простое, выбрал ODBC.
Код падает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
	try
	{
		CDatabase	db;

		CString	cConnect;
		cConnect += "UID=Admin;";
		cConnect += "DRIVER={Microsoft Access Driver (*.mdb)};";
		cConnect += "DBQ=h:\\base.mdb;";
		
		BOOL b = db.OpenEx( cConnect );
		db.ExecuteSQL("SELECT * FROM Сотрудники");
			
		CRecordset recset(&db);

		recset.Open();

		short fieldsCount = recset.GetODBCFieldCount();
		CString fieldValue;
		while( !recset.IsEOF() )
		{
			for(short i= 0 ; i<fieldsCount; i++)
				recset.GetFieldValue(i, fieldValue);

			recset.MoveNext();
		}
	}

	catch (CDBException *ex)
	{
		AfxMessageBox( ex->m_strError );
		ex->Delete();
	}
Падает на recset.Open(); В его недрах вылетает assert
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34573899
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
assert, что число полей = 0. Не хочу нследоваться от CRecordset, т.к. таблиц много, нужен универсальный подход. В чем проблема?
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34574317
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если кто-то работал с ODBC на MFC (или API), подскажите! В мсдне на эту тему просто муть какая-то.
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34574400
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TopSpace пишет:
> Падает на recset.Open(); В его недрах вылетает assert

Думаю надо перечислить все поля. Вообще, если не хочешь потрахаца,
используй лучше напрямую ODBC. MFC-шные классы эти очень своеобразны.
А если хочешь, то смотри в код, что за ассерт, что он подразумевает,
ну и соотв. делай, чтобы ему было бы хорошо.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34574493
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2TopSpace
А как по-твоему, что этот рекордсет должен выбрать из базы? (какие колонки из каких таблиц)

Ладно, отвечу сам: CRecordset-у пофиг, что ты на CDatabase выполнил какой-то SQL. SQL надо передать в CRecordset:
Код: plaintext
recset.Open(CRecordset::snapshot, "SELECT * FROM Сотрудники");
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34574916
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Плииин...работает! Спасибо!!
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34593906
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла другая проблема... или руки кривые, или ODBC - зло...:) Вобщем натравливаю объект класса CRecordset на базу, на выборку запросы работают, а на вставку нет:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
//-----------------------------------------------
BOOL cSQLConnection::OpenDatabase(LPCTSTR Path)
{
	if( m_connectionOpened )
	{
		CloseDatabase();
	}
	//------------------------------------------------
	m_workDataBase = new CDatabase();
	m_recset       = new CRecordset(m_workDataBase);
	//------------------------------------------------
	m_connectionString  = "";	
	m_connectionString += "UID=Admin;";
	m_connectionString += "DRIVER={Microsoft Access Driver (*.mdb)};";
	m_connectionString += "DBQ=";
	m_connectionString += Path;
	m_connectionString += ";";

	BOOL result = true;

	try
	{ 
		BOOL result = m_workDataBase->OpenEx( m_connectionString );
	}

	catch (CDBException *ex)
	{
		AfxMessageBox( ex->m_strError );
		ex->Delete();
		return false;
	}
	
	return result;
}
..
..
....
 
//-----------------------------------------------
BOOL cSQLConnection::ExecuteClientQuery(int queryCode, LPCTSTR param)
{
	if( m_recset->IsOpen() )
		m_recset->Close();

	CString query = g_Querys[queryCode];  //INSERT INTO TableName (...fields) VALUES (..values..)
	if(param)
		query += param;


	BOOL res = m_recset->Open(CRecordset::OpenType::dynaset,query);  //CRASH HERE!!!
	return res;
}
Падает на ассерте, что число полей в рекордсете равно нулю. Что делать? Почему для запроса надо закрывать и открывать, почему нельзя сменить текст запроса?
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34594386
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекордсет (CRecordset) да рассчитан на запись данных в таблицу (добавление, изменение).
Но пользоваться им надо не так, как ты это делаешь. Нужно привзать переменные класса к соотв. полям (колонкам) таблицы, вызвать AddNew(), присвоить переменным нужные значения и вызвать Update().

Как вариант можно выполнить SQL-выражение на запись с помощью CDatabase (ExecuteSQL()).

Вообще больно смотреть на твои мучения, почитай хотя бы описание класса CRecordset и его функций в MSDN.

PS: ODBC не зло, но Microsoft объявило его deprecated, поэтому если ты только начинаешь программировать, то посмотри на OLE DB или ADO.
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34594402
TopSpace
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я понимаю все эти фишки про ADO, я с ним работал, и про выведение класса из CRecordset (как ты описал). Тут просто обстоятельства такие..
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34595814
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ой ВэйPS: ODBC не зло, но Microsoft объявило его deprecatedНе распоространяй слухи. ODBC не объявлен deprecated. Deprecated объявлен стандартный мост OLE DB -> ODBC называемый MSDASQL и все.
...
Рейтинг: 0 / 0
ошибка ODBC в MFC
    #34596911
Ой Вэй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНе распространяй слухи. ODBC не объявлен deprecated. Deprecated объявлен стандартный мост OLE DB -> ODBC называемый MSDASQL и все.
Видимо, ты прав. Наверно, я невнимательно прочитал и неправильно интерпретировал вот этот абзац:
Код: plaintext
1.
2.
3.
4.
5.
ODBC Provider (MSDASQL)
You are strongly encouraged to use one of the native OLE DB Providers instead of the Microsoft Open
Database Connectivity (ODBC) Provider. Native OLE DB Providers provide better application stability 
nd performance. Furthermore, native OLE DB Providers will be supported in the future, whereas 
SDASQL will not have any new features added to it, will not be available on 64-bit, and will not be 
ccessible from the OLE DB NET Data Provider.
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mdacsdk/htm/mdac_deprecated_components.asp)
Слова "Provider" после слова "ODBC" я просто не заметил.

Во-первых, конечно, большое спасибо, а то я уже начал готовиться к переделке всего кода на OLE DB. И это радует.

С другой стороны, если у меня уже начался маразм, то надо срочно сдавать дела...
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / ошибка ODBC в MFC
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]