Udostępnij przez


Server Pages kodu i danych Unicode

Important noteImportant Note:

This feature will be removed in a future version of Microsoft SQL Server. Do not use this feature in new development work, and modify applications that currently use this feature as soon as possible. Zamiast tego użyj integracja środowiska CLR.

Interfejs API rozszerzona procedura składowana jest włączona dla danych Unicode, jednak nie jest włączone dla standardu Unicode metadane.# Zdefiniować Unicode w dyrektywie nie ma wpływu na interfejsie API rozszerzona procedura składowana.

Przyjęto, że wszystkie metadane zwróconych lub pod warunkiem, że API rozszerzona procedura składowana przez daną aplikację rozszerzona procedura składowana w stronie kodowej wielobajtowych na serwerze.Domyślna strona kodowa rozszerzona procedura składowana interfejsu API serwera aplikacji jest strona kodowa ANSI komputera, na którym działa aplikacja, który można uzyskać poprzez wywołanie srv_pfield parametr pole Ustaw SRV_SPROC_CODEPAGE.

Jeśli aplikacja rozszerzona procedura składowana API obsługujących kodu Unicode, należy przekonwertować swoje nazwy kolumn metadane Unicode, komunikaty o błędach i tak dalej wielobajtowych danych przed przekazaniem danych do interfejsu API rozszerzona procedura składowana.

Przykład

Rozszerzone następującą procedura przechowywana zawiera przykład konwersji Unicode omówione.Należy zauważyć, że:

  • Kolumna danych jest przekazywana jako dane Unicode srv_describe ponieważ kolumna jest opisana jest SRVNVARCHAR.

  • Metadane nazwa kolumna jest przekazywany do srv_describe jako dane wielobajtowych.

    The extended stored procedure calls srv_pfield with the field parameter set to SRV_SPROC_CODEPAGE to obtain the multibyte code page of Microsoft SQL Server.

  • Komunikaty o błędach są przekazywane do srv_sendmsg jako dane wielobajtowych.

    __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;
    }