次の方法で共有


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

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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

Note

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

ODBC での sql_variant データ型の処理

sql_variant データ型列には、text、ntextimage など、ラージ オブジェクト (LOB) を除く SQL Server 内の任意のデータ型を含めることができます。 たとえば、列には、一部の行の smallint 値、他の行の float 値、剰余の 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 列に送信されるデータに使用されます。 パラメーター (INSERT INTO TableName VALUES (?,?) など) を使用してサーバーにデータを送信する場合、 SQLBindParameter を使用して、C 型と対応する SQL Server 型などのパラメーター情報を指定します。 SQL Server Native Client ODBC ドライバーは、C データ型を適切な sql_variant サブタイプのいずれかに変換します。

参照

結果の処理 (ODBC)