SQL: SQL と C++ のデータ型 (ODBC)
Note
この情報は、MFC ODBC クラスに該当します。 MFC DAO クラスを使っている場合、DAO ヘルプの "Microsoft Jet Database Engine SQL と ANSI SQL の比較" というトピックを参照してください。
次の表では、ANSI SQL データ型を C++ データ型にマッピングしています。 これは、「ODBC プログラマーズ リファレンス」ドキュメントの付録 D に記載されている C 言語の情報を補うものです。 ほとんどのデータ型のマッピングは、ウィザードが管理してくれます。 ウィザードを使わない場合は、フィールド交換コードを手動で記述することにマッピング情報を使用できます。
C++ データ型にマップされた ANSI SQL データ型
ANSI SQL データ型 | C++ データ型 |
---|---|
CHAR | CString |
DECIMAL | CString 1 |
SMALLINT | int |
REAL | float |
INTEGER | long |
FLOAT | double |
DOUBLE | double |
NUMERIC | CString 1 |
VARCHAR | CString |
LONGVARCHAR | CLongBinary , CString 2 |
BIT | BOOL |
TINYINT | BYTE |
BIGINT | CString 1 |
BINARY | CByteArray |
VARBINARY | CByteArray |
LONGVARBINARY | CLongBinary , CByteArray 3 |
DATE | CTime 、CString |
TIME | CTime 、CString |
TIMESTAMP | CTime 、CString |
ANSI DECIMAL と NUMERIC は、SQL_C_CHAR が既定の ODBC 転送型であるため
CString
にマップされます。255 文字を超える文字データは、
CString
にマップされた場合、既定で切り捨てられます。RFX_Text
の nMaxLength 引数を明示的に設定することで、切り捨ての長さを拡張できます。255 文字を超えるバイナリ データは、
CByteArray
にマップされた場合、既定で切り捨てられます。RFX_Binary
の nMaxLength 引数を明示的に設定することで、切り捨ての長さを拡張できます。
ODBC カーソル ライブラリを使っていない場合、Microsoft SQL Server ODBC ドライバーと MFC ODBC データベース クラスを使って 2 つ以上の長い可変長フィールドを更新しようとすると、問題が発生することがあります。 ODBC の型である SQL_LONGVARCHAR と SQL_LONGVARBINARY は SQL Server の型 text と image にマップされます。 CRecordset::Update
への同じ呼び出しで 2 つ以上の長い可変長フィールドを更新すると CDBException
がスローされます。 そのため、CRecordset::Update
で複数の長い列を同時に更新しないでください。 ODBC API SQLPutData
を使うと、複数の長い列を同時に更新できます。 ODBC カーソル ライブラリを使うこともできますが、SQL Server ドライバーのようにカーソルをサポートし、カーソル ライブラリを必要としないドライバーでは推奨されません。
ODBC カーソル ライブラリを MFC ODBC データベース クラスと Microsoft SQL Server ODBC ドライバーで使う場合、CRecordset::Requery
の呼び出しの後に CRecordset::Update
の呼び出しを行うと CDBException
と共に ASSERT が発生することがあります。 代わりに、CRecordset::Requery
ではなく CRecordset::Close
と CRecordset::Open
を呼び出します。 もう 1 つの解決方法は、ODBC カーソル ライブラリを使わないことです。これは、SQL Server と SQL Server ODBC ドライバーは、カーソルをネイティブにサポートしており、ODBC カーソル ライブラリが必要ないためです。