Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Aby aplikace zůstaly připojené, ovladač ODBC může obnovit nečinná připojení.
Důležité
Funkce odolnosti připojení je podporovaná ve verzích serveru Microsoft Azure SQL Database, Fabric SQL Database a SQL Server 2014 (a novějších).
Tato funkce je dostupná ve Windows počínaje ovladačem Microsoft ODBC 11 pro SQL Server. Je k dispozici v Linuxu od verze 17.2 ovladače Microsoft ODBC 17 pro SQL Server.
Další informace o odolnosti nečinných připojení najdete v technickém článku – Odolnost nečinných připojení.
Pro řízení chování opětovného připojení má ovladač ODBC pro SQL Server dvě možnosti:
Počet opakování připojení.
Počet opakování připojení řídí počet pokusů o opětovné připojení, pokud dojde k selhání připojení. Platné hodnoty jsou v rozsahu od 0 do 255. Nula (0) znamená, že se nepokoušejte se znovu připojit. Výchozí hodnota je jeden pokus o opětovné připojení.
Počet opakovaných pokusů o připojení můžete změnit v těchto případech:
Definujte nebo upravte zdroj dat, který používá ovladač ODBC pro SQL Server pomocí ovládacího prvku Počet opakování připojení .
Použijte klíčové slovo připojovacího
ConnectRetryCountřetězce.Pokud chcete načíst počet pokusů o opakování připojení, použijte
SQL_COPT_SS_CONNECT_RETRY_COUNTatribut připojení (jen pro čtení). Pokud se aplikace připojí k serveru, který nepodporuje odolnost připojení,SQL_COPT_SS_CONNECT_RETRY_COUNTvrátí hodnotu 0.
Interval opakování připojení.
Interval opakování připojení určuje počet sekund mezi jednotlivými pokusy o opakování připojení. Platné hodnoty jsou 1–60. Celková doba opětovného připojení nesmí překročit časový limit připojení (SQL_ATTR_QUERY_TIMEOUT v SQLSetStmtAttr). Výchozí hodnota je 10 sekund.
Interval opakování připojení můžete změnit, když:
Definujte nebo upravte zdroj dat, který používá ovladač ODBC pro SQL Server pomocí ovládacího prvku Connect Retry Interval .
Použijte klíčové slovo připojovacího
ConnectRetryIntervalřetězce.Pokud chcete načíst délku intervalu opakování připojení, použijte
SQL_COPT_SS_CONNECT_RETRY_INTERVALatribut připojení (jen pro čtení).
Pokud aplikace vytvoří připojení k SQL_DRIVER_COMPLETE_REQUIRED a později se pokusí spustit příkaz přes přerušené připojení, ovladač ODBC dialogové okno znovu nezobrazí. Také během probíhajícího obnovení
- Během obnovení musí jakékoli volání na
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)vrátitSQL_CD_FALSE. - Pokud obnovení selže, jakékoli volání na
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)musí vrátitSQL_CD_TRUE.
Následující stavové kódy vrátí libovolná funkce, která na serveru spustí příkaz:
| Stát | 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
Následující ukázka obsahuje dvě funkce.
func1 znázorňuje, jak se můžete připojit pomocí názvu zdroje dat (DSN), který používá ovladač ODBC pro SQL Server ve Windows. DSN používá ověřování SQL Serveru a určuje ID uživatele.
func1 pak načte počet opakovaných pokusů o připojení s SQL_COPT_SS_CONNECT_RETRY_COUNT.
func2 používá SQLDriverConnectklíčové ConnectRetryCount slovo připojovacího řetězce a atributy připojení k načtení nastavení pro opakování připojení a interval opakování.
// 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();
}