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 CTimeCString
TIME CTimeCString
TIMESTAMP CTimeCString
  1. ANSI DECIMALNUMERIC は、SQL_C_CHAR が既定の ODBC 転送型であるため CString にマップされます。

  2. 255 文字を超える文字データは、CString にマップされた場合、既定で切り捨てられます。 RFX_TextnMaxLength 引数を明示的に設定することで、切り捨ての長さを拡張できます。

  3. 255 文字を超えるバイナリ データは、CByteArray にマップされた場合、既定で切り捨てられます。 RFX_BinarynMaxLength 引数を明示的に設定することで、切り捨ての長さを拡張できます。

ODBC カーソル ライブラリを使っていない場合、Microsoft SQL Server ODBC ドライバーと MFC ODBC データベース クラスを使って 2 つ以上の長い可変長フィールドを更新しようとすると、問題が発生することがあります。 ODBC の型である SQL_LONGVARCHARSQL_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::CloseCRecordset::Open を呼び出します。 もう 1 つの解決方法は、ODBC カーソル ライブラリを使わないことです。これは、SQL Server と SQL Server ODBC ドライバーは、カーソルをネイティブにサポートしており、ODBC カーソル ライブラリが必要ないためです。

関連項目

SQL
SQL: SQL の直接呼び出し (ODBC)