データ型のマッピング (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 型のデータを取得するには、次の手順を実行します。
SQLFetch を呼び出して、取得する行に位置付けます。
型に SQL_C_BINARY、データ長に 0 を指定し、SQLGetData を呼び出します。 これにより、ドライバーが sql_variant ヘッダーを読み取ることになります。 このヘッダーには、sql_variant 型の列に格納されているインスタンスのデータ型が示されています。 SQLGetData からは、値のサイズがバイト単位で返されます。
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 の適切なサブタイプのいずれかに変換します。