Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
ODBC-illesztőprogram letöltése
Annak érdekében, hogy az alkalmazások továbbra is csatlakoztatva maradjanak, az ODBC-illesztő visszaállíthatja az inaktív kapcsolatokat.
Fontos
A kapcsolat rugalmassági funkciója támogatott a Microsoft Azure SQL Database, a Fabric SQL Database és az SQL Server 2014 (és újabb) kiszolgálóverzióiban.
A funkció Windows rendszeren érhető el, kezdve az SQL Serverhez készült Microsoft ODBC Driver 11-zel. Linuxon érhető el az SQL Serverhez készült Microsoft ODBC Driver 17 17.2-es verziójától kezdve.
Az inaktív kapcsolatok rugalmasságáról további információt a műszaki cikk – Tétlen kapcsolat rugalmassága című témakörben talál.
Az újracsatlakozási viselkedés szabályozásához az SQL Server ODBC-illesztőprogramjának két lehetősége van:
Kapcsolat ismétlési száma.
A csatlakozási újrapróbálkozások száma szabályozza az újracsatlakozási kísérletek számát, ha csatlakozási hiba történik. Az érvényes értékek 0 és 255 között mozognak. A nulla (0) azt jelenti, hogy ne kíséreljen meg újracsatlakozni. Az alapértelmezett érték egy újracsatlakozási kísérlet.
Az újrapróbálkozások számát a következő esetekben módosíthatja:
Definiálhat vagy módosíthat olyan adatforrást, amely az SQL Server ODBC-illesztőjét használja a Kapcsolat újrapróbálkozási száma vezérlővel.
Használja a kapcsolat string
ConnectRetryCountkulcsszót.A kapcsolat újrapróbálkozási kísérleteinek számának lekéréséhez használja az
SQL_COPT_SS_CONNECT_RETRY_COUNT(írásvédett) kapcsolatattribútumot. Ha egy alkalmazás olyan kiszolgálóhoz csatlakozik, amely nem támogatja a kapcsolat rugalmasságát,SQL_COPT_SS_CONNECT_RETRY_COUNT0 értéket ad vissza.
Kapcsolódási újrapróbálkozási időköz.
A kapcsolódási újrapróbálkozási időköz az egyes újrapróbálkozási kísérletek között eltelt másodpercek számát határozza meg. Az érvényes értékek 1–60. Az újracsatlakozáshoz szükséges teljes idő nem haladhatja meg a kapcsolati időtúllépést (SQL_ATTR_QUERY_TIMEOUT az SQLSetStmtAttr-ben). Az alapértelmezett érték 10 másodperc.
A kapcsolat újrapróbálkozási időközét a következő esetekben módosíthatja:
Definiálhat vagy módosíthat egy adatforrást, amely az SQL Server ODBC-illesztőjét használja a Connect Retry Interval vezérlővel.
Használja a kapcsolati sztring
ConnectRetryIntervalkulcsszót.A kapcsolat újrapróbálkozási időközének hosszának lekéréséhez használja az
SQL_COPT_SS_CONNECT_RETRY_INTERVAL(írásvédett) kapcsolatattribútumot.
Ha egy alkalmazás kapcsolatot létesít SQL_DRIVER_COMPLETE_REQUIRED, és később megpróbál egy utasítást végrehajtani egy megszakadt kapcsolaton keresztül, az ODBC-illesztő nem fogja ismét megjeleníteni a párbeszédpanelt. Emellett a folyamatban lévő helyreállítás során
- A helyreállítás során a(z)
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)hívásnakSQL_CD_FALSEértéket kell visszaadnia. - Ha a helyreállítás sikertelen, minden hívásnak
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)SQL_CD_TRUEértéket kell visszaadnia.
A következő állapotkódokat bármely olyan függvény adja vissza, amely parancsot hajt végre a kiszolgálón:
| Állam | 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
Az alábbi minta két függvényt tartalmaz.
func1 Bemutatja, hogyan csatlakozhat egy olyan adatforrásnévvel (DSN), amely a Windowson futó SQL Server ODBC-illesztőjét használja. A DSN SQL Server-hitelesítést használ, és megadja a felhasználói azonosítót.
func1 ezután a SQL_COPT_SS_CONNECT_RETRY_COUNT segítségével lekéri a kapcsolati újrapróbálkozások számát.
A func2 a SQLDriverConnect kapcsolati karakterlánc kulcsszavát és a ConnectRetryCount kapcsolati attribútumokat használja a kapcsolati újrapróbálkozások számának és az újrapróbálkozás időközének beállításának lekérésére.
// 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();
}