Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
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 returnerarSQL_COPT_SS_CONNECT_RETRY_COUNT0.
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), returneraSQL_CD_FALSE. - Om återställningen misslyckas måste alla anrop till
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), returneraSQL_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();
}