Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
pobierz sterownika ODBC
Aby zapewnić, że aplikacje pozostaną połączone, sterownik ODBC może przywrócić bezczynne połączenia.
Ważne
Funkcja odporności połączenia jest obsługiwana w usługach Microsoft Azure SQL Database, Fabric SQL Database i SQL Server 2014 (i nowszych).
Ta funkcja jest dostępna w systemie Windows, począwszy od sterownika Microsoft ODBC 11 dla programu SQL Server. Jest dostępny w systemie Linux, począwszy od wersji 17.2 sterownika Microsoft ODBC Driver 17 dla programu SQL Server.
Aby uzyskać więcej informacji na temat odporności bezczynności połączenia, zobacz Artykuł techniczny — odporność bezczynności połączenia.
Aby kontrolować zachowanie ponownego nawiązywania połączenia, sterownik ODBC dla programu SQL Server ma dwie opcje:
Liczba ponownych prób połączenia.
Licznik ponownych prób połączeń określa liczbę prób ponownego połączenia w przypadku awarii połączenia. Prawidłowe wartości wahają się od 0 do 255. Zero (0) oznacza, że nie próbuj ponownie nawiązać połączenia. Wartość domyślna to jedna próba ponownego nawiązania połączenia.
Liczbę ponownych prób połączenia można zmodyfikować w następujących przypadkach:
Zdefiniuj lub zmodyfikuj źródło danych używające sterownika ODBC dla programu SQL Server za pomocą kontrolki Liczba ponownych prób połączenia .
Użyj słowa kluczowego
ConnectRetryCountw łańcuchu połączenia.Aby pobrać liczbę ponownych prób nawiązania połączenia, użyj atrybutu
SQL_COPT_SS_CONNECT_RETRY_COUNTpołączenia (tylko do odczytu). Jeśli aplikacja łączy się z serwerem, który nie obsługuje odporności połączenia,SQL_COPT_SS_CONNECT_RETRY_COUNTzwraca wartość 0.
Połącz interwał ponawiania prób.
Interwał ponawiania prób połączenia określa liczbę sekund między poszczególnymi próbami ponawiania próby połączenia. Prawidłowe wartości to 1–60. Łączny czas ponownego nawiązywania połączenia nie może przekroczyć limitu czasu połączenia (SQL_ATTR_QUERY_TIMEOUT w pliku SQLSetStmtAttr). Wartość domyślna to 10 sekund.
Interwał ponawiania prób połączenia można zmodyfikować w następujących przypadkach:
Zdefiniuj lub zmodyfikuj źródło danych używające sterownika ODBC dla programu SQL Server za pomocą kontrolki Interwał ponawiania próby połączenia .
Użyj słowa kluczowego parametru połączenia
ConnectRetryInterval.Aby pobrać długość interwału ponawiania prób połączenia, użyj atrybutu
SQL_COPT_SS_CONNECT_RETRY_INTERVALpołączenia (tylko do odczytu).
Jeśli aplikacja nawiązuje połączenie z SQL_DRIVER_COMPLETE_REQUIRED, a później próbuje wykonać instrukcję za pośrednictwem przerwanego połączenia, sterownik ODBC nie wyświetli ponownie okna dialogowego. Ponadto podczas odzyskiwania w toku,
- Podczas odzyskiwania każde wywołanie metody
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)musi zwrócić wartośćSQL_CD_FALSE. - Jeśli odzyskiwanie zakończy się niepowodzeniem, każde wywołanie metody
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)musi zwrócić wartośćSQL_CD_TRUE.
Następujące kody stanu są zwracane przez dowolną funkcję, która wykonuje polecenie na serwerze:
| State | 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
Poniższy przykład zawiera dwie funkcje.
func1 Pokazuje, jak można nawiązać połączenie z nazwą źródła danych (DSN), która używa sterownika ODBC dla programu SQL Server w systemie Windows. DSN używa SQL Server Authentication i określa identyfikator użytkownika.
func1 następnie pobiera liczbę ponownych prób połączenia za pomocą polecenia SQL_COPT_SS_CONNECT_RETRY_COUNT.
func2 używa słów kluczowych w parametrze ConnectRetryCount połączenia i atrybutów połączenia, aby pobrać ustawienia dotyczące ponownych prób połączenia oraz interwału między próbami.
// 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();
}
Zobacz także
sterownik Microsoft ODBC dla programu SQL Server