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

📄 error.cpp

📁 用测试OLE DB提供者的一个程序。能够测试出OEL DB提供者到底实现了哪些接口?很灵的。
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	VALUE_CHAR(DBPROP_DATASOURCE_TYPE),
	VALUE_CHAR(MDPROP_AXES),
	VALUE_CHAR(MDPROP_FLATTENING_SUPPORT),
	VALUE_CHAR(MDPROP_MDX_JOINCUBES),
	VALUE_CHAR(MDPROP_NAMED_LEVELS),
	VALUE_CHAR(MDPROP_RANGEROWSET),
	VALUE_CHAR(MDPROP_MDX_SLICER),
	VALUE_CHAR(MDPROP_MDX_CUBEQUALIFICATION),
	VALUE_CHAR(MDPROP_MDX_OUTERREFERENCE),
	VALUE_CHAR(MDPROP_MDX_QUERYBYPROPERTY),
	VALUE_CHAR(MDPROP_MDX_CASESUPPORT),
	VALUE_CHAR(MDPROP_MDX_STRING_COMPOP),
	VALUE_CHAR(MDPROP_MDX_DESCFLAGS),
	VALUE_CHAR(MDPROP_MDX_SET_FUNCTIONS),
	VALUE_CHAR(MDPROP_MDX_MEMBER_FUNCTIONS),
	VALUE_CHAR(MDPROP_MDX_NUMERIC_FUNCTIONS),
	VALUE_CHAR(MDPROP_MDX_FORMULAS),
	VALUE_CHAR(MDPROP_MDX_AGGREGATECELL_UPDATE),
	VALUE_CHAR(DBPROP_ACCESSORDER),
	VALUE_CHAR(DBPROP_BOOKMARKINFO),
	VALUE_CHAR(DBPROP_INIT_CATALOG),
	VALUE_CHAR(DBPROP_ROW_BULKOPS),
	VALUE_CHAR(DBPROP_PROVIDERFRIENDLYNAME),
	VALUE_CHAR(DBPROP_LOCKMODE),
	VALUE_CHAR(DBPROP_MULTIPLECONNECTIONS),
	VALUE_CHAR(DBPROP_UNIQUEROWS),
	VALUE_CHAR(DBPROP_SERVERDATAONINSERT),
	VALUE_CHAR(DBPROP_STORAGEFLAGS),
	VALUE_CHAR(DBPROP_CONNECTIONSTATUS),
	VALUE_CHAR(DBPROP_ALTERCOLUMN),
	VALUE_CHAR(DBPROP_COLUMNLCID),
	VALUE_CHAR(DBPROP_RESETDATASOURCE),
	VALUE_CHAR(DBPROP_INIT_OLEDBSERVICES),
	VALUE_CHAR(DBPROP_IRowsetRefresh),
	VALUE_CHAR(DBPROP_SERVERNAME),
	VALUE_CHAR(DBPROP_IParentRowset),
	VALUE_CHAR(DBPROP_HIDDENCOLUMNS),
	VALUE_CHAR(DBPROP_PROVIDERMEMORY),
	VALUE_CHAR(DBPROP_CLIENTCURSOR),
};


////////////////////////////////////////////////////////////////////////
// PROPFLAGS
//
////////////////////////////////////////////////////////////////////////
const static NAMEMAP g_rgPropFlagsMap[] =
{
    VALUE_CHAR(DBPROPFLAGS_NOTSUPPORTED	),
	VALUE_CHAR(DBPROPFLAGS_COLUMN	),
	VALUE_CHAR(DBPROPFLAGS_DATASOURCE	),
	VALUE_CHAR(DBPROPFLAGS_DATASOURCECREATE	),
	VALUE_CHAR(DBPROPFLAGS_DATASOURCEINFO	),
	VALUE_CHAR(DBPROPFLAGS_DBINIT	),
	VALUE_CHAR(DBPROPFLAGS_INDEX	),
	VALUE_CHAR(DBPROPFLAGS_ROWSET	),
	VALUE_CHAR(DBPROPFLAGS_TABLE	),
	VALUE_CHAR(DBPROPFLAGS_COLUMNOK	),
	VALUE_CHAR(DBPROPFLAGS_READ	),
	VALUE_CHAR(DBPROPFLAGS_WRITE	),
	VALUE_CHAR(DBPROPFLAGS_REQUIRED	),
	VALUE_CHAR(DBPROPFLAGS_SESSION	),
};


