CRecordset und unsigned int
-
Hallo zusammen,
ich bin grad auf ein Problem gestoßen das mit überhaupt nicht schmeckt:
Ich benutze CDatabase und CRecordset um Werte in eine Datenbank zu schreiben. Einer der Werte ist ein unsigned int. In der Methode DoFieldExchange gibt es aber nur ein Marko um signed integer in die Datenbank zu schreiben. Zumindestens habe ich in der msdn nichts gefunden. Ein cast funktioniert leider nicht:unsigned int m_ms; // ... RFX_Int(pFX, _T("[ms]"), (int&)m_ms);
Kennt einer eine Lösung oder hatte auch schon mal das gleiche Problem. Es sollte doch möglich sein ein unsigned int in eine Datenbank zu schreiben.
Gruß
felix
-
unsigned int m_ms; int i = (int) m_ms; RFX_Int(pFX, _T("[ms]"), i); m_ms = (unsigned int) i;
Aber bist Du dir sicher, dass Du nicht RFX_Long verwenden solltest?
-
Danke für deine Antwort, aber leider funktioniert es so nicht:
unsigned long a = 4294967295; long b; b = (long) a; // b == -1
also versucht er –1 in die Datenbank zu schreiben. Der Datentyp in der DB ist aber unsigned int(32).
Ob int oder long macht an der Stelle keinen Unterschied, oder liege ich falsch?Gruß
felix
-
Dein Problem ist, dass Du ODBC verwendest und da gibt es diesen Datentyp (unsigned int) eben nicht. Ich empfehle Dir ADO zu verwenden...
-
Hab nochmals etwas nachgeforscht:
Vermutlich musst Du einen eigenen RFX_UInt schreiben:void AFXAPI RFX_UInt(CFieldExchange* pFX, LPCTSTR szName, unsigned int& value) { ASSERT(AfxIsValidAddress(pFX, sizeof(CFieldExchange))); ASSERT(AfxIsValidString(szName)); UINT nField; if (!pFX->IsFieldType(&nField)) return; LONG_PTR* plLength = pFX->m_prs->GetFieldLengthBuffer( nField - 1, pFX->m_nFieldType); switch (pFX->m_nOperation) { case CFieldExchange::BindFieldToColumn: { #ifdef _DEBUG // Assumes all bound fields BEFORE unbound fields CODBCFieldInfo* pODBCInfo = &pFX->m_prs->m_rgODBCFieldInfos[nField - 1]; if (pODBCInfo->m_nSQLType != SQL_C_SHORT) { // Warn of possible field schema mismatch TRACE(traceDatabase, 1, "Warning: int converted from SQL type %ld.\n", pODBCInfo->m_nSQLType); } #endif // _DEBUG } // fall through default: LDefault: pFX->Default(szName, &value, plLength, SQL_C_ULONG, sizeof(value), 5); return; case CFieldExchange::Fixup: if (*plLength == SQL_NULL_DATA) { pFX->m_prs->SetNullFieldStatus(nField - 1); value = AFX_RFX_INT_PSEUDO_NULL; } return; case CFieldExchange::SetFieldNull: if ((pFX->m_pvField == NULL && pFX->m_nFieldType == CFieldExchange::outputColumn) || pFX->m_pvField == &value) { if (pFX->m_bField) { // Mark fields null pFX->m_prs->SetNullFieldStatus(nField - 1); value = AFX_RFX_INT_PSEUDO_NULL; *plLength = SQL_NULL_DATA; } else { pFX->m_prs->ClearNullFieldStatus(nField - 1); *plLength = sizeof(value); } #ifdef _DEBUG pFX->m_nFieldFound = nField; #endif } return; case CFieldExchange::MarkForAddNew: // can force writing of psuedo-null value (as a non-null) by setting field dirty if (value != AFX_RFX_INT_PSEUDO_NULL) { pFX->m_prs->SetDirtyFieldStatus(nField - 1); pFX->m_prs->ClearNullFieldStatus(nField - 1); } return; case CFieldExchange::MarkForUpdate: if (value != AFX_RFX_INT_PSEUDO_NULL) pFX->m_prs->ClearNullFieldStatus(nField - 1); goto LDefault; case CFieldExchange::AllocCache: { CFieldInfo* pInfo = &pFX->m_prs->m_rgFieldInfos[nField - 1]; // Data cached by value, no allocation necessary pInfo->m_nDataType = AFX_RFX_INT; } return; #ifdef _DEBUG case CFieldExchange::DumpField: *pFX->m_pdcDump << "\n" << szName << " = " << value; return; #endif // _DEBUG } }
-
Wow
Vielen Dank!
Genau danach habe ich in der msdn gesucht
Ich habe die Methode nur kopiert und es hat funktioniert!
Jetzt nehme ich mir erst mal ein Kaffee und schau mir an was du da im detail machst.Nochmals vielen vielen Dank!
felix
-
felix II schrieb:
Jetzt nehme ich mir erst mal ein Kaffee und schau mir an was du da im detail machst.
~Ich habe es einfach aus dem Source kopiert (dbrfx.cpp) und etwas angepasst...~