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

📄 odbctypeinfo.cpp

📁 实例有关说明: 数据源:本实例使用的数据源在本章实例MyOdbcSmpl目录中
💻 CPP
字号:
// ODBCTypeInfo.cpp: implementation of the CODBCTypeInfo class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "MyOdbcSmpl.h"
#include "ODBCTypeInfo.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

#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
		CMapStringToPtr* pmapColNameToDataAttr = new CMapStringToPtr();

		m_mapDataTypeToDataAttrMap.SetAt(aiDataTypes[iCurrDataType], static_cast<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 (GOOD_PTR(pvarValue, CDBVariant))
						{
							pmapColNameToDataAttr->SetAt(strColName, static_cast<void*>(pvarValue));
						}///Mod by ldg//*/
					}
				}
			}
			::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 (GOOD_PTR(pmapColNameToDataAttr, CMapStringToOb))///Mod by ldg//*/
		{
			POSITION pos;
			CString strKey;
			CDBVariantEx* pvarValue;

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

				/*if (GOOD_PTR(pvarValue, CDBVariantEx))
				{
					// delete pvarValue;
				}///Mod by ldg//*/
				pmapColNameToDataAttr->RemoveKey(strKey);
			}
			//LOG_ASSERT(0 == pmapColNameToDataAttr->GetCount());///Mod by ldg//*/
			delete pmapColNameToDataAttr;
		}
		m_mapDataTypeToDataAttrMap.RemoveKey(wKey);
	}
	//LOG_ASSERT(0 == m_mapDataTypeToDataAttrMap.GetCount());///Mod by ldg//*//

	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 + -