Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
ODBC-stuurprogramma downloaden
Om ervoor te zorgen dat toepassingen verbonden blijven, kan het ODBC-stuurprogramma niet-actieve verbindingen herstellen.
Belangrijk
De functie voor verbindingstolerantie wordt ondersteund in serverversies van Microsoft Azure SQL Database, Fabric SQL Database en SQL Server 2014 (en hoger).
De functie is beschikbaar in Windows vanaf Microsoft ODBC-stuurprogramma 11 voor SQL Server. Het is beschikbaar op Linux vanaf versie 17.2 van Microsoft ODBC-stuurprogramma 17 voor SQL Server.
Zie het technische artikel - Niet-actieve verbindingstolerantie voor meer informatie over niet-actieve verbindingstolerantie.
Het ODBC-stuurprogramma voor SQL Server heeft twee opties om het gedrag van opnieuw verbinden te beheren:
Aantal nieuwe pogingen voor verbinding.
Het aantal nieuwe pogingen om verbinding te maken, bepaalt het aantal pogingen om opnieuw verbinding te maken als er een verbindingsfout optreedt. Geldige waarden variëren van 0 tot 255. Nul (0) betekent dat er geen poging wordt gedaan om opnieuw verbinding te maken. De standaardwaarde is één poging om opnieuw verbinding te maken.
U kunt het aantal nieuwe pogingen wijzigen wanneer u:
Definieer of wijzig een gegevensbron die gebruikmaakt van het ODBC-stuurprogramma voor SQL Server met de instelling Aantal verbindingpogingen.
Gebruik het verbindingsreeks sleutelwoord
ConnectRetryCount.Gebruik het
SQL_COPT_SS_CONNECT_RETRY_COUNTverbindingskenmerk (alleen-lezen) om het aantal nieuwe pogingen voor de verbinding op te halen. Als een toepassing verbinding maakt met een server die geen ondersteuning biedt voor verbindingstolerantie,SQL_COPT_SS_CONNECT_RETRY_COUNTretourneert u 0.
Interval voor opnieuw verbinding maken.
Het interval voor het opnieuw proberen van verbinding geeft het aantal seconden aan tussen elke poging tot opnieuw proberen van de verbinding. Geldige waarden zijn 1-60. De totale tijd die nodig is om opnieuw verbinding te maken, kan de time-out van de verbinding (SQL_ATTR_QUERY_TIMEOUT in SQLSetStmtAttr) niet overschrijden. De standaardwaarde is 10 seconden.
U kunt het interval voor het opnieuw proberen van de verbinding wijzigen wanneer u:
Definieer of wijzig een gegevensbron die gebruikmaakt van het ODBC-stuurprogramma voor SQL Server met de controle Interval voor opnieuw proberen verbinden.
Gebruik het trefwoord voor de
ConnectRetryIntervalverbindingsreeks.Als u de lengte van het interval voor het opnieuw proberen van de verbinding wilt ophalen, gebruikt u het
SQL_COPT_SS_CONNECT_RETRY_INTERVALverbindingskenmerk (alleen-lezen).
Als een toepassing een verbinding tot stand brengt met SQL_DRIVER_COMPLETE_REQUIRED en later probeert een instructie uit te voeren via een verbroken verbinding, wordt het dialoogvenster niet opnieuw weergegeven in het ODBC-stuurprogramma. Ook tijdens het lopende herstel,
- Tijdens het herstel moet elke aanroep naar
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD), terugkerenSQL_CD_FALSE. - Als het herstel mislukt, moet een aanroep naar
SQLGetConnectAttr(SQL_COPT_SS_CONNECTION_DEAD)SQL_CD_TRUEretourneren.
De volgende statuscodes worden geretourneerd door een functie die een opdracht uitvoert op de server:
| Staat | 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
Het volgende voorbeeld bevat twee functies.
func1 laat zien hoe u verbinding kunt maken met een gegevensbronnaam (DSN) die gebruikmaakt van het ODBC-stuurprogramma voor SQL Server in Windows. De DSN maakt gebruik van SQL Server-verificatie en geeft de gebruikers-id op.
func1 haalt vervolgens het aantal nieuwe pogingen voor de verbinding op met SQL_COPT_SS_CONNECT_RETRY_COUNT.
func2 gebruikt SQLDriverConnect, ConnectRetryCount verbindingsreeks trefwoord en verbindingskenmerken om de instelling voor nieuwe pogingen en interval voor pogingen op te halen.
// 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();
}