Tabelle codici unicode per dati e server
Si applica a: SQL Server
Importante
Questa funzionalità verrà rimossa nelle versioni future di SQL Server. Evitare di usare questa funzionalità in un nuovo progetto di sviluppo e prevedere interventi di modifica nelle applicazioni in cui è attualmente implementata. Usare invece la funzionalità Integrazione CLR.
L'API Stored procedure estesa è abilitata per i dati Unicode; tuttavia, non è abilitato per i metadati Unicode. La #define
direttiva Unicode non ha alcun effetto sull'API Stored procedure estesa.
Si suppone che per tutti i metadati restituiti o forniti all'API Stored procedure estesa dall'applicazione delle stored procedure estese in uso venga utilizzata la tabella codici multibyte del server. La tabella codici predefinita di un'applicazione server api stored procedure estesa è la tabella codici ANSI del computer in cui è in esecuzione l'applicazione, che può essere ottenuta chiamando srv_pfield
con il parametro field impostato su SRV_SPROC_CODEPAGE
.
Se l'applicazione dell'API Stored procedure estesa è abilitata per l'utilizzo di Unicode, è necessario convertire i nomi delle colonne di metadati Unicode, i messaggi di errore e così via, in dati multibyte prima di passare tali dati all'API Stored procedure estesa.
Esempi
Nella stored procedure estesa seguente è fornito un esempio delle conversioni Unicode descritte.
I dati della colonna vengono passati come dati Unicode a
srv_describe
perché la colonna è descritta come SRVNVARCHAR.I metadati dei nomi di colonna vengono passati a
srv_describe
come dati multibyte.La stored procedure estesa chiama
srv_pfield
con il parametro field impostato su perSRV_SPROC_CODEPAGE
ottenere la tabella codici multibyte di SQL Server.I messaggi di errore vengono passati a
srv_sendmsg
come dati 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; }