Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Berlaku untuk: SQL Server
Penting
Fitur ini akan dihapus dalam versi SQL Server yang akan datang. Hindari menggunakan fitur ini dalam pekerjaan pengembangan baru, dan rencanakan untuk memodifikasi aplikasi yang saat ini menggunakan fitur ini. Gunakan Integrasi CLR sebagai gantinya.
EXTENDED Stored Procedure API diaktifkan untuk data Unicode; namun, ini tidak diaktifkan untuk metadata Unicode. Arahan #define Unicode tidak berpengaruh pada EXTENDED Stored Procedure API.
Semua metadata yang dikembalikan oleh, atau disediakan ke EXTENDED Stored Procedure API oleh aplikasi prosedur tersimpan yang diperluas diasumsikan berada di halaman kode multibyte server. Halaman kode default aplikasi server EXTENDED Stored Procedure API adalah halaman kode ANSI komputer tempat aplikasi berjalan, yang dapat diperoleh dengan memanggil srv_pfield dengan parameter bidang yang diatur ke SRV_SPROC_CODEPAGE.
Jika aplikasi EXTENDED Stored Procedure API Anda diaktifkan Unicode, Anda harus mengonversi nama kolom metadata Unicode, pesan kesalahan, dan sebagainya, ke data multibyte sebelum meneruskan data ini ke EXTENDED Stored Procedure API.
Contoh
Prosedur tersimpan yang diperluas berikut ini memberikan contoh konversi Unicode yang dibahas.
Data kolom diteruskan sebagai data
srv_describeUnicode karena kolom dijelaskan sebagai SRVNVARCHAR.Metadata nama kolom diteruskan ke
srv_describesebagai data multibyte.Panggilan prosedur tersimpan
srv_pfieldyang diperluas dengan parameter bidang diatur keSRV_SPROC_CODEPAGEuntuk mendapatkan halaman kode multibyte SQL Server.Pesan kesalahan diteruskan ke
srv_sendmsgsebagai data 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; }