C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 7 - Изучаем CRecordset / ODBC / Visual C++

Шаг 7 - Изучаем CRecordset

Итак, мы можем получить обьект CRecordset, например, как ниже. Теперь пора изучить его свойства. Открытие сильно упрощено.

void CDatebaseDlg::OnOpen() 
{ 
	CRecordset cr(NULL);
	try
	{
		cr.Open(CRecordset::snapshot,
			"SELECT Family,Count FROM TABLE1", CRecordset::readOnly ); 
		//........
			cr.Close(); 
	}
	catch(CDBException cdb)
	{
		AfxMessageBox(cdb.m_strStateNativeOrigin);
	}
}

Нам может понадобиться SQL, на основе которого создан данный источник строк:

// Описание  const CString& GetSQL( ) const;
//......
cr.Open(CRecordset::snapshot,"SELECT Family,Count FROM TABLE1",CRecordset::readOnly);
AfxMessageBox(cr.GetSQL());
//......

Теперь надо проанализировать сколько столбцов нам вернулось. Вы можете сказать: "ведь мы знаем, что два из запроса SQL", но запрос можно построить и так, что это будет не факт. Смотрите SELECT. Получаем количество столбцов:

// Описание short GetODBCFieldCount( ) const;
short nFields = cr.GetODBCFieldCount();

Используя количество столбцов можно получить о них информацию с помощью GetODBCFieldInfo():

// Описание void GetODBCFieldInfo( short nIndex,
// CODBCFieldInfo& fieldinfo ); throw( CDBException );

short nFields = cr.GetODBCFieldCount();
for (short x=0;x < nFields;x++)
{
	CODBCFieldInfo fieldinfo;
	short pos=x;
	cr.GetODBCFieldInfo(pos,fieldinfo );
	AfxMessageBox(fieldinfo.m_strName);
}

Информация о типе полей находится в струтуре CODBCFieldInfo():

struct CODBCFieldInfo
{
	CString m_strName;   
	SWORD m_nSQLType;
	UDWORD m_nPrecision;   
	SWORD m_nScale;
	SWORD m_nNullability;
};

Мы воспользовались данными из структуры m_strName. В этом поле структуры находится имя столбца запроса.

Второе поле m_nSQLType говорит нам о типе данных в данной колонке. Вот описание типов. Вы, наверно, заметили, что я перечислил не все возможные типы, например, нет OLE.

#define	SQL_UNKNOWN_TYPE 0
#define SQL_CHAR 1
#define SQL_NUMERIC 2
#define SQL_DECIMAL 3
#define SQL_INTEGER 4
#define SQL_SMALLINT 5
#define SQL_FLOAT 6
#define SQL_REAL 7
#define SQL_DOUBLE 8
#define SQL_DATETIME 9
#define SQL_VARCHAR 12

Пример ниже показывает как этим можно воспользоваться. Он просматривает все колонки в поисках поля типа Integer и при нахождении выдает о нем информацию:

for (short x=0;x < nFields;x++)
{
	CODBCFieldInfo fieldinfo;
	short pos=x;
	cr.GetODBCFieldInfo(pos,fieldinfo );
	if (fieldinfo.m_nSQLType==SQL_INTEGER)
		AfxMessageBox("integer " + fieldinfo.m_strName); 
}

Поле структуры m_nPrecision соотвествует в ACCESS ширине поля. Вот этой позиции структуры базы:

7_1.gif (2299 b)

Поле Scale говорит о том, сколько знаков после запятой у числового поля, а m_nNullability отвечает за то, может ли это поле принимать NULL. И для этого данное поле необходимо сравнить с SQL_NULLABLE или с SQL_NO_NULLS.


| |
Автор Каев Артем.
[AD]