DoModal()函数运行时报错怎么解决
点重试之后,显示这段代码
黄箭头在44行代码VERIFY(m_pDynamicAccessor->GetColumnType(nCol, &dbType));【所在源文件是OCCSITE.cpp】
HRESULT CDataSourceControl::UpdateCursor()
{
HRESULT hRes;
int nVariant = 0;
int nDirtyField = 0;
if (m_pDataSource != NULL)
{
if(m_pDynamicAccessor == NULL)
return S_OK;
// First go through all simple bound properties
for (int nCol=1; nCol<=m_nColumns; nCol++)
{
POSITION pos = m_pMetaRowData[nCol - 1].m_pClientList->GetHeadPosition();
while (pos)
{
COleControlSite* pSite = (COleControlSite *)
m_pMetaRowData[nCol - 1].m_pClientList->GetNext(pos);
DBTYPE dbType;
if (pSite->m_bIsDirty)
{
pSite->m_bIsDirty = FALSE;
nDirtyField++;
if (nDirtyField == 1)
{
// UpdateinProgress semaphore - unexpected state
ASSERT(!m_bUpdateInProgress);
m_bUpdateInProgress = TRUE;
}
COleVariant var(pSite->m_varResult);
CManualAccessor accessor;
// Create accessor for output column
accessor.CreateAccessor(1, m_pDynamicAccessor->GetValue(nCol), m_pDynamicAccessor->m_pColumnInfo[nCol].ulColumnSize);
accessor.AddBindEntry(m_pDynamicAccessor->m_pColumnInfo[nCol].iOrdinal,
m_pDynamicAccessor->m_pColumnInfo[nCol].wType,
m_pDynamicAccessor->m_pColumnInfo[nCol].ulColumnSize,
m_pDynamicAccessor->GetValue(nCol));
accessor.BindColumns(m_pRowset->m_spRowset);
VERIFY(m_pDynamicAccessor->GetColumnType(nCol, &dbType));
switch(dbType)
{
case DBTYPE_I2:
var.ChangeType(VT_I2);
m_pDynamicAccessor->SetValue(nCol, var.iVal);
break;
case DBTYPE_I4:
var.ChangeType(VT_I4);
m_pDynamicAccessor->SetValue(nCol, var.lVal);
break;
case DBTYPE_R4:
var.ChangeType(VT_R4);
m_pDynamicAccessor->SetValue(nCol, var.fltVal);
break;
case DBTYPE_R8:
var.ChangeType(VT_R8);
m_pDynamicAccessor->SetValue(nCol, var.dblVal);
break;
case DBTYPE_CY:
var.ChangeType(VT_CY);
*(CY*)m_pDynamicAccessor->GetValue(nCol) = var.cyVal;
break;
case DBTYPE_DATE:
var.ChangeType(VT_DATE);
m_pDynamicAccessor->SetValue(nCol, var.date);
break;
case DBTYPE_BSTR:
case DBTYPE_WSTR:
var.ChangeType(VT_BSTR);
wcsncpy((wchar_t*)m_pDynamicAccessor->GetValue(nCol), var.bstrVal, m_pDynamicAccessor->m_pColumnInfo[nCol].ulColumnSize);
break;
case DBTYPE_BOOL:
var.ChangeType(VT_BOOL);
m_pDynamicAccessor->SetValue(nCol, var.boolVal);
break;
case DBTYPE_DECIMAL:
var.ChangeType(VT_DECIMAL);
m_pDynamicAccessor->SetValue(nCol, var.decVal);
break;
case DBTYPE_UI1:
var.ChangeType(VT_UI1);
m_pDynamicAccessor->SetValue(nCol, var.bVal);
break;
case DBTYPE_I1:
var.ChangeType(VT_I1);
m_pDynamicAccessor->SetValue(nCol, (signed char)var.cVal);
break;
case DBTYPE_UI2:
var.ChangeType(VT_UI2);
m_pDynamicAccessor->SetValue(nCol, var.uiVal);
break;
case DBTYPE_UI4:
var.ChangeType(VT_UI4);
m_pDynamicAccessor->SetValue(nCol, var.ulVal);
break;
case DBTYPE_STR:
var.ChangeType(VT_BSTR);
WideCharToMultiByte(CP_ACP, 0, var.bstrVal, -1, (char*)m_pDynamicAccessor->GetValue(nCol),
m_pDynamicAccessor->m_pColumnInfo[nCol].ulColumnSize, NULL, NULL);
break;
case DBTYPE_DBTIMESTAMP:
DBTIMESTAMP ts;
SYSTEMTIMEsysTime;
var.ChangeType(VT_DATE);
memset(&ts, 0, sizeof(DBTIMESTAMP));
VariantTimeToSystemTime(var.date, &sysTime);
ts.year = sysTime.wYear;
ts.month = sysTime.wMonth;
ts.day = sysTime.wDay;
ts.hour = sysTime.wHour;
ts.minute = sysTime.wMinute;
ts.second = sysTime.wSecond;
ts.fraction = sysTime.wMilliseconds / 1000000;
m_pDynamicAccessor->SetValue(nCol, ts);
break;
default:
TRACE2("Unsupported DBTYPE (%d) in column %d\n", dbType, nCol);
break;
}
m_pRowset->SetAccessor(&accessor);
m_pRowset->SetData();
m_pRowset->SetAccessor(m_pDynamicAccessor);
::VariantClear(&pSite->m_varResult);
}
nVariant++;
}
}
if (nDirtyField > 0)
{
m_bUpdateInProgress = FALSE;
}
return S_OK;
}
// Do we have an updateable cursor?
if (m_pCursorUpdateARow == NULL)
{
// If not attempt to get one
hRes = m_pCursorMove->QueryInterface(IID_ICursorUpdateARow,
(LPVOID *)&m_pCursorUpdateARow);
if (FAILED(hRes))
return S_OK; // no update cursor, so forget updating
}
// First go through all simple bound properties
for (int nCol=0; nCol<m_nColumns; nCol++)
{
POSITION pos = m_pMetaRowData[nCol].m_pClientList->GetHeadPosition();
while (pos)
{
COleControlSite* pSite = (COleControlSite *)
m_pMetaRowData[nCol].m_pClientList->GetNext(pos);
if (pSite->m_bIsDirty)
{
pSite->m_bIsDirty = FALSE;
nDirtyField++;
if (nDirtyField == 1)
{
DWORD dwEdit;
hRes = m_pCursorUpdateARow->GetEditMode(&dwEdit);
if (FAILED(hRes))
return hRes;
if (dwEdit == DBEDITMODE_NONE)
{
hRes = m_pCursorUpdateARow->BeginUpdate(DBROWACTION_UPDATE);
if (FAILED(hRes))
return hRes;
}
// UpdateinProgress semaphore - unexpected state
ASSERT(!m_bUpdateInProgress);
m_bUpdateInProgress = TRUE;
}
DBBINDPARAMS bpBindParams;
DWORD dwIndicator = sizeof(VARIANT);
COleVariant vt;
switch (V_VT(&pSite->m_varResult))
{
case VT_EMPTY:
case VT_NULL:
case VT_ERROR:
dwIndicator = DB_NULL;
vt = pSite->m_varResult;
break;
case VT_BSTR:
if(*pSite->m_varResult.bstrVal == 0)
{
dwIndicator = DB_NULL;
break;
}
default:
vt = pSite->m_varResult;
break;
}
bpBindParams.cbMaxLen = 0L;
bpBindParams.dwBinding = DBBINDING_VARIANT;
bpBindParams.dwDataType = m_pColumnBindings[nVariant].dwDataType;
bpBindParams.cbVarDataLen = 0L;
bpBindParams.dwInfo = dwIndicator;
bpBindParams.pData = &vt;
hRes = m_pCursorUpdateARow->SetColumn(&m_pColumnBindings[nVariant].columnID, &bpBindParams);
::VariantClear(&pSite->m_varResult);
}
nVariant++;
}
}
// Now go through all cursor bound properties
POSITION pos = m_CursorBoundProps.GetHeadPosition();
while (pos != NULL)
{
CDataBoundProperty* pProp = (CDataBoundProperty*) m_CursorBoundProps.GetNext(pos);
if (pProp->m_pClientSite->m_pObject == NULL)
continue;
IBoundObject *pBO;
if (SUCCEEDED(pProp->m_pClientSite->m_pObject->QueryInterface(IID_IBoundObject,
(LPVOID *) &pBO)))
{
if (pBO->IsDirty(pProp->m_dispid) == S_OK)
{
nDirtyField++;
if (nDirtyField == 1)
{
DWORD dwEdit;
hRes = m_pCursorUpdateARow->GetEditMode(&dwEdit);
if (FAILED(hRes))
return hRes;
if (dwEdit == DBEDITMODE_NONE)
{
hRes = m_pCursorUpdateARow->BeginUpdate(DBROWACTION_UPDATE);
if (FAILED(hRes))
return hRes;
}
// UpdateinProgress semaphore - unexpected state
ASSERT(!m_bUpdateInProgress);
m_bUpdateInProgress = TRUE;
}
}
pBO->Release();
}
}
if (nDirtyField > 0)
{
hRes = m_pCursorUpdateARow->Update(0,0,0);
m_bUpdateInProgress = FALSE;
if (FAILED(hRes))
{
// Update failed w/dirty controls
ASSERT(hRes!= S_OK);
UpdateControls();
return hRes;
}
}
return S_OK;
}