ODBC Datenfeld mit Binärdaten

tinopolis

Mitglied
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
}
 
1. Bitte verwende CODE-Tags, wenn Du Code postest.
2. Welcher Zeiger ändert sich?
3. Wenn sich während einer Kopieraktion plötzlich unmotiviert eine Variable ändert, dann ist meistens zuviel kopiert worden und die Variable wurde im Speicher überschrieben. Prüfe nochmal Deine Strukturgrößen und die Größe des kopierten Datenblockes.
 
Hi,

1. Tschuldigung Code Tags kannte ich nicht.
2.
Code:
AfxCopyValueByRef(&pInfo->m_pvDataCache, pvField,
plLength, pInfo->m_nDataType);
der Zeiger pvField enthält einen Zeiger auf mein CByteArray der vor diesem Befehl auch noch adressemäßig paßt. Die Adresse steht auch in pInfo->m_pvBindAddress.

Funktioniert auch alles Prima, wenn man den ASSERT ignoriert.

3. Ich habe aber Bereits
Code:
RFX_Binary(pFX, _T("[Polygon]"), m_Polygon, 65536);
65536 Bytes reserviert, brauche aber viel weniger.

Ich habe auch schon Bugfixes von Microsoft für ähnliche Probleme gefunden.

Gruß
tino
 
Zuletzt bearbeitet:
Zurück