7.2.1 DBR_BINARY型の構造体とメンバに設定される値

DBR_BINARY型は次に示すような構造体になっています。

 

typedef struct {
 DBR_UINT32  Length;
 DBR_UINT32  RealLength;
 LPTSTR      Data;
} DBR_BINARY;

それぞれのメンバは,SetResultSetTypeメソッドやGetFieldメソッド,SetMaxFieldSizeメソッドの指定によって次に示す値が設定されます。簡易版クラスを使用する場合は,次の説明中のSetResultSetTypeメソッドをExecuteメソッドと読み替えてください。また,簡易版にはSetMaxFieldSizeメソッドがありませんので,「7.2.1(1) メンバに設定される値(SetMaxFieldSizeメソッドの指定なし)」だけを参照してください。

<この項の構成>
(1) メンバに設定される値(SetMaxFieldSizeメソッドの指定なし)
(2) メンバに設定される値(SetMaxFieldSizeメソッドの指定あり)

(1) メンバに設定される値(SetMaxFieldSizeメソッドの指定なし)

GetFieldメソッドの形式2を使用した場合,又は形式3を使用してデータの切り捨てが発生しなかった場合にメンバに設定される値を表7-20に,GetFieldメソッドの形式3を使用してデータの切り捨てが発生した場合にメンバに設定される値を表7-21に示します。

VARCHAR_LENGTH_DEFを指定した場合は,ユーザが指定した領域長とカラムの定義長を比較して切り捨てたかどうか判定されます。そのため,データ長よりもユーザの指定した領域長の方が大きく,実際にはデータの切り捨てが発生していない場合でも,ユーザの指定した領域長が定義長より小さければ切り捨てが発生したと見なされ,LengthメンバやRealLengthメンバには表7-21の値が入ります。

VARCHAR_LENGTH_REALを指定した場合は,ユーザが指定した領域長と実際のデータ長を比較して切り捨てたかどうか判定されます。

表7-20 GetFieldメソッドの形式2を使用した場合,又は形式3を使用してデータの切り捨てが発生しなかった場合にメンバに設定される値(SetMaxFieldSizeメソッドの指定なし)

メンバSetResultSetTypeの指定値
VARCHAR_LENGTH_DEFVARCHAR_LENGTH_REAL
Lengthカラムの定義長実際のデータ長
RealLength00
Dataデータを指すポインタのコピー(形式2),又はデータのコピー(形式3)データを指すポインタのコピー(形式2),又はデータのコピー(形式3)

注※ 形式2の場合,Dataメンバにはデータを指すポインタがコピーされます。形式3の場合,Dataメンバにはユーザが確保した領域のポインタが設定されているため,その領域に有効なデータがコピーされます。


表7-21 GetFieldメソッドの形式3を使用してデータの切り捨てが発生した場合にメンバに設定される値(SetMaxFieldSizeメソッドの指定なし)

メンバSetResultSetTypeの指定値
VARCHAR_LENGTH_DEFVARCHAR_LENGTH_REAL
Length切り捨て後の有効データ長切り捨て後の有効データ長
RealLengthカラムの定義長実際のデータ長
Data切り捨て後の有効データのコピー切り捨て後の有効データのコピー

注※ 形式2の場合,Dataメンバにはデータを指すポインタがコピーされます。形式3の場合,Dataメンバにはユーザが確保した領域のポインタが設定されているため,その領域に有効なデータがコピーされます。


(2) メンバに設定される値(SetMaxFieldSizeメソッドの指定あり)

GetFieldメソッドの形式2を使用した場合,又は形式3を使用してデータの切り捨てが発生しなかった場合にメンバに設定される値を表7-22に,GetFieldメソッドの形式3を使用してデータの切り捨てが発生した場合にメンバに設定される値を表7-23に示します。

SetMaxFieldSizeで取得するデータの最大長を指定した場合,もし実際のデータがSetMaxFieldSizeで指定した長さよりも大きいとしても,SetMaxFieldSizeで指定した長さ分しかデータは取得されません。このような場合,実際のデータ長を取得することはできません。

VARCHAR_LENGTH_DEFを指定した場合は,ユーザが指定した領域長とSetMaxFieldSizeメソッドで指定した長さを比較して切り捨てたかどうか判定されます。このため,データ長よりもユーザの指定した領域長の方が大きく,実際にはデータの切り捨てが発生していない場合でも,ユーザの指定した領域長がSetMaxFieldSizeで指定した長さよりも小さければ切り捨てが発生したと見なされ,LengthメンバやRealLengthメンバには表7-23の値が入ります。

VARCHAR_LENGTH_REALを指定した場合は,ユーザが指定した領域長と実際のデータ長を比較して切り捨てたかどうか判定されます。

表7-22 GetFieldメソッドの形式2を使用した場合,又は形式3を使用してもデータの切り捨てが発生しなかった場合にメンバに設定される値(SetMaxFieldSizeメソッドの指定あり)

メンバSetResultSetTypeの指定値
VARCHAR_LENGTH_DEFVARCHAR_LENGTH_REAL
LengthSetMaxFieldSizeの指定長取得データ長※2
RealLength00
Data※1データを指すポインタのコピー(形式2),又はデータのコピー(形式3)データを指すポインタのコピー(形式2),又はデータのコピー(形式3)

注※1 形式2の場合,Dataメンバにはデータを指すポインタがコピーされます。形式3の場合,Dataメンバにはユーザが確保した領域のポインタが設定されているため,その領域に有効なデータがコピーされます。

注※2 実際のデータ長がSetMaxFieldSizeで指定した長さよりも大きい場合は,SetMaxFieldSizeで指定した長さ分しかデータを取得されないため,ここは実際のデータ長ではなく,取得データ長となります。


表7-23 GetFieldメソッドの形式3を使用してデータの切り捨てが発生した場合にメンバに設定される値(SetMaxFieldSizeメソッドの指定あり)

メンバSetResultSetTypeの指定値
VARCHAR_LENGTH_DEFVARCHAR_LENGTH_REAL
Length切り捨て後の有効データ長切り捨て後の有効データ長
RealLengthSetMaxFieldSizeの指定長取得データ長※2
Data※1切り捨て後の有効データのコピー切り捨て後の有効データのコピー

注※1 形式2の場合,Dataメンバにはデータを指すポインタがコピーされます。形式3の場合,Dataメンバにはユーザが確保した領域のポインタが設定されているため,その領域に有効なデータがコピーされます。

注※2 実際のデータ長がSetMaxFieldSizeで指定した長さよりも大きい場合は,SetMaxFieldSizeで指定した長さ分しかデータを取得されないため,ここは実際のデータ長ではなく,取得データ長となります。