1

IBM Informixデータベースに、20桁の数字を保持するINT8タイプのフィールドがあります。MSVC ++の同等のデータ型(RFXの同等のデータ型)は何である必要がありますか?Visual C ++を使用していて、IDEはVisualStudio6.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

    }
}

このコードはVisualC++ 6.0で機能しますか?そうでない場合は、どうすればよいですか?

4

1 に答える 1

1

INT8に格納できるのは20桁ではなく、19桁のみです。20桁が必要な場合は、DECIMAL(20,0)を使用してください。

INT8ではなくBIGINTを使用する必要があります。BIGINTはディスク上で8バイトを占有しますが、INT8はディスク上で10バイトを占有します(尋ねないでください)。

これは、RFXおよび64ビット整数に関する前の2つの質問とどのように異なりますか?

  1. RFX_BigIntエラー
  2. Informixの__int64のRFX相当のデータ型

MS Visual C ++ 6.0で可能なことについては、申し訳ありませんが、わかりません。ウィキペディアによると、1998年にリリースされました。少し古いですね。64ビットデータ型をサポートしていない可能性があります。これが、64ビットデータ型を使用するときに問題が発生する理由である可能性があります。

于 2012-04-14T03:00:06.817 に答える