Unicode 資料和伺服器字碼頁
![]() |
---|
未來的 Microsoft SQL Server 版本將移除這項功能。請勿在新的開發工作中使用此功能,並且儘速修改使用此功能的應用程式。請改用 CLR 整合。 |
擴充預存程序 API 會針對 Unicode 資料而啟用,但不會針對 Unicode 中繼資料啟用。#define Unicode 指示詞在擴充預存程序 API 上沒有任何效果。
所有由擴充預存程序 API 所傳回的或藉由擴充預存程序應用程式而提供給擴充預存程序 API 的中繼資料,都假設位在伺服器多位元組字碼頁中。擴充預存程序 API 伺服器應用程式的預設字碼頁是該應用程式執行所在電腦的 ANSI 字碼頁,您可藉由呼叫 srv_pfield (欄位參數設定為 SRV_SPROC_CODEPAGE) 來取得該字碼頁。
如果擴充預存程序 API 應用程式已啟用 Unicode,則您必須先將 Unicode 中繼資料的資料行名稱、錯誤訊息等等轉換為多位元組資料,才能將此資料傳遞給擴充預存程序 API。
範例
下列擴充預存程序提供所討論的 Unicode 轉換的範例。請注意:
資料行資料會以 Unicode 資料傳遞給 srv_describe,因為資料行會描述為 SRVNVARCHAR。
資料行名稱中繼資料會以多位元組資料傳遞給 srv_describe。
擴充預存程序會呼叫 srv_pfield (欄位參數設定為 SRV_SPROC_CODEPAGE) 以取得 Microsoft SQL Server 的多位元組字碼頁。
錯誤訊息會以多位元組資料傳遞給 srv_sendmsg。
__declspec(dllexport) RETCODE proc1 (SRV_PROC *srvproc) { #define MAX_COL_NAME_LEN 25 #define MAX_COL_DATA_LEN 50 #define MAX_ERR_MSG_LEN 250 #define MAX_SERVER_ERROR 20000 #define XP_ERROR_NUMBER MAX_SERVER_ERROR+1 int retval; UINT serverCodePage; CHAR *szServerCodePage; WCHAR unicodeColumnName[MAX_COL_NAME_LEN]; CHAR multibyteColumnName[MAX_COL_NAME_LEN]; WCHAR unicodeColumnData[MAX_COL_DATA_LEN]; WCHAR unicodeErrorMessage[MAX_ERR_MSG_LEN]; CHAR multibyteErrorMessage[MAX_ERR_MSG_LEN]; lstrcpyW (unicodeColumnName, L"column1"); lstrcpyW (unicodeColumnData, L"column1 data"); lstrcpyW (unicodeErrorMessage, L"No Error!"); // Obtain server code page. // szServerCodePage = srv_pfield (srvproc, SRV_SPROC_CODEPAGE, NULL); if (NULL != szServerCodePage) serverCodePage = atol(szServerCodePage); else { // Problem situation exists. srv_senddone(srvproc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0); return 1; } // Convert column name for Unicode to multibyte using the // server code page. // retval = WideCharToMultiByte( serverCodePage, // code page 0, // default unicodeColumnName, // wide-character string -1, // string is null terminated multibyteColumnName, // address of buffer for new // string sizeof (multibyteColumnName), // size of buffer NULL, NULL); if (0 == retval) { lstrcpyW (unicodeErrorMessage, L"Conversion to multibyte failed."); goto Error; } retval = srv_describe (srvproc, 1, multibyteColumnName, SRV_NULLTERM, SRVNVARCHAR, MAX_COL_DATA_LEN*sizeof(WCHAR), // destination SRVNVARCHAR, lstrlenW(unicodeColumnData)*sizeof(WCHAR), unicodeColumnData); //source if (FAIL == retval) { lstrcpyW (unicodeErrorMessage, L"srv_describe failed."); goto Error; } retval = srv_sendrow(srvproc); if (FAIL == retval) { lstrcpyW (unicodeErrorMessage, L"srv_sendrow failed."); goto Error; } retval = srv_senddone (srvproc, SRV_DONE_MORE|SRV_DONE_COUNT, 0, 1); if (FAIL == retval) { lstrcpyW (unicodeErrorMessage, L"srv_senddone failed."); goto Error; } return 0; Error: // convert error message from Unicode to multibyte. retval = WideCharToMultiByte( serverCodePage, // code page 0, // default unicodeErrorMessage, // wide-character string -1, // string is null terminated multibyteErrorMessage, // address of buffer for new // string sizeof (multibyteErrorMessage), // size of buffer NULL, NULL); srv_sendmsg(srvproc, SRV_MSG_ERROR, XP_ERROR_NUMBER, SRV_INFO, 1, NULL, 0, __LINE__, multibyteErrorMessage, SRV_NULLTERM); srv_senddone(srvproc, (SRV_DONE_ERROR | SRV_DONE_MORE), 0, 0); return 1; }