我在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位整数的两个问题有何不同?

  • RFX_BigInt Error
  • RFX Equivalent Data Type for __int64 in Informix

  • 至于在MS Visual C++ 6.0中可能出现的情况,很抱歉,我不知道。维基百科说它是在1998年发布的。那有点旧,不是吗?它可能不支持64位数据类型,这很可能就是为什么在使用64位数据类型时遇到问题。

    关于c++ - IBM Informix数据库中INT8类型的RFX等效数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10118616/

    10-13 08:31
    查看更多