Hallo alle zusammen,
ich Versuche ein Memofeld in einer Access DB mit Binärdaten zu füllen.
RFX_Binary(pFX, _T("[Polygon]"), m_Polygon, 65536); // m_Polygon ist ein CByteArray
Funktionier auch soweit, nur in der MFC gibt es eine DEBUG ASSERT der manchmal auslöst. Ignoriert man diesen, funktioniert es aber super.
void AFXAPI AfxLoadField(CRecordset& rs, UINT nField,
void* pvField, long* plLength)
{
// Get the field data
CFieldInfo* pInfo = &rs.m_rgFieldInfos[nField - 1];
// Assumes old field status cleared out
rs.SetFieldStatus(nField - 1, pInfo->m_bStatus);
// If not NULL, restore the value and the length
if (!rs.IsFieldStatusNull(nField - 1))
{
if (pInfo->m_nDataType == AFX_RFX_BOOL ||
pInfo->m_nDataType == AFX_RFX_BYTE ||
pInfo->m_nDataType == AFX_RFX_INT ||
pInfo->m_nDataType == AFX_RFX_LONG ||
pInfo->m_nDataType == AFX_RFX_SINGLE)
{
// If caching data by value, pass a ref
AfxCopyValueByRef(&pInfo->m_pvDataCache, pvField,
plLength, pInfo->m_nDataType);
}
else
{
// Hier ändert sich der Zeiger
AfxCopyValueByRef(pInfo->m_pvDataCache, pvField,
plLength, pInfo->m_nDataType);
}
}
else
*plLength = SQL_NULL_DATA;
#ifdef _DEBUG
// Buffer address must not change - ODBC's SQLBindCol depends upon this
if (pInfo->m_nDataType == AFX_RFX_BINARY)
{
// Change pvField to point to the data of the CByteArray
pvField = ((CByteArray*)pvField)->GetData();
}
if (pInfo->m_pvBindAddress != pvField) // die Zeiger sind ab und zu nicht gleich
{
TRACE1("Error: field address (column %u) has changed!\n",
nField);
ASSERT(FALSE); // Dieser löst aus
}
#endif // _DEBUG
}
ich Versuche ein Memofeld in einer Access DB mit Binärdaten zu füllen.
RFX_Binary(pFX, _T("[Polygon]"), m_Polygon, 65536); // m_Polygon ist ein CByteArray
Funktionier auch soweit, nur in der MFC gibt es eine DEBUG ASSERT der manchmal auslöst. Ignoriert man diesen, funktioniert es aber super.
void AFXAPI AfxLoadField(CRecordset& rs, UINT nField,
void* pvField, long* plLength)
{
// Get the field data
CFieldInfo* pInfo = &rs.m_rgFieldInfos[nField - 1];
// Assumes old field status cleared out
rs.SetFieldStatus(nField - 1, pInfo->m_bStatus);
// If not NULL, restore the value and the length
if (!rs.IsFieldStatusNull(nField - 1))
{
if (pInfo->m_nDataType == AFX_RFX_BOOL ||
pInfo->m_nDataType == AFX_RFX_BYTE ||
pInfo->m_nDataType == AFX_RFX_INT ||
pInfo->m_nDataType == AFX_RFX_LONG ||
pInfo->m_nDataType == AFX_RFX_SINGLE)
{
// If caching data by value, pass a ref
AfxCopyValueByRef(&pInfo->m_pvDataCache, pvField,
plLength, pInfo->m_nDataType);
}
else
{
// Hier ändert sich der Zeiger
AfxCopyValueByRef(pInfo->m_pvDataCache, pvField,
plLength, pInfo->m_nDataType);
}
}
else
*plLength = SQL_NULL_DATA;
#ifdef _DEBUG
// Buffer address must not change - ODBC's SQLBindCol depends upon this
if (pInfo->m_nDataType == AFX_RFX_BINARY)
{
// Change pvField to point to the data of the CByteArray
pvField = ((CByteArray*)pvField)->GetData();
}
if (pInfo->m_pvBindAddress != pvField) // die Zeiger sind ab und zu nicht gleich
{
TRACE1("Error: field address (column %u) has changed!\n",
nField);
ASSERT(FALSE); // Dieser löst aus
}
#endif // _DEBUG
}