データ型のマッピング (ODBC)

SQL Server Native Client ODBC ドライバでは、SQL Server SQL データ型が ODBC SQL データ型にマップされます。次のセクションでは、SQL Server SQL データ型とマップ先の ODBC SQL データ型について説明します。また、ODBC SQL データ型と対応する ODBC C データ型、およびサポートされる変換と既定の変換についても説明します。

注意

SQL Server timestamp 型は ODBC の SQL_BINARY 型または SQL_VARBINARY 型にマップされます。これは、timestamp 型の列に格納される値が datetime 型の値ではなく、その行での SQL Server 操作のシーケンスを示す binary(8) 型または varbinary(8) 型の値であるためです。SQL Server Native Client ODBC ドライバでは、奇数バイトの SQL_C_WCHAR (Unicode) 型の値を処理する場合、末尾の奇数バイトが切り捨てられます。

ODBC での sql_variant データ型の処理

sql_variant データ型の列には、text 型、ntext 型、image 型などの LOB (ラージ オブジェクト) 型を除く、SQL Server のすべてのデータ型を格納できます。たとえば、一部の行の列に smallint 型の値を格納し、他の数行の列に float 型の値を格納して、残りの行の列に char/nchar 型の値を格納できます。

sql_variant データ型は、Microsoft Visual Basic® の Variant データ型に似ています。

サーバーからのデータの取得

ODBC にはバリアント型の概念がないので、SQL Server では sql_variant データ型と ODBC ドライバの併用が制限されます。SQL Server では、バインドを指定する場合、sql_variant データ型を ODBC のドキュメントに記載されているいずれかのデータ型にバインドする必要があります。SQL Server Native Client ODBC ドライバ固有の新しい属性 SQL_CA_SS_VARIANT_TYPE では、sql_variant 型の列に格納されているインスタンスのデータ型がユーザーに返されます。

バインドを指定していない場合は、SQLGetData 関数を使用して、sql_variant 型の列に格納されているインスタンスのデータ型を確認できます。

sql_variant 型のデータを取得するには、次の手順を実行します。

  1. SQLFetch を呼び出して、取得する行に位置付けます。

  2. 型に SQL_C_BINARY、データ長に 0 を指定し、SQLGetData を呼び出します。これにより、ドライバが sql_variant ヘッダーを読み取ることになります。このヘッダーには、sql_variant 型の列に格納されているインスタンスのデータ型が示されています。SQLGetData からは、値のサイズがバイト単位で返されます。

  3. SQL_CA_SS_VARIANT_TYPE を属性値として指定し、SQLColAttribute を呼び出します。この関数では、sql_variant 型の列に格納されているインスタンスの C データ型がクライアントに返されます。

上記の手順を行うコードを次に示します。

while ((retcode = SQLFetch (hstmt))==SQL_SUCCESS)
{
    if (retcode != SQL_SUCCESS && retcode != SQL_SUCCESS_WITH_INFO)
    {
        SQLError (NULL, NULL, hstmt, NULL, 
                    &lNativeError,szError,MAX_DATA,&sReturned);
        printf_s ("%s\n",szError);
        goto Exit;
    }
    retcode = SQLGetData (hstmt, 1, SQL_C_BINARY, 
                                pBuff,0,&Indicator);//Figure out the length
    if (retcode != SQL_SUCCESS_WITH_INFO && retcode != SQL_SUCCESS)
    {
        SQLError (NULL, NULL, hstmt, NULL, &lNativeError, 
                    szError,MAX_DATA,&sReturned);
        printf_s ("%s\n",szError);
        goto Exit;
    }
    printf_s ("Byte length : %d ",Indicator); //Print out the byte length
        
    int iValue = 0;
    retcode = SQLColAttribute (hstmt, 1, SQL_CA_SS_VARIANT_TYPE, NULL, 
                                        NULL,NULL,&iValue);  //Figure out the type
    printf_s ("Sub type = %d ",iValue);//Print the type, the return is C_type of the column]

// Set up a new binding or do the SQLGetData on that column with 
// the appropriate type
}

ユーザーが SQLBindCol を使用してバインドを作成した場合、ドライバではメタデータとデータを読み取ります。次に、そのデータをバインドに指定されている適切な ODBC 型に変換します。

サーバーへのデータの送信

SQL Server Native Client ODBC ドライバ固有の新しいデータ型 SQL_SS_VARIANT は、sql_variant 型の列に送信するデータに使用します。パラメータを使用してサーバーにデータを送信する (たとえば INSERT INTO TableName VALUES (?,?)) ときに、SQLBindParameter を使用して、C データ型やそれに対応する SQL Server のデータ型などのパラメータ情報を指定します。SQL Server Native Client ODBC ドライバでは、C データ型を sql_variant の適切なサブタイプのいずれかに変換します。

関連項目

概念