我在INT8类型的IBM Informix数据库中有一个字段来保存20位数字。 MSVC++中的等效数据类型应该是什么(RFX等效数据类型)?我正在使用Visual C++,而我的IDE是Visual Studio 6.0。
字段initial_amount将这样声明:
RFX_Int64(pFX, _T("[initial_amount]"), m_initial_amount);
我为相同的代码编写了以下自定义RFX定义代码。
但是似乎有同样的问题。
void AFXAPI RFX_Int64(CFieldExchange* pFX, LPCTSTR szName, __int64& value)
{
ASSERT(AfxIsValidAddress(pFX, sizeof(CFieldExchange)));
ASSERT(AfxIsValidString(szName));
UINT nField;
if (!pFX->IsFieldType(&nField))
return;
LONG* 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_DOUBLE &&
pODBCInfo->m_nSQLType != SQL_FLOAT)
{
// Warn of possible field schema mismatch
if (afxTraceFlags & traceDatabase)
TRACE1("Warning: double converted from SQL type %ld.\n",
pODBCInfo->m_nSQLType);
}
#endif
}
// fall through
default:
LDefault:
pFX->Default(szName, &value, plLength, SQL_BIGINT ,
sizeof(value), 22);
return;
case CFieldExchange::Fixup:
if (*plLength == SQL_NULL_DATA)
{
pFX->m_prs->SetNullFieldStatus(nField - 1);
value = afxDoublePseudoNull;
}
return;
case CFieldExchange::SetFieldNull:
if ((pFX->m_pvField == NULL &&
pFX->m_nFieldType == CFieldExchange::outputColumn) ||
pFX->m_pvField == &value)
{
if (pFX->m_bField)
{
pFX->m_prs->SetNullFieldStatus(nField - 1);
value = afxDoublePseudoNull;
*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 != afxDoublePseudoNull)
{
pFX->m_prs->SetDirtyFieldStatus(nField - 1);
pFX->m_prs->ClearNullFieldStatus(nField - 1);
}
return;
case CFieldExchange::MarkForUpdate:
if (value != afxDoublePseudoNull)
pFX->m_prs->ClearNullFieldStatus(nField - 1);
goto LDefault;
case CFieldExchange::AllocCache:
{
CFieldInfo* pInfo = &pFX->m_prs->m_rgFieldInfos[nField - 1];
pInfo->m_pvDataCache = new __int64;
pInfo->m_nDataType = AFX_RFX_DOUBLE;
}
return;
#ifdef _DEBUG
// case CFieldExchange::DumpField:
// {
// *pFX->m_pdcDump << "\n" << szName << " = " << value;
// }
return;
#endif //_DEBUG
}
}
这段代码适用于Visual C++ 6.0吗?如果没有,那我应该怎么办?
最佳答案
您只能在INT8中获得19位数字,而不是20位。如果需要20位数字,请使用DECIMAL(20,0)。
您应该使用BIGINT而不是INT8; BIGINT在磁盘上占用8个字节,而INT8在磁盘上占用10个字节(不要问)。
这与您先前关于RFX和64位整数的两个问题有何不同?
至于在MS Visual C++ 6.0中可能出现的情况,很抱歉,我不知道。维基百科说它是在1998年发布的。那有点旧,不是吗?它可能不支持64位数据类型,这很可能就是为什么在使用64位数据类型时遇到问题。
关于c++ - IBM Informix数据库中INT8类型的RFX等效数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10118616/