Varbinary 型 Varchar 長い・ TN045: MFC/データベース サポート

この MFC データベース クラスを使用して、ODBC のSQL_LONGVARCHARSQL_LONGVARBINARYデータ型を送受信する方法について説明します。

長い Varchar/Varbinary の概要をサポート

(ここに長いデータ列とも呼ばれます)、ODBC SQL_LONG_VARCHARSQL_LONGBINARYのデータ型は、大量のデータを保持できます。このデータを処理することができます 3 つの方法します。:

長いデータ列は、パラメーター クエリにはサポートされていません。彼らは outputColumns をサポートします。

長いデータ列を CString/CByteArray にバインドします。

利点:

このアプローチを理解するには、簡単で、おなじみのクラスを使用します。フレームワークは、 CString DDX_TextCFormViewサポートされています。多くの一般的な文字列またはCStringCByteArrayクラス、コレクション機能があるし、ローカルでデータ値を保持するために割り当てられたメモリの量を制御することができます。編集またはAddNew関数呼び出し中に、フィールド データの古いコピー フレームワークを維持し、フレームワークに自動的にデータへの変更を検出することができます。

特価;CStringCByteArrayの文字データ、バイナリ データを操作するため操作するために設計されていますので、 CStringに文字データ (SQL_LONGVARCHAR) とバイナリ データ (SQL_LONGVARBINARY) CByteArrayに置くことをお勧め(&N)。

CStringCByteArrayの RFX 関数は、取得した列の値をデータを保持するために割り当てられたメモリの既定のサイズをオーバーライドすることができます追加の引数があります。注 nMaxLength 引数の次の関数宣言:

 void AFXAPI RFX_Text(CFieldExchange* pFX, const char *szName,特価;CString & 値、int nMaxLength 255、int nColumnType を = =かつ);void AFXAPI RFX_Binary(CFieldExchange* pFX, const char *szName, CByteArray& value,int nMaxLength = 255)

CByteArrayまたはcstring オブジェクトには、長いデータ列を取得する場合は、最大データ量が、既定では、255 バイト返されます。何もこれ以上は無視されます。この場合、フレームワークAFX_SQL_ERROR_DATA_TRUNCATED例外をスローします。幸いにも、明示的に nMaxLength MAXINTまでのより大きい値を増やすことができます。

