Unicode-Daten- und Servercodeseiten

Gilt für: SQL Server

Wichtig

Diese Funktion wird in einer zukünftigen Version von SQL Serverentfernt. Nutzen Sie diese Funktionen bei Neuentwicklungen nicht mehr, und planen Sie die Änderung von Anwendungen, die diese Funktion zurzeit verwenden. Verwenden Sie stattdessen die CLR-Integration.

Die API für die erweiterte gespeicherte Prozedur ist für Unicode-Daten aktiviert; Sie ist jedoch nicht für Unicode-Metadaten aktiviert. Die #define Unicode-Direktive wirkt sich nicht auf die API für die erweiterte gespeicherte Prozedur aus.

Für alle Metadaten, die von der API für erweiterte gespeicherte Prozeduren zurückgegeben oder durch Ihre Anwendung mit erweiterten gespeicherten Prozeduren für die API bereitgestellt werden, wird angenommen, dass sie im Multibytecodepageformat des Servers vorliegen. Die Standardcodeseite einer Serveranwendung für erweiterte gespeicherte Prozeduren ist die ANSI-Codeseite des Computers, auf dem die Anwendung ausgeführt wird, die durch Aufrufen srv_pfield des Feldparameters abgerufen SRV_SPROC_CODEPAGEwerden kann.

Wenn für Ihre mit der API für erweiterte gespeicherte Prozeduren erstellte Anwendung Unicode aktiviert ist, müssen Sie die Unicode-Metadaten für Spaltennamen, Fehlermeldungen usw. in Multibytedaten konvertieren, bevor Sie die Daten an die API für erweiterte gespeicherte Prozeduren übergeben.

Beispiele

Die folgende erweiterte gespeicherte Prozedur stellt ein Beispiel für die beschriebenen Unicode-Konvertierungen bereit.

  • Spaltendaten werden als Unicode-Daten srv_describe übergeben, da die Spalte als SRVNVARCHAR beschrieben wird.

  • Spaltennamenmetadaten werden als Multibyte-Daten übergeben srv_describe .

    Die erweiterten gespeicherten Prozeduraufrufe srv_pfield , für die der Feldparameter festgelegt ist, um SRV_SPROC_CODEPAGE die Multibyte-Codepage von SQL Server abzurufen.

  • Fehlermeldungen werden als Multibyte-Daten übergeben 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;
    }