2012-04-12 4 views
1

IBM Informixデータベースに、20桁の数字を格納するINT8タイプのフィールドがあります。 MSVC++(RFX同等のデータ型)の同等のデータ型は何ですか?私はVisual C++を使用しています。私のIDEはVisual Studio 6.0です。IBM InformixデータベースのINT8タイプのRFX相当データ型

フィールド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

INT8には19桁しか格納できません。20桁が必要な場合は、DECIMAL(20,0)を使用します。

INT8ではなくBIGINTを使用してください。 BIGINTはディスク上で8バイトを占有しますが、INT8はディスク上で10バイトを占有します(要求しません)。

RFXと64ビット整数のこれまでの2つの質問とはどのように違いますか?

  1. RFX_BigInt Error
  2. RFX Equivalent Data Type for __int64 in Informix

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

関連する問題