Unicode 数据和服务器代码页
适用于:SQL Server
重要
在 SQL Server的未来版本中将删除此功能。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 请改用 CLR 集成。
扩展存储过程 API 将对 Unicode 数据启用;但是,它不对 Unicode 元数据启用。 #define Unicode 指令不影响扩展存储过程 API。
由扩展存储过程 API 返回的或由您的扩展存储过程应用程序提供给它的所有元数据都假定位于服务器的多字节代码页中。 扩展存储过程 API 服务器应用程序的默认代码页是运行应用程序的计算机的 ANSI 代码页,可通过调用 srv_pfield 并将字段参数设置为SRV_SPROC_CODEPAGE来获取该代码页。
如果您的扩展存储过程 API 应用程序启用了 Unicode,则必须将您的 Unicode 元数据列名称、错误消息等转换为多字节数据,然后才能将该数据传递给扩展存储过程 API。
示例
以下扩展存储过程提供了上述 Unicode 转换的示例。 请注意:
列数据作为 Unicode 数据 传递到srv_describe ,因为该列描述为 SRVNVARCHAR。
列名元数据作为多字节数据传递到 srv_describe 。
扩展存储过程调用 srv_pfield ,字段参数设置为SRV_SPROC_CODEPAGE以获取 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; }
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