유니코드 데이터 및 서버 코드 페이지

중요 정보중요

Microsoft SQL Server의 이후 버전에서는 이 기능이 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 말고, 현재 이 기능을 사용하는 응용 프로그램은 가능한 한 빨리 수정하십시오. 대신 CLR 통합을 사용하십시오.

확장 저장 프로시저 API는 유니코드 데이터에 사용되지만 유니코드 메타데이터에는 사용되지 않습니다. #define 유니코드 지시문은 확장 저장 프로시저 API에 적용되지 않습니다.

확장 저장 프로시저 응용 프로그램에 의해 반환되거나 확장 저장 프로시저 API에 제공되는 모든 메타데이터는 서버의 멀티바이트 코드 페이지에 있는 것으로 가정됩니다. 확장 저장 프로시저 API 서버 응용 프로그램의 기본 코드 페이지는 응용 프로그램이 실행되는 컴퓨터의 ANSI 코드 페이지로, 필드 매개 변수를 SRV_SPROC_CODEPAGE로 설정해서 srv_pfield를 호출하여 얻을 수 있습니다.

확장 저장 프로시저 API 응용 프로그램에서 유니코드를 사용하는 경우 이 데이터를 확장 저장 프로시저 API로 전달하기 전에 유니코드 메타데이터 열 이름, 오류 메시지 등을 멀티바이트 데이터로 변환해야 합니다.

다음 확장 저장 프로시저는 설명된 유니코드 변환의 예를 제공합니다. 다음을 참고하십시오.

  • 열이 SRVNVARCHAR인 것으로 설명되었으므로 열 데이터는 유니코드 데이터로 srv_describe에 전달됩니다.

  • 열 이름 메타데이터는 멀티바이트 데이터로 srv_describe에 전달됩니다.

    확장 저장 프로시저는 필드 매개 변수를 SRV_SPROC_CODEPAGE로 설정해서 srv_pfield를 호출하여 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;
    }
    

참고 항목

참조

srv_wsendmsg(확장 저장 프로시저 API)