Compartir por


Páginas de códigos de servidor y datos Unicode

Se aplica a: SQL Server

Importante

Esta característica se quitará en una versión futura de SQL Server. Evite utilizar esta característica en nuevos trabajos de desarrollo y tenga previsto modificar las aplicaciones que actualmente la utilizan. En su lugar, use la integración con CLR.

La API de procedimiento almacenado extendido está habilitada para los datos Unicode; sin embargo, no está habilitado para los metadatos Unicode. La #define directiva Unicode no tiene ningún efecto en la API de procedimiento almacenado extendido.

Se supone que todos los metadatos que devuelve la API Procedimiento almacenado extendido o que la aplicación de procedimiento almacenado extendida le proporciona están en la página de códigos multibyte del servidor. La página de códigos predeterminada de una aplicación de servidor de API de procedimiento almacenado extendido es la página de códigos ANSI del equipo en el que se ejecuta la aplicación, que se puede obtener llamando srv_pfield con el parámetro field establecido SRV_SPROC_CODEPAGEen .

Si la aplicación de API Procedimiento almacenado extendido está habilitada para Unicode, debe convertir los nombres de columna de metadatos de Unicode, mensajes de error, etc., a datos multibyte antes de pasar estos datos a la API Procedimiento almacenado extendido.

Ejemplos

El siguiente procedimiento almacenado extendido proporciona un ejemplo de las conversiones de Unicode tratadas.

  • Los datos de columna se pasan como datos Unicode a srv_describe porque la columna se describe como SRVNVARCHAR.

  • Los metadatos de nombre de columna se pasan a srv_describe como datos multibyte.

    El procedimiento almacenado extendido llama srv_pfield a con el parámetro field establecido en SRV_SPROC_CODEPAGE para obtener la página de códigos multibyte de SQL Server.

  • Los mensajes de error se pasan a srv_sendmsg como datos multibyte.

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