const static NAMEMAP g_rgIsoLevels[] =
{
	VALUE_CHAR(ISOLATIONLEVEL_UNSPECIFIED	),
	VALUE_CHAR(ISOLATIONLEVEL_CHAOS	),
	VALUE_CHAR(ISOLATIONLEVEL_READUNCOMMITTED	),
	VALUE_CHAR(ISOLATIONLEVEL_BROWSE	),
	VALUE_CHAR(ISOLATIONLEVEL_CURSORSTABILITY	),
	VALUE_CHAR(ISOLATIONLEVEL_READCOMMITTED	),
	VALUE_CHAR(ISOLATIONLEVEL_REPEATABLEREAD	),
	VALUE_CHAR(ISOLATIONLEVEL_SERIALIZABLE	),
	VALUE_CHAR(ISOLATIONLEVEL_ISOLATED	),
};
const static ULONG g_cIsoLevels = NUMELE(g_rgIsoLevels);


const static NAMEMAP g_rgXACTTC[] =
{	
	VALUE_CHAR(XACTTC_SYNC_PHASEONE	),
	VALUE_CHAR(XACTTC_SYNC_PHASETWO	),
	VALUE_CHAR(XACTTC_SYNC	),
	VALUE_CHAR(XACTTC_ASYNC_PHASEONE	),
};
const static ULONG g_cXACTTC = NUMELE(g_rgXACTTC);

			
////////////////////////////////////////////////////////////////////////
// CHAR* GetPropertyName
//
////////////////////////////////////////////////////////////////////////
CHAR* GetPropertyName(DBPROPID dwPropertyID, GUID guidPropertySet)
{
	//Thankfully all OLEDB Properties have different DBPROPIDs, (all unique)
	//The problem is that provider specific properties may not be.
	//So if we know the set we can find the property, otherwsie we don't know it...
	if(guidPropertySet == DBPROPSET_COLUMN ||
		guidPropertySet == DBPROPSET_DATASOURCE ||
		guidPropertySet == DBPROPSET_DATASOURCEINFO ||
		guidPropertySet == DBPROPSET_DBINIT ||
		guidPropertySet == DBPROPSET_INDEX || 
		guidPropertySet == DBPROPSET_ROWSET || 
		guidPropertySet == DBPROPSET_TABLE ||
		guidPropertySet == DBPROPSET_DATASOURCEALL ||
		guidPropertySet == DBPROPSET_DATASOURCEINFOALL ||
		guidPropertySet == DBPROPSET_ROWSETALL ||
		guidPropertySet == DBPROPSET_SESSION ||
		guidPropertySet == DBPROPSET_SESSIONALL ||
		guidPropertySet == DBPROPSET_DBINITALL ||
		guidPropertySet == DBPROPSET_PROPERTIESINERROR ||
		guidPropertySet == DBPROPSET_VIEW)
	{
		return GetMapName(dwPropertyID, NUMELE(g_rgOLEDBPropMap), g_rgOLEDBPropMap);
	}

	//Otherwise we have no clue what the property is...
	return NULL;
}




////////////////////////////////////////////////////////////////////////
// CHAR* GetPropSetName
//
////////////////////////////////////////////////////////////////////////
CHAR* GetPropSetName(GUID guidPropertySet)
{
	return GetMapName(guidPropertySet, g_cPropSetMaps, g_rgPropSetMap);
}

////////////////////////////////////////////////////////////////////////
// CHAR* GetMapName
//
////////////////////////////////////////////////////////////////////////
CHAR* GetMapName(LONG lItem, ULONG cNameMap, const NAMEMAP* rgNameMap)
{
	ASSERT(rgNameMap);
	for(ULONG i=0; i<cNameMap; i++)
	{
		if(lItem == rgNameMap[i].lItem) 
			return rgNameMap[i].pszName;
	}

	//Otherwise just return last element
	return NULL;
}


////////////////////////////////////////////////////////////////////////
// LONG GetMapName
//
////////////////////////////////////////////////////////////////////////
LONG GetMapName(WCHAR* pwsz, ULONG cNameMap, const WIDENAMEMAP* rgNameMap)
{
	ASSERT(pwsz);
	ASSERT(rgNameMap);
	for(ULONG i=0; i<cNameMap; i++)
	{
		if(wcscmp(pwsz, rgNameMap[i].pwszName)==0) 
			return rgNameMap[i].lItem;
	}

	//Otherwise just return last element
	return -1;
}

