Dela via


Motståndskraft för anslutning i ODBC-drivrutinen

Ladda ned ODBC-drivrutins

För att säkerställa att programmen förblir anslutna kan ODBC-drivrutinen återställa inaktiva anslutningar.

Viktigt!

Funktionen för anslutningsåterhämtning stöds i Microsoft Azure SQL Database, Fabric SQL Database och SQL Server 2014 (och senare) serverversioner.

Funktionen är tillgänglig i Windows från och med Microsoft ODBC Driver 11 för SQL Server. Den är tillgänglig i Linux från och med version 17.2 av Microsoft ODBC Driver 17 för SQL Server.

Mer information om återhämtning av inaktiva anslutningar finns i Teknisk artikel – Återhämtning av inaktiv anslutning.

För att styra återanslutningsbeteendet har ODBC-drivrutinen för SQL Server två alternativ:

  • Antal nya anslutningsförsök.

    Antal återförsök i Anslut styr antalet återanslutningsförsök om det uppstår ett anslutningsfel. Giltiga värden sträcker sig från 0 till 255. Noll (0) innebär att du inte försöker återansluta. Standardvärdet är ett återanslutningsförsök.

    Du kan ändra antalet återförsök när du:

    • Definiera eller ändra en datakälla som använder ODBC-drivrutinen för SQL Server med kontrollen Antal återförsök för anslutning .

    • Använd anslutningssträngsnyckelordet ConnectRetryCount.

      Använd anslutningsattributet SQL_COPT_SS_CONNECT_RETRY_COUNT (skrivskyddat) om du vill hämta antalet försök till återförsök av anslutningen. Om ett program ansluter till en server som inte stöder anslutningsåterhämtning returnerar SQL_COPT_SS_CONNECT_RETRY_COUNT 0.

  • Anslut återförsöksintervallet.

    Återförsöksintervallet för anslutningen anger antalet sekunder mellan varje försök till nytt anslutningsförsök. Giltiga värden är 1–60. Den totala tiden för återanslutning får inte överskrida tidsgränsen för anslutningen (SQL_ATTR_QUERY_TIMEOUT i SQLSetStmtAttr). Standardvärdet är 10 sekunder.

    Du kan ändra återförsöksintervallet för anslutningen när du:

    • Definiera eller ändra en datakälla som använder ODBC-drivrutinen för SQL Server med kontrollen Anslut återförsöksintervall .

    • Använd nyckelordet för anslutningssträng ConnectRetryInterval.

      Om du vill hämta längden på återförsöksintervallet för anslutningen använder du anslutningsattributet SQL_COPT_SS_CONNECT_RETRY_INTERVAL (skrivskyddad).

Om ett program upprättar en anslutning med SQL_DRIVER_COMPLETE_REQUIRED och senare försöker köra en instruktion över en bruten anslutning, visar ODBC-drivrutinen inte dialogrutan igen. Under pågående återställning

  • Under återställningen måste alla anrop till SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), returnera SQL_CD_FALSE.
  • Om återställningen misslyckas måste alla anrop till SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), returnera SQL_CD_TRUE.

Följande tillståndskoder returneras av alla funktioner som kör ett kommando på servern:

Stat/län Message
IMC01 The connection is broken and recovery is not possible. The client driver attempted to recover the connection one or more times and all attempts failed. Increase the value of ConnectRetryCount to increase the number of recovery attempts.
IMC02 The server did not acknowledge a recovery attempt, connection recovery is not possible.
IMC03 The server did not preserve the exact client TDS version requested during a recovery attempt, connection recovery is not possible.
IMC04 The server did not preserve the exact server major version requested during a recovery attempt, connection recovery is not possible.
IMC05 The connection is broken and recovery is not possible. The connection is marked by the server as unrecoverable. No attempt was made to restore the connection.
IMC06 The connection is broken and recovery is not possible. The connection is marked by the client driver as unrecoverable. No attempt was made to restore the connection.

Example

Följande exempel innehåller två funktioner. func1 visar hur du kan ansluta med ett datakällnamn (DSN) som använder ODBC-drivrutinen för SQL Server i Windows. DSN använder SQL Server-autentisering och anger användar-ID. func1 hämtar sedan antalet anslutningsförsök med SQL_COPT_SS_CONNECT_RETRY_COUNT.

func2 använder SQLDriverConnect, ConnectRetryCount nyckelord för anslutningssträng och anslutningsattribut för att hämta inställningen för återförsök och återförsöksintervall.

// Connection_resiliency.cpp
// compile with: odbc32.lib
#include <windows.h>
#include <stdio.h>
#include <sqlext.h>
#include <msodbcsql.h>

void func1() {
    SQLHENV henv;
    SQLHDBC hdbc;
    SQLHSTMT hstmt;
    SQLRETURN retcode;
    SQLSMALLINT i = 21;

    // Allocate environment handle
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // Set the ODBC version environment attribute
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
        retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (void*)SQL_OV_ODBC3, 0);

        // Allocate connection handle
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

            // Set login timeout to 5 seconds
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

                // Connect to data source
                retcode = SQLConnect(hdbc, (SQLCHAR*)"MyDSN", SQL_NTS, (SQLCHAR*)"userID", SQL_NTS, (SQLCHAR*)"password_for_userID", SQL_NTS);
                retcode = SQLGetConnectAttr(hdbc, SQL_COPT_SS_CONNECT_RETRY_COUNT, &i, SQL_IS_INTEGER, NULL);

                // Allocate statement handle
                if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

                    // Process data
                    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);
                    }

                    SQLDisconnect(hdbc);
                }

                SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
            }
        }
        SQLFreeHandle(SQL_HANDLE_ENV, henv);
    }
}

void func2() {
    SQLHENV henv;
    SQLHDBC hdbc1;
    SQLHSTMT hstmt;
    SQLRETURN retcode;
    SQLSMALLINT i = 21;

#define MAXBUFLEN 255

    SQLCHAR ConnStrIn[MAXBUFLEN] = "DRIVER={ODBC Driver 18 for SQL Server};SERVER=server_that_supports_connection_resiliency;Encrypt=yes;UID=userID;PWD=<password>;ConnectRetryCount=2";
    SQLCHAR ConnStrOut[MAXBUFLEN];

    SQLSMALLINT cbConnStrOut = 0;

    // Allocate environment handle
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // Set the ODBC version environment attribute
    if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {

        retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER*)SQL_OV_ODBC3_80, SQL_IS_INTEGER);

        // Allocate connection handle
        if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
            retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);

            // Set login timeout to 5 seconds
            if (retcode == SQL_SUCCESS || retcode == SQL_SUCCESS_WITH_INFO) {
                // SQLSetConnectAttr(hdbc1, SQL_LOGIN_TIMEOUT, (SQLPOINTER)5, 0);

                retcode = SQLDriverConnect(hdbc1, NULL, ConnStrIn, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT);
            }
            retcode = SQLGetConnectAttr(hdbc1, SQL_COPT_SS_CONNECT_RETRY_COUNT, &i, SQL_IS_INTEGER, NULL);
            retcode = SQLGetConnectAttr(hdbc1, SQL_COPT_SS_CONNECT_RETRY_INTERVAL, &i, SQL_IS_INTEGER, NULL);
        }
    }
}

int main() {
    func1();
    func2();
}

Se även

Microsoft ODBC-drivrutin för SQL Server