📄 error.cpp
字号:
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 + -