Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / ошибка ODBC в MFC / 11 сообщений из 11, страница 1 из 1
05.06.2007, 07:08
    #34573897
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
Привет, есть потребность открывать 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
05.06.2007, 07:10
    #34573899
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
assert, что число полей = 0. Не хочу нследоваться от CRecordset, т.к. таблиц много, нужен универсальный подход. В чем проблема?
...
Рейтинг: 0 / 0
05.06.2007, 11:04
    #34574317
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
Если кто-то работал с ODBC на MFC (или API), подскажите! В мсдне на эту тему просто муть какая-то.
...
Рейтинг: 0 / 0
05.06.2007, 11:29
    #34574400
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
TopSpace пишет:
> Падает на recset.Open(); В его недрах вылетает assert

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

Ладно, отвечу сам: CRecordset-у пофиг, что ты на CDatabase выполнил какой-то SQL. SQL надо передать в CRecordset:
Код: plaintext
recset.Open(CRecordset::snapshot, "SELECT * FROM Сотрудники");
...
Рейтинг: 0 / 0
05.06.2007, 13:23
    #34574916
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
Плииин...работает! Спасибо!!
...
Рейтинг: 0 / 0
14.06.2007, 10:57
    #34593906
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
Возникла другая проблема... или руки кривые, или 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
14.06.2007, 13:01
    #34594386
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
Рекордсет (CRecordset) да рассчитан на запись данных в таблицу (добавление, изменение).
Но пользоваться им надо не так, как ты это делаешь. Нужно привзать переменные класса к соотв. полям (колонкам) таблицы, вызвать AddNew(), присвоить переменным нужные значения и вызвать Update().

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

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

PS: ODBC не зло, но Microsoft объявило его deprecated, поэтому если ты только начинаешь программировать, то посмотри на OLE DB или ADO.
...
Рейтинг: 0 / 0
14.06.2007, 13:04
    #34594402
TopSpace
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
Да я понимаю все эти фишки про ADO, я с ним работал, и про выведение класса из CRecordset (как ты описал). Тут просто обстоятельства такие..
...
Рейтинг: 0 / 0
14.06.2007, 18:45
    #34595814
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
Ой ВэйPS: ODBC не зло, но Microsoft объявило его deprecatedНе распоространяй слухи. ODBC не объявлен deprecated. Deprecated объявлен стандартный мост OLE DB -> ODBC называемый MSDASQL и все.
...
Рейтинг: 0 / 0
15.06.2007, 11:22
    #34596911
Ой Вэй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка ODBC в MFC
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
Форумы / C++ [игнор отключен] [закрыт для гостей] / ошибка ODBC в MFC / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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