⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 odbctypeinfo.cpp

📁 Visual_C++[1].NET_Bible1 Visual_C++宝典书中的全部源码
💻 CPP
字号:
#include "stdafx.h"
#include "ODBCTypeInfo.hpp"

#define MAX_COLNAME 50

CODBCTypeInfo::CODBCTypeInfo(LPCSTR lpszDSN)
{
	SQLRETURN rc;
	SQLHSTMT hstmt = NULL;

	int aiDataTypes[] = {
		SQL_CHAR,
		SQL_NUMERIC,
		SQL_DECIMAL,
		SQL_INTEGER,
		SQL_SMALLINT,
		SQL_FLOAT,
		SQL_REAL,
		SQL_DOUBLE,
#if (ODBCVER >= 0x0300)
		SQL_DATETIME,
#endif
		SQL_VARCHAR
	};

	m_pODBCDynamic = new CODBCDynamic(lpszDSN);

	// call sqlgettypeinfo for each member of the datatype struct defined above
	int nDataTypes = (sizeof(aiDataTypes) / sizeof(aiDataTypes[0]));
	for (int iCurrDataType = 0; iCurrDataType < nDataTypes; iCurrDataType++)
	{
		// for each type, create a column to data attr map
		CMapStringToOb* pmapColNameToDataAttr = new CMapStringToOb();

		m_mapDataTypeToDataAttrMap.SetAt(aiDataTypes[iCurrDataType], (CObject*)pmapColNameToDataAttr);

		HSTMT hstmt;
		if (SQL_SUCCESS == (rc = ::SQLAllocHandle(SQL_HANDLE_STMT, m_pODBCDynamic->GetHDBC(), &hstmt)))
		{
			if (SQL_SUCCESS == (rc = ::SQLGetTypeInfo(hstmt, aiDataTypes[iCurrDataType])))
			{
				m_pODBCDynamic->FetchData(hstmt);
				CODBCRecordArray* pODBCRecordArray = &m_pODBCDynamic->m_ODBCRecordArray;

				for (int iRecord = 0; iRecord < pODBCRecordArray->GetSize(); iRecord++)
				{
					POSITION pos;
					CString strColName;
					CDBVariantEx* pvarValue;

					CODBCRecord* pODBCRecord = (*pODBCRecordArray)[iRecord];

					for (pos = pODBCRecord->GetStartPosition(); pos != NULL;)
					{
						pODBCRecord->GetNextAssoc(pos, strColName, pvarValue);
						if (pvarValue)
						{
							pmapColNameToDataAttr->SetAt(strColName, (CObject*)pvarValue);
						}
					}
				}
			}
			::SQLFreeHandle(SQL_HANDLE_STMT, &hstmt);
		}
	}
}

CODBCTypeInfo::~CODBCTypeInfo()
{
	CMapStringToOb* pmapColNameToDataAttr;
	POSITION pos1;
	WORD wKey;
	for (pos1 = m_mapDataTypeToDataAttrMap.GetStartPosition(); pos1 != NULL;)
	{
		m_mapDataTypeToDataAttrMap.GetNextAssoc(pos1, wKey, (CObject*&)pmapColNameToDataAttr);
		if (pmapColNameToDataAttr)
		{
			POSITION pos;
			CString strKey;
			CDBVariantEx* pvarValue;

			int iCol = 0;
			for (pos = pmapColNameToDataAttr->GetStartPosition(); pos != NULL;)
			{
				pmapColNameToDataAttr->GetNextAssoc(pos, strKey, (CObject*&)pvarValue);

				if (pvarValue)
				{
					// delete pvarValue;
				}
				pmapColNameToDataAttr->RemoveKey(strKey);
			}
			ASSERT(0 == pmapColNameToDataAttr->GetCount());
			delete pmapColNameToDataAttr;
		}
		m_mapDataTypeToDataAttrMap.RemoveKey(wKey);
	}
	ASSERT(0 == m_mapDataTypeToDataAttrMap.GetCount());

	delete m_pODBCDynamic;
}

BOOL CODBCTypeInfo::GetTypeInfo(UINT iDataType, LPCSTR lpszColName, CDBVariantEx** ppvarValue)
{
	BOOL bSuccess = FALSE;

	CMapStringToOb* pmapColNameToDataAttr;
	if (m_mapDataTypeToDataAttrMap.Lookup(iDataType, (CObject*&)pmapColNameToDataAttr))
	{
		if (pmapColNameToDataAttr->Lookup(lpszColName, (CObject*&)*ppvarValue))
		{
			bSuccess = TRUE;
		}
	}

	return bSuccess;
}

BOOL CODBCTypeInfo::GetTypeInfo(UINT iDataType, CMapStringToOb*& rpMapDataAttrNameToDataAttrVal)
{
	return (m_mapDataTypeToDataAttrMap.Lookup(iDataType, (CObject*&)rpMapDataAttrNameToDataAttrVal));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -