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_CODEPAGE
en .
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 enSRV_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; }