C中数据类型的转换
兄弟姐妹帮个忙,我遇到个问题,想请教大家,先谢谢啦.
下面的程序中我想要把一些不同类型数据连接在一起然后打印出来,但是输出的结果却和实际值有出入,比如int型51输出的结果却是3,应该是强制转换(char *)行不通(红色标出的那几段都是有问题的),不知道怎么解决或是有其它的方法呢?
const std::string& CDBOci::Dump(int logMask, const char * inSqlStatement, const CDBBindVar * aBindVar)
{
int X;
int V;
long tmpNumber;
char numString[20];
float tmpFloat;
std::string logString;
if (logMask & LOG_MASK_DUMP_ERROR_SQL) {
SFW_TRACE(logMask, "<SQL Statement - ERROR>");
//QS_TRACE(LOG_MASK_ERROR,"%d\t%s", SQL_INFO,"<SQL Statement - ERROR> test");
}
else {
SFW_TRACE(logMask, "<SQL Statement>");
}
SFW_TRACE(logMask, inSqlStatement);
if (aBindVar != NULL) {
for (X = 0; X < aBindVar->varNumber; X++) {
if (aBindVar->varAttr[X].isArray == FALSE) { // Not bind array
logString = "";
logString = logString + " " + aBindVar->varAttr[X].name + " := ";
// Print out the vaiables by data type
switch (aBindVar->varAttr[X].type) {
case SQLT_INT: //int型
tmpNumber = *(int*)aBindVar->varAttr[X].placeHolder;
//itoa(tmpNumber, buffer, 10);
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_INT ",(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + [color=#FF0000](char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_UIN: // unsigned int 型
tmpNumber = *(unsigned int*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_UIN ",(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_LNG: //long 型
tmpNumber = *(long*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%d", SQL_INFO," SQLT_LNG ",(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_FLT: //float型
tmpFloat += *(float*)aBindVar->varAttr[X].placeHolder;
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%f", SQL_INFO," SQLT_FLT ",(char*)logString.c_str(),tmpFloat);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%f;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpFloat);
break;
case SQLT_CHR:
case SQLT_STR: //string 型
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s%s", SQL_INFO," SQLT_STR ",(char*)logString.c_str(),(char*)aBindVar->varAttr[X].placeHolder);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "'%s';";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), (char*)aBindVar->varAttr[X].placeHolder);
break;
}[/color] }
else { // Bind array
//aBindVar->varAttr[X].curTableSize);
//SFW_TRACE(logMask, "Bind variable is array !!! Skip dump data.");
for (V=0; V<aBindVar->varAttr[X].curTableSize; V++) {
logString = "";
sprintf(numString,"%d", V);
logString = logString + " " + aBindVar->varAttr[X].name + " [" + numString + "] := ";
// Print out the vaiables by data type
switch (aBindVar->varAttr[X].type) {
case SQLT_INT:
tmpNumber = *(int*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_UIN:
tmpNumber = *(unsigned int*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_LNG:
tmpNumber = *(long*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%d", SQL_INFO,(char*)logString.c_str(),tmpNumber);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%d;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpNumber);
break;
case SQLT_FLT:
tmpFloat += *(float*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%f", SQL_INFO,(char*)logString.c_str(),tmpFloat);
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)aBindVar->varAttr[X].placeHolder;
logString += "%f;";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), tmpFloat);
break;
case SQLT_CHR:
case SQLT_STR:
QS_TRACE(LOG_MASK_ERROR,"%d\t%s%s", SQL_INFO,(char*)logString.c_str(),(char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V)));
sSQLMsg = sSQLMsg + " " + (char*)logString.c_str() + (char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V));
logString += "'%s';";
SFW_TRACE(logMask, SFW_STRINGDATA(logString), (char*)((long)aBindVar->varAttr[X].placeHolder + (aBindVar->varAttr[X].nextVarSkipSize * V)));
break;
}
}
}
}
}
return sSQLMsg;
}