데이터 형식 매핑(ODBC)
SQL Server Native Client ODBC 드라이버는 SQL Server SQL 데이터 형식을 ODBC SQL 데이터 형식에 매핑합니다. 아래 섹션에서는 SQL Server SQL 데이터 형식과 이러한 데이터 형식이 매핑되는 ODBC SQL 데이터 형식에 대해 설명합니다. 또한 ODBC SQL 데이터 형식 및 해당 ODBC C 데이터 형식과 지원되는 변환 및 기본 변환에 대해 설명합니다.
[!참고]
SQL Servertimestamp 데이터 형식은 timestamp 열이 datetime 값이 아니고 행의 SQL Server 작업 시퀀스를 나타내는 binary(8) 또는 varbinary(8) 값이기 때문에 SQL_BINARY 또는 SQL_VARBINARY ODBC 데이터 형식에 매핑됩니다. SQL Server Native Client ODBC 드라이버에서 바이트 수가 홀수인 SQL_C_WCHAR(유니코드) 값을 발견하면 후행 홀수 바이트가 잘립니다.
ODBC의 sql_variant 데이터 형식 처리
sql_variant 데이터 형식 열에는 text, ntext 및 image와 같은 LOB(Large Object)를 제외하고 SQL Server의 모든 데이터 형식이 포함될 수 있습니다. 예를 들어 열의 일부 행에는 smallint 값이 포함되고, 다른 행에는 float 값이 포함되고, 나머지 행에는 char/nchar 값이 포함될 수 있습니다.
sql_variant 데이터 형식은 Microsoft Visual Basic®의 Variant 데이터 형식과 유사합니다.
서버에서 데이터 검색
ODBC에는 Variant 형식의 개념이 없으므로 SQL Server의 ODBC 드라이버에서 sql_variant 데이터 형식의 사용이 제한됩니다. 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 하위 유형 중 하나로 변환합니다.