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();
}
...
}
どうすればよいですか:
- CLongBinary を引き続き使用し、8000 バイトを超える値を SQL Server の varbinary(max) フィールドに書き込むか、
- データベースに書き込まれたデータに余分なバイト (AFX_RFX_BYTE_PSEUDO_NULL == 255) が含まれているため、別のシリアル化データ形式を取得せずに CByteArray を使用しますか?
どんな助けでも大歓迎です!