次の方法で共有


Unicode データおよびサーバー コード ページ

ms164684.note(ja-jp,SQL.90).gif重要 :
この機能は、Microsoft SQL Server の将来のバージョンで削除されます。新規の開発作業ではこの機能を使用しないようにし、現在この機能を使用しているアプリケーションはできるだけ早く修正してください。 代わりに、CLR 統合を使用してください。

拡張ストアド プロシージャ 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 に渡されます。
    Microsoft 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;
    }