0

RFX_LongBinary を CLongBinary 変数と共に使用して、SQL Server varbinary(max) フィールドからデータを移動しています。ただし、現在、SQL Server は 2019 バージョンにアップグレードされ、最新の ODBC ドライバー (MSODBCSQL17.dll、バージョン 17.6.1.1) が使用されています。ただし、これにより、最大 8000 バイトを書き込むことができるという問題が発生します。それより大きいと、CRecordSet::Update() 呼び出しは失敗します。

オンラインで多くのことを読んだことで、代わりに CByteArray 変数を伴う RFX_Binary を実際に使用する必要があると確信しました。それで私はそれに変更して動作させました - データベースに大量のデータを書き込むことができます。しかし...今、RFX_Binary のコードは、CFieldExchange::SetFieldNull の場合に、CByteArray の最初のバイトを 255 (value[0] = AFX_RFX_BYTE_PSEUDO_NULL) に設定します。CRecordSet::AddNew() を呼び出すときに発生します。その呼び出しの後、私の CByteArray 変数は空ではなくなり、代わりにサイズ = 1 になり、最初のバイトの値は 255 になります。CByteArray のこの最初のバイトを何か (真のペイロード データなど) で上書きすると、CRecordSet::Update() 呼び出しがデバッグ アサーションで失敗します。

これは問題です。以前にデータベースのフィールドにシリアル化/格納されたデータは、最初のバイトが 255 に設定されていないためです (CLongBinary を使用している場合)。

dbrfx.cpp:

case CFieldExchange::SetFieldNull:
    if ((pFX->m_pvField == NULL &&
        pFX->m_nFieldType == CFieldExchange::outputColumn) ||
        pFX->m_pvField == &value)
    {
        if (pFX->m_bField)
        {
            // Mark fields null
            pFX->m_prs->SetNullFieldStatus(nField - 1);
            value.SetSize(1);
            value[0] = AFX_RFX_BYTE_PSEUDO_NULL;
            *plLength = SQL_NULL_DATA;
        }
        else
        {
            pFX->m_prs->ClearNullFieldStatus(nField - 1);
            *plLength = value.GetSize();
        } 
        ...
    }

どうすればよいですか:

  1. CLongBinary を引き続き使用し、8000 バイトを超える値を SQL Server の varbinary(max) フィールドに書き込むか、
  2. データベースに書き込まれたデータに余分なバイト (AFX_RFX_BYTE_PSEUDO_NULL == 255) が含まれているため、別のシリアル化データ形式を取得せずに CByteArray を使用しますか?

どんな助けでも大歓迎です!

4

1 に答える 1