////////////////////////////////////////////////////////////////////////
// LONG GetMapName
//
////////////////////////////////////////////////////////////////////////
LONG GetMapName(CHAR* psz, ULONG cNameMap, const NAMEMAP* rgNameMap)
{
	ASSERT(psz);
	ASSERT(rgNameMap);
	for(ULONG i=0; i<cNameMap; i++)
	{
		if(strcmp(psz, rgNameMap[i].pszName)==0) 
			return rgNameMap[i].lItem;
	}

	//Otherwise just return last element
	return -1;
}


////////////////////////////////////////////////////////////////////////
// WCHAR* GetMapName
//
////////////////////////////////////////////////////////////////////////
WCHAR* GetMapName(LONG lItem, ULONG cNameMap, const WIDENAMEMAP* rgNameMap)
{
	ASSERT(rgNameMap);
	for(ULONG i=0; i<cNameMap; i++)
	{
		if(lItem == rgNameMap[i].lItem) 
			return rgNameMap[i].pwszName;
	}

	//Otherwise just return last element
	return NULL;
}

////////////////////////////////////////////////////////////////////////
// CHAR* GetMapName
//
////////////////////////////////////////////////////////////////////////
CHAR* GetMapName(GUID guid, ULONG cGuidMap, const GUIDMAP* rgGuidMap)
{
	for(ULONG i=0; i<cGuidMap; i++)	
	{
		if(guid == *(rgGuidMap[i].pGuid)) 
			return rgGuidMap[i].pszName;
	}

	//Otherwise just return last element
	return NULL;
}


////////////////////////////////////////////////////////////////////////
// WCHAR* GetErrorName
//
////////////////////////////////////////////////////////////////////////
WCHAR* GetErrorName(HRESULT hr)
{
	return GetMapName(hr, NUMELE(g_rgErrorMap), g_rgErrorMap);
}

////////////////////////////////////////////////////////////////////////
// CHAR* GetInterfaceName
//
////////////////////////////////////////////////////////////////////////
CHAR* GetInterfaceName(REFIID riid)
{
	return GetMapName(riid, NUMELE(g_rgInterfaceMap), g_rgInterfaceMap);
}



////////////////////////////////////////////////////////////////////////
// HRESULT DisplayBindingErrors
//
/////////////////////////////////////////////////////////////////////////////
HRESULT DisplayBindingErrors(HWND hWnd, ULONG cBindings, DBBINDING* rgBindings, void* pData)
{
	//Display the badstatus for pData operations.
	//(ie:  GetData / SetData / InsertRow)
	HRESULT hr = S_OK;
	INT iSelect = 0;

	for(ULONG i=0; i<cBindings; i++)
	{
		ASSERT(pData);
		ASSERT(rgBindings);
		DBSTATUS dwStatus = BINDING_STATUS(rgBindings[i], pData);
		
		switch(dwStatus)
		{
			case DBSTATUS_S_OK:
			case DBSTATUS_S_ISNULL:
			case DBSTATUS_S_DEFAULT:
				break;

			//Display Status Error to the user...
			default:
			{	
				iSelect = wMessageBox(hWnd, MB_TASKMODAL | MB_ICONERROR | MB_OKCANCEL, wsz_ERROR, 
					L"Binding Status Errors:\n"
					L"rgBindings[%d]\n\n"
					L"iOrdinal = %d\n"
					L"wType = %s\n"
					L"cbMaxLen = %d\n"
					L"bPrecision = %d\n"
					L"bScale = %d\n\n"
					L"DBSTATUS = %S",
					i,
					rgBindings[i].iOrdinal,
					GetDBTypeName(rgBindings[i].wType),
					rgBindings[i].cbMaxLen,
					rgBindings[i].bPrecision,
					rgBindings[i].bScale,
					GetStatusName(dwStatus)
					);

				if(iSelect == IDCANCEL)
					goto CLEANUP;
				break;
			}
		}
	}

CLEANUP:
	return hr;
}


////////////////////////////////////////////////////////////////////////
// STATUSMAP
//
////////////////////////////////////////////////////////////////////////
const static NAMEMAP g_rgRowStatusMap[] =
{	
    VALUE_CHAR(DBROWSTATUS_S_OK	),
	VALUE_CHAR(DBROWSTATUS_S_MULTIPLECHANGES	),
	VALUE_CHAR(DBROWSTATUS_S_PENDINGCHANGES	),
	VALUE_CHAR(DBROWSTATUS_E_CANCELED	),
	VALUE_CHAR(DBROWSTATUS_E_CANTRELEASE	),
	VALUE_CHAR(DBROWSTATUS_E_CONCURRENCYVIOLATION	),
	VALUE_CHAR(DBROWSTATUS_E_DELETED	),
	VALUE_CHAR(DBROWSTATUS_E_PENDINGINSERT	),
	VALUE_CHAR(DBROWSTATUS_E_NEWLYINSERTED	),
	VALUE_CHAR(DBROWSTATUS_E_INTEGRITYVIOLATION	),
	VALUE_CHAR(DBROWSTATUS_E_INVALID	),
	VALUE_CHAR(DBROWSTATUS_E_MAXPENDCHANGESEXCEEDED	),
	VALUE_CHAR(DBROWSTATUS_E_OBJECTOPEN	),
	VALUE_CHAR(DBROWSTATUS_E_OUTOFMEMORY	),
	VALUE_CHAR(DBROWSTATUS_E_PERMISSIONDENIED	),
	VALUE_CHAR(DBROWSTATUS_E_LIMITREACHED	),
	VALUE_CHAR(DBROWSTATUS_E_SCHEMAVIOLATION	),
	VALUE_CHAR(DBROWSTATUS_E_FAIL	),
};

////////////////////////////////////////////////////////////////////////
// HRESULT DisplayRowErrors
//
/////////////////////////////////////////////////////////////////////////////
HRESULT DisplayRowErrors(HWND hWnd, ULONG cRows, HROW* rghRows, DBROWSTATUS* rgRowStatus)
{
	//Display the badstatus for row operations.
	HRESULT hr = S_OK;
	INT iSelect = 0;

	for(ULONG i=0; i<cRows; i++)
	{
		ASSERT(rghRows);
		ASSERT(rgRowStatus);
		
		switch(rgRowStatus[i])
		{
			case DBROWSTATUS_S_OK:
				break;

			//Display RowStatus Error to the user...
			default:
			{
				iSelect = wMessageBox(hWnd, MB_TASKMODAL | MB_ICONERROR | MB_OKCANCEL, wsz_ERROR, 
					L"Row Status Errors:\n\n"
					L"rghRow[%d] = 0x%08x\n"
					L"DBROWSTATUS = %d=%S",
					i,
					rghRows[i],
					rgRowStatus[i],
					GetMapName(rgRowStatus[i], NUMELE(g_rgRowStatusMap), g_rgRowStatusMap)
					);

				if(iSelect == IDCANCEL)
					goto CLEANUP;
				break;
			}
		}
	}

CLEANUP:
	return hr;
}


////////////////////////////////////////////////////////////////////////
// STATUSMAP
//
////////////////////////////////////////////////////////////////////////
const static NAMEMAP g_rgBindStatusMap[] =
{	
    VALUE_CHAR(DBBINDSTATUS_OK	),
	VALUE_CHAR(DBBINDSTATUS_BADORDINAL	),
	VALUE_CHAR(DBBINDSTATUS_UNSUPPORTEDCONVERSION	),
	VALUE_CHAR(DBBINDSTATUS_BADBINDINFO	),
	VALUE_CHAR(DBBINDSTATUS_BADSTORAGEFLAGS	),
	VALUE_CHAR(DBBINDSTATUS_NOINTERFACE	),
	VALUE_CHAR(DBBINDSTATUS_MULTIPLESTORAGE	),
};

////////////////////////////////////////////////////////////////////////
// HRESULT DisplayAccessorErrors
//
/////////////////////////////////////////////////////////////////////////////
HRESULT DisplayAccessorErrors(HWND hWnd, ULONG cBindings, DBBINDING* rgBindings, DBBINDSTATUS* rgStatus)
{
	//Display the badstatus for row operations.
	HRESULT hr = S_OK;
	INT iSelect = 0;

	for(ULONG i=0; i<cBindings; i++)
	{
		ASSERT(rgBindings);
		ASSERT(rgStatus);
		
		switch(rgStatus[i])

⌨️ 快捷键说明

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