次の方法で共有


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

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

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

Note

タイムスタンプ列の値は datetime 値ではなく、行の SQL Server アクティビティのシーケンスを示す binary(8) または varbinary(8) の値であるため、SQL Server タイムスタンプ データ型は、SQL_BINARYまたはSQL_VARBINARY ODBC データ型にマップされます。 SQL Server Native Client ODBC ドライバーで、奇数バイトの SQL_C_WCHAR (Unicode) 値が検出された場合、末尾の奇数バイトは切り捨てられます。

ODBC での sql_variant データ型の処理

sql_variantデータ型列には、テキスト、ntext、イメージなどのラージ オブジェクト (LOB) を除く、SQL Server 内の任意のデータ型を含めることができます。 たとえば、列には、一部の行の smallint 値、他の行の float 値、reメインder の char/nchar 値を含める場合があります。

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

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

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

バインドが指定されていない場合、SQLGetData 関数を使用して、sql_variant列のインスタンスのデータ型を決定できます。

sql_variantデータを取得するには、次の手順に従います。

  1. SQLFetch を呼び出して、取得した行の位置を指定します。

  2. SQLGetData を呼び出し、型のSQL_C_BINARYとデータ長に 0 を指定します。 これにより、ドライバーが 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_SS_VARIANT、SQL Server Native Client ODBC ドライバーに固有の新しいデータ型が、sql_variant列に送信されるデータに使用されます。 パラメーター (IN Standard Edition RT INTO TableName VALUES (?,?) など) を使用してサーバーにデータを送信する場合、SQLBindParameter を使用して、C 型と対応する SQL Server 型を含むパラメーター情報を指定します。 SQL Server Native Client ODBC ドライバーは、C データ型を適切な sql_variant サブタイプのいずれかに変換します。

参照

結果の処理 (ODBC)