ClassWizard SQL_LONGVARCHAR CString、または、 CByteArraySQL_LONGVARBINARYをバインドします。長いデータ列を取得以上 255 バイトを割り当てたい場合は、[、nMaxLength で明示的な値を供給することができます。

長いデータ列CByteArrayまたはcstring オブジェクトにバインドされている場合は、フィールドを更新を sql _VARCHARまたは sql _VARBINARYにバインド時と同じ動作します。編集中に、データ値はキャッシュありデータ値への変更を検出し、ダーティおよび Null 列の値を適切に設定する更新プログラムが呼び出されたときを後で比較。

長いデータ列を CLongBinary にバインド

長いデータ列MAXINTバイトのデータが含まれている可能性がある。 場合は、おそらく、 CLongBinaryに取得を検討する必要があります。

利点:

これは、全体の長いデータ列 - まで使用可能なメモリを取得します。

短所:

データはメモリに保持されます。この方法も非常に大量のデータを非常に高いです。フィールドは、更新操作に含まれていることを確認するには、バインドされたデータ メンバーを渡して setfielddirty 関数を呼び出す必要があります。

長いデータ列をCLongBinaryに取得する場合は、データベース クラスは、長いデータ列の合計サイズを確認し、それは全体のデータ値を保持するのに十分なHGLOBALメモリ セグメントを割り当てます。データベース クラス [割り当てられたHGLOBALにデータ値全体を取得します。

データ ソースは、長いデータ列のサイズを返すことができない場合は、フレームワークAFX_SQL_ERROR_SQL_NO_TOTAL例外をスローします。HGLOBALの割り当てに失敗した場合は、標準メモリ例外がスローされます。

ClassWizard、 SQL_LONGVARCHARまたはSQL_LONGVARBINARYCLongBinaryをバインドします。CLongBinary [メンバー変数の追加] ダイアログ ボックスで変数のタイプとして選択します。ClassWizard はRFX_LongBinary呼び出し、 DoFieldExchangeの呼び出しを追加し、バインドされたフィールドの合計数をインクリメント。

長いデータ列の値を更新するには、まず割り当てられたHGLOBALを呼び出して、新しいデータを保持できる大きさであることを確認:: globalsize はm_hDataメンバー CLongBinaryの。それが小さすぎる場合は、 HGLOBALを解放し、1 つは、適切なサイズを割り当てます。新しいサイズを反映するようにm_dwDataLengthを設定します。

それ以外の場合、 m_dwDataLength交換しているデータのサイズよりも大きい場合は、することができます無料しHGLOBAL、再割り当てまたは割り当てられたまま。M_dwDataLengthで実際に使用されるバイト数を指定してください。

どのように更新を CLongBinary に動作します。

CLongBinary更新のしくみを理解する必要はありませんが、長いデータ値をデータ ソースに送信する方法の例として立つことがあります以下この 3 番目のメソッドを選択するかどうか。

特価;CLongBinaryフィールドの更新が含まれるために、フィールドを渡して setfielddirty 関数を明示的に呼び出す必要があります。Null 設定を含むフィールドに任意の変更を行うと渡して setfielddirty 関数を呼び出す必要があります。(&N)。

CLongBinaryフィールドを更新すると、ODBC のDATA_AT_EXECメカニズムのデータベース クラスを使用して ( SQLSetPosの rgbValue 引数に ODBC のマニュアルを参照)。挿入フレームワークを準備または update ステートメントはCLongBinaryアドレスのデータを含む、 HGLOBALを指しているのではなく、の列としてではなく、設定されているし、 SQL_DATA_AT_EXECに、長さのインジケーターを設定します。その後、update ステートメントがデータ ソースに送信されると、 SQLExecDirect SQL_NEED_DATAが返されます。これは列のパラメーターの値はCLongBinaryのアドレスは、実際には、フレームワークを警告します。フレームワークSQLGetDataを 1 回、データの実際の長さを返すには、ドライバーを期待して、小さいバッファーを呼び出します。ドライバー バイナリ ラージ オブジェクト (BLOB) の実際の長さを返す場合、MFC は多くのスペース、BLOB を取得するために、必要に応じて再割り当ています。場合は、データソースを返しますSQL_NO_TOTALは、BLOB のサイズを判断できないことを示す、MFC 小さいブロックを作成します。既定の初期サイズは 64 K で、後続ブロック サイズの 2 倍になります。たとえば、2 番目の 128 K、256 K の 3 番目であります。初期サイズは構成可能です。

バインドではありません: 取得・ データ SQLGetData を ODBC から直接送信

このメソッドを完全にデータベース クラスを使用しないし、長いデータ列を自分で対処。

利点:

必要な場合は、ディスクまたは動的にどのくらいのデータを取得するかを決定するデータをキャッシュすることができます。

短所:

フレームワークの編集またはAddNewサポートを取得しないし、記述する必要があります自分 (削除動作にもかかわらず、それを列レベルでの動作ではないので) の基本的な機能を実行するコード。

この例では、長いデータ列は、レコード セットの選択リストにする必要がありますに、フレームワークによってバインドされません。これを行う方法の 1 つは、独自の SQL ステートメントGetDefaultSQLまたはCRecordsetオープン関数を lpszSQL 引数として指定し、rfx _ 関数呼び出しの余分な列をバインドしないことです。ODBC の非連結フィールド バインドされたフィールドの右側に表示されることが必要です、ので、非バインド列を選択リストの末尾に追加。

特価警告;長いデータ列が、フレームワークによってバインドされていないので、変更するCRecordset::Update呼び出しでは処理されません。作成し、必要な SQL の挿入更新ステートメントが自分自身を送信する必要があります。(&N)。

番号順テクニカル ノート|nbsp;カテゴリ別テクニカル ノート(&N)

Index