2017-05-12 1 views
0

Mit OLEDB von C++ ich DBTYPE_NUMERIC von DB2 für Dezimalfeldern und konvertieren wie so DECIMAL (Fehler ausgelassen Prüfung):DB2 Dezimalfeldern wieder als negativ DBTYPE_NUMERIC von OLEDB

... 
CDynamicAccessor* pAccessor = GetAccessor(); 
... 
DBTYPE dbT=0; 
pAccessor->GetColumnType(nIndex, &dbT); 
if (dbT == DBTYPE_NUMERIC) 
{ 
    DB_NUMERIC* pNum = (DB_NUMERIC*)pAccessor->GetValue(nIndex); 
    DECIMAL dec; 
    DECIMAL_SETZERO(dec); 
    dec.sign = pNum->sign; // <--this comes back as 1 for positive fields and 0 for negative 
    dec.scale = pNum->scale; 
    memcpy(&dec.Hi32, pNum->val + 8, 4); 
    memcpy(&dec.Lo64, pNum->val, 8); 
    .... 
} 

Was ich nicht verstehe, ist, warum DB_NUMERIC :: sign als 1 für positive Dezimalfelder in DB2 und 0 für negative zurückkommt. Ist das korrektes Verhalten? Per Definition here ist es das Gegenteil für DECIMAL - 0 sollte für positiv sein. Ist es eine db/Feldeinstellung? In der Datenbank sieht alles positiv aus. Und wenn ich einen Wert in db als negativ einstelle, kommt es wieder positiv. Daher wird das Zeichen in der zurückgegebenen DB_NUMERIC-Struktur für Positive aktiviert und für Negativ deaktiviert. Es ist eine Umkehrung/Umkehrung dessen, was zu erwarten ist. Was ist los mit dir? BTW: Ich kann keine Dokumente auf DB_NUMERIC finden, die in oledb.h überall ist. Bitte helfen. Vielen Dank im Voraus!

Antwort

0

Gefunden ein obskures Dokument in MSDN, die bestätigt, dass DB_NUMERIC und DECIMAL das Zeichen fast entgegengesetzte Möglichkeiten behandeln.