Unicode 資料和伺服器代碼頁
適用於:SQL Server
重要
SQL Server 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 請改用 CLR 整合。
Unicode 數據已啟用擴充預存程式 API;不過,它並未針對 Unicode 元數據啟用。 #define
Unicode 指示詞對擴充預存程式 API 沒有任何影響。
擴充預存程式應用程式傳回或提供給擴充預存程式 API 的所有元數據都假設位於伺服器的多位元組代碼頁中。 擴充預存程式 API 伺服器應用程式的預設代碼頁是應用程式執行所在的電腦的 ANSI 代碼頁,可藉由呼叫 srv_pfield
,並將 field 參數設定為 SRV_SPROC_CODEPAGE
來取得。
如果您的擴充預存程式 API 應用程式已啟用 Unicode,您必須先將 Unicode 元資料行名稱、錯誤訊息等轉換成多位元組資料,再將此資料傳遞至擴充預存程式 API。
範例
下列擴充預存程式提供所討論 Unicode 轉換的範例。
數據行數據會以 Unicode 數據的形式傳遞至 ,
srv_describe
因為數據行會描述為 SRVNVARCHAR。資料列名稱元資料會以多位元組資料的形式傳遞至
srv_describe
。擴充預存程式會呼叫
srv_pfield
,並將 field 參數設定為SRV_SPROC_CODEPAGE
,以取得 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; }