Unicode データとサーバー のコード ページ
適用対象: SQL Server
重要
この機能は、 SQL Serverの将来のバージョンで削除される予定です。 新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションは修正することを検討してください。 代わりに CLR Integration を使用してください。
拡張ストアド プロシージャ API は Unicode データに対して有効になっています。ただし、Unicode メタデータでは有効になっていません。 #define
Unicode ディレクティブは、拡張ストアド プロシージャ API には影響しません。
拡張ストアド プロシージャ API が返したメタデータ、または拡張ストアド プロシージャ アプリケーションによって拡張ストアド プロシージャ API に渡されたメタデータは、すべてサーバーのマルチバイト コード ページにあることが想定されています。 拡張ストアド プロシージャ API サーバー アプリケーションの既定のコード ページは、アプリケーションが実行されているコンピューターの ANSI コード ページです。これは、フィールド パラメーターを SRV_SPROC_CODEPAGE
に設定してsrv_pfield
を呼び出すことによって取得できます。
Unicode 対応の拡張ストアド プロシージャ API アプリケーションの場合は、Unicode メタデータの列名やエラー メッセージなどを拡張ストアド プロシージャ API に渡す前に、マルチバイト データに変換する必要があります。
例
次の拡張ストアド プロシージャは、上記で説明した Unicode 変換の例です。
列は SRVNVARCHAR と記述されているため、列データは Unicode データとして
srv_describe
に渡されます。列名メタデータは、マルチバイト データとして
srv_describe
に渡されます。拡張ストアド プロシージャは、sql Server のマルチバイト コード ページを取得するために、フィールド パラメーターを
SRV_SPROC_CODEPAGE
に設定してsrv_pfield
を呼び出します。エラー メッセージは、マルチバイト データとして
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; }