IBM Informix数据库中INT8类型的RFX等效数据类型

时间:2012-04-12 06:37:48

标签: c++ visual-studio visual-c++ informix

我在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?如果没有,那我该怎么办呢?

1 个答案:

答案 0 :(得分:1)

您只能在INT8中存储19位数字,而不是20.如果您需要20位数字,请使用DECIMAL(20,0)。

你应该使用BIGINT而不是INT8; BIGINT在磁盘上占用8个字节,而INT8在磁盘上占用10个字节(不要问)。

这与前两个有关RFX和64位整数的问题有何不同?

  1. RFX_BigInt Error
  2. RFX Equivalent Data Type for __int64 in Informix
  3. 至于MS Visual C ++ 6.0中的可能性,对不起,我不知道。维基百科说它于1998年发布;那有点旧,不是吗?它可能不支持64位数据类型,这很可能是您在使用64位数据时遇到问题的原因。