Funkce SQLConnect

Soulad
Zavedená verze: Dodržování standardů ODBC 1.0: ISO 92

Shrnutí
SQLConnect navazuje spojení s ovladačem a datovým zdrojem. Handle spojení odkazuje na ukládání všech informací o připojení ke zdroji dat, včetně stavu, stavu transakce a chybových informací.

Syntax

  
SQLRETURN SQLConnect(  
     SQLHDBC        ConnectionHandle,  
     SQLCHAR *      ServerName,  
     SQLSMALLINT    NameLength1,  
     SQLCHAR *      UserName,  
     SQLSMALLINT    NameLength2,  
     SQLCHAR *      Authentication,  
     SQLSMALLINT    NameLength3);  

Arguments

ConnectionHandle
[Vstup] Popisovač připojení.

název serveru
[Vstup] Název zdroje dat. Data můžou být umístěná ve stejném počítači jako program nebo v jiném počítači někde v síti. Pro informace o tom, jak aplikace vybírá zdroj dat, viz Volba zdroje dat nebo ovladače.

NameLength1
[Vstup] Délka *ServerName ve znacích.

UserName
[Vstup] Identifikátor uživatele.

NameLength2
[Vstup] Délka *UserName " v znacích.

Authentication
[Vstup] Autentizační řetězec (obvykle heslo).

NameLength3
[Vstup] Délka *Autentizace znaky.

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_ERROR, SQL_INVALID_HANDLE nebo SQL_STILL_EXECUTING.

Diagnostics

Když SQLConnect vrací SQL_ERROR nebo SQL_SUCCESS_WITH_INFO, lze získat přidruženou hodnotu SQLstate, kterou lze získat voláním SQLGetDiagRec s HandleType SQL_HANDLE_DBC a HandlemConnectionHandle. Následující tabulka uvádí hodnoty SQLSTATE, které SQLConnect obvykle vrací, a vysvětluje každou z nich v kontextu této funkce; notace "(DM)" předchází popisům SQLstavů vráceným Správcem ovladačů. Návratový kód přidružený ke každé hodnotě SQLSTATE je SQL_ERROR, pokud není uvedeno jinak.

SQLSTATE Error Description
01000 Obecné upozornění Informační zpráva specifická pro řidiče (Funkce vrátí SQL_SUCCESS_WITH_INFO.)
01S02 Změna hodnoty možnosti Ovladač nepodporoval zadanou hodnotu argumentu ValuePtr v SQLSetConnectAttr a nahradil podobnou hodnotou. (Funkce vrátí SQL_SUCCESS_WITH_INFO.)
08001 Klient nedokáže navázat spojení Ovladač nebyl schopen navázat spojení se zdrojem dat.
08002 Používaný název spojení (DM) Specifikovaný ConnectionHandle již byl použit k navázání spojení se zdrojem dat, a spojení bylo stále otevřené nebo uživatel hledal připojení.
08004 Server spojení odmítl Datový zdroj odmítl navázání spojení z důvodů definovaných implementací.
08S01 Selhání komunikačního propojení Komunikační spojení mezi ovladačem a datovým zdrojem, ke kterému se ovladač snažil připojit, selhalo dříve, než funkce dokončila zpracování.
28000 Specifikace neplatné autorizace Hodnota určená pro argument UserName nebo hodnota určená pro argument Autentizace porušila omezení definovaná datovým zdrojem.
HY000 Obecná chyba Došlo k chybě, pro kterou nebyla definována žádná specifická funkce SQLSTATE a pro kterou nebyla definována žádná implementace sqlSTATE. Chybová zpráva vrácená nástrojem SQLGetDiagRec v vyrovnávací paměti *MessageText popisuje chybu a její příčinu.
HY001 Chyba přidělení paměti (DM) Správce ovladačů nebyl schopen přidělit paměť potřebnou k podpoře provádění nebo dokončení funkce.
HY008 Operace byla zrušena. Asynchronní zpracování bylo povoleno pro ConnectionHandle. Byla vyvolána funkce SQLConnect a před dokončením spuštění byla na ConnectionHandle vyvolána funkce SQLCancelHandle a poté byla funkce SQLConnect znovu volána na ConnectionHandle.

Nebo byla volána funkce SQLConnect a před dokončením spuštění byl SQLCancelHandle volán na ConnectionHandle z jiného vlákna v aplikaci s více vlákny.
HY010 Chyba posloupnosti funkcí (DM) Asynchronně vykonávající funkce (ne tato) byla volána pro ConnectionHandle a stále se spouštěla, když byla tato funkce vyvolána.
HY013 Chyba správy paměti Volání funkce nelze zpracovat, protože základní objekty paměti nelze získat přístup, pravděpodobně kvůli nedostatku paměti.
HY090 Neplatná délka řetězce nebo vyrovnávací paměti (DM) Hodnota určená pro argument NameLength1, NameLength2 nebo NameLength3 byla menší než 0, ale nebyla rovna SQL_NTS.

(DM) Hodnota zadaná pro argument NameLength1 překročila maximální délku názvu datového zdroje.
HYT00 Vypršel časový limit. Doba vypršení dotazu vypršela dříve, než bylo spojení se zdrojem dat dokončeno. Časová doba je nastavena přes SQLSetConnectAttr, SQL_ATTR_LOGIN_TIMEOUT.
HY114 Ovladač nepodporuje asynchronní provádění funkcí na úrovni spojení (DM) Aplikace povolila asynchronní operaci na rukojeti spojení před navázáním spojení. Ovladač však nepodporuje asynchronní operace na připojovací rukojeti.
HYT01 Vypršel časový limit připojení Platnost časového limitu připojení vypršela, než zdroj dat odpověděl na žádost. Časový limit připojení je nastavený prostřednictvím sqlSetConnectAttr SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Ovladač tuto funkci nepodporuje. (DM) Ovladač specifikovaný názvem zdroje dat tuto funkci nepodporuje.
IM002 Zdroj dat nenalezen a není uveden žádný výchozí ovladač (DM) Název zdroje dat uvedený v argumentu ServerName nebyl nalezen v systémových informacích, ani neexistovala výchozí specifikace ovladače.
IM003 Specifikovaný ovladač nebylo možné připojit k (DM) Ovladač uvedený ve specifikaci zdroje dat v systémových informacích nebyl nalezen nebo nemohl být z jiného důvodu propojen.
IM004 Driver's SQLAllocHandle na SQL_HANDLE_ENV selhal (DM) Během SQLConnect Driver Manager volal funkci SQLAllocHandle ovladače pomocí HandleType SQL_HANDLE_ENV a ovladač vrátil chybu.
IM005 Driver's SQLAllocHandle on SQL_HANDLE_DBC failed (DM) Během SQLConnect Driver Manager volal funkci SQLAllocHandle ovladače pomocí HandleType SQL_HANDLE_DBC a ovladač vrátil chybu.
IM006 Driver SQLSetConnectAttr selhal Během SQLConnct správce ovladačů volal funkci SQLSetConnectAttr ovladače a ovladač vrátil chybu. (Funkce vrátí SQL_SUCCESS_WITH_INFO.)
IM009 Nelze se připojit k překladu DLL Ovladač se nemohl připojit k překladovému DLL, které bylo specifikováno pro datový zdroj.
IM010 Název zdroje dat je příliš dlouhý (DM) *Název serveru byl delší než SQL_MAX_DSN_LENGTH znaků.
IM014 Specifikované DSN obsahuje architektonickou nesoulad mezi ovladačem a aplikací (DM) 32bitová aplikace používá DSN připojené k 64bitovému ovladači; Nebo naopak.
IM015 Driverův SQLConnect na SQL_HANDLE_DBC_INFO_HANDLE selhal Pokud ovladač vrátí SQL_ERROR, správce ovladačů SQL_ERROR aplikaci vrátí a spojení selže.

Pro více informací o SQL_HANDLE_DBC_INFO_TOKEN viz Rozvoj Connection-Pool povědomí u řidiče ODBC.
IM017 Dotazování je zakázané v asynchronním režimu oznámení. Při každém použití modelu oznámení je dotazování zakázané.
IM018 K dokončení předchozí asynchronní operace na tomto popisovači nebyla volána funkce SQLCompleteAsync. Pokud předchozí volání funkce na popisovači vrátí SQL_STILL_EXECUTING a pokud je povolen režim oznámení, musí být sqlCompleteAsync volán na popisovači, aby bylo možné provést následné zpracování a dokončit operaci.
S1118 Ovladač nepodporuje asynchronní notifikace Pokud ovladač nepodporuje asynchronní oznámení, nelze nastavit SQL_ATTR_ASYNC_DBC_EVENT ani SQL_ATTR_ASYNC_DBC_RETCODE_PTR.

Comments

Pro informace o tom, proč aplikace používá SQLConnect, viz Connecting with SQLConnect.

Správce ovladačů se k ovladači nepřipojí, dokud aplikace nezavolá funkci (SQLConnect, SQLDriverConnect nebo SQLBrowseConnect), která se k ovladači připojí. Do té doby Driver Manager pracuje se svými vlastními handlery a spravuje informace o připojení. Když aplikace volá funkci připojení, správce ovladačů kontroluje, zda je ovladač aktuálně připojen pro specifikovaný ConnectionHandle:

  • Pokud ovladač není připojen, Driver Manager se k němu připojí a volá SQLAllocHandle pomocí HandleType of SQL_HANDLE_ENV, SQLAllocHandle s HandleType SQL_HANDLE_DBC, SQLSetConnectAttr (pokud aplikace specifikovala nějaké atributy připojení) a funkci spojení v ovladači. Správce ovladačů vrací SQLSTATE IM006 ( SQLSetConnectOption ovladače selhal) a SQL_SUCCESS_WITH_INFO pro funkci připojení, pokud ovladač vrátil chybu pro SQLSetConnectAttr. Pro více informací viz Připojení ke zdroji dat nebo ovladači.

  • Pokud je specifikovaný ovladač již připojen na ConnectionHandle, Driver Manager volá pouze funkci připojení v ovladači. V takovém případě musí ovladač zajistit, aby všechny atributy spojení pro ConnectionHandle zůstaly aktuální nastavení.

  • Pokud je připojen jiný ovladač, správce ovladačů volá SQLFreeHandle s HandleType SQL_HANDLE_DBC, a pokud není v daném prostředí připojen žádný jiný ovladač, zavolá SQLFreeHandle s HandleType SQL_HANDLE_ENV v připojeném ovladači a poté ovladač odpojí. Poté provádí stejné operace jako když ovladač není připojen.

Ovladač pak alokuje, rukojeti a inicializuje sám sebe.

Když aplikace volá SQLDisconnect, Správce ovladačů volá SQLDisconnect v ovladači. Ovladač se však neodpojí. Tím zůstává ovladač v paměti pro aplikace, které se opakovaně připojují a odpojují od datového zdroje. Když aplikace volá SQLFreeHandle s HandleType SQL_HANDLE_DBC, Driver Manager zavolá SQLFreeHandle s HandleType SQL_HANDLE_DBC a poté SQLFreeHandle s HandleType SQL_HANDLE_ENV v ovladači a poté ovladač odpojí.

Aplikace ODBC může navázat více než jedno spojení.

Pokyny pro řidiče

Obsah *ServerName ovlivňuje, jak Driver Manager a ovladač spolupracují při navázání spojení se zdrojem dat.

  • Pokud *ServerName obsahuje platné jméno zdroje dat, správce ovladačů najde odpovídající specifikaci zdroje v systémových informacích a připojí se k příslušnému ovladači. Správce ovladačů předává každý argument SQLConnect ovladači.

  • Pokud nelze najít název zdroje dat nebo je ServerName null, Driver Manager najde výchozí specifikaci zdroje dat a připojí se k příslušnému ovladači. Správce ovladačů předá ovladači nezměněné argumenty UserName a Authentication , a "DEFAULT" pro argument ServerName .

  • Pokud je argument ServerName "DEFAULT", Driver Manager vyhledá výchozí specifikaci zdroje dat a připojí se k příslušnému ovladači. Správce ovladačů předává každý argument SQLConnect ovladači.

  • Pokud nelze najít název zdroje dat nebo je ServerName nullovým ukazatelem a výchozí specifikace zdroje dat neexistuje, správce ovladačů SQL_ERROR vrátí s SQLSTATE IM002 (název zdroje dat nenalezen a výchozí ovladač není specifikován).

Po připojení Driver Managerem může ovladač najít odpovídající specifikaci zdroje dat v systémových informacích a použít specifické informace ze specifikace k dokončení požadované sady informací o připojení.

Pokud je v systémových informacích pro datový zdroj specifikována výchozí překladová knihovna, ovladač se k ní připojí. Jinou překladovou knihovnu lze připojit voláním SQLSetConnectAttr s atributem SQL_ATTR_TRANSLATE_LIB. Možnost překladu lze zvolit voláním SQLSetConnectAttr s atributem SQL_ATTR_TRANSLATE_OPTION.

Pokud ovladač podporuje SQLConnect, musí sekce klíčových slov v systémových informacích pro ovladač obsahovat klíčové slovo ConnectFunctions s prvním znakem nastaveným na "Y."

Sdružování připojení

Poolování spojení umožňuje aplikaci znovu použít již vytvořené spojení. Když je pooling spojení povolen a SQLConnect je volán, Driver Manager se snaží navázat spojení pomocí spojení, které je součástí poolu v prostředí určeném pro pooling spojení. Toto prostředí je sdílené prostředí, které používají všechny aplikace, jež využívají spojení v poolu.

Poolování spojení je povoleno před alokací prostředí voláním SQLSetEnvAttr , které nastaví SQL_ATTR_CONNECTION_POOLING na SQL_CP_ONE_PER_DRIVER (což specifikuje maximálně jeden pool na ovladač) nebo SQL_CP_ONE_PER_HENV (který určuje maximálně jeden pool na prostředí). SQLSetEnvAttr se v tomto případě volá s nastavením EnvironmentHandle na null, což z atributu činí atribut na úrovni procesu. Pokud je SQL_ATTR_CONNECTION_POOLING nastaveno na SQL_CP_OFF, pooling připojení je zakázán.

Po povolení poolingu spojení je SQLAllocHandle s HandleType SQL_HANDLE_ENV vyvolán pro alokaci prostředí. Prostředí přidělené tímto hovorem je sdílené prostředí, protože pooling spojení bylo povoleno. Prostředí, které bude použito, však není určeno, dokud není vyvolán SQLAllocHandle s HandleType SQL_HANDLE_DBC.

SQLAllocHandle s HandleType of SQL_HANDLE_DBC je volán k alokaci spojení. Správce ovladačů se snaží najít existující sdílené prostředí, které odpovídá atributům nastaveným aplikací. Pokud takové prostředí neexistuje, vytváří se jako implicitní sdílené prostředí. Pokud je nalezeno odpovídající sdílené prostředí, aplikaci se vrátí handle prostředí a jeho počet referencí se zvýší.

Připojení, které bude použito, však není určeno až do vyvolání SQLConnect . V tu chvíli se Driver Manager snaží najít existující spojení v poolu připojení, které splňuje kritéria požadovaná aplikací. Tato kritéria zahrnují možnosti připojení požadované při volání do SQLConnect (hodnoty klíčových slov ServerName, UserName a Authenticing ) a jakékoli atributy připojení nastavené od vyvolání SQLAllocHandle s HandleType SQL_HANDLE_DBC. Driver Manager kontroluje tato kritéria podle odpovídajících klíčových slov a atributů spojení v rámci poolu. Pokud se najde shoda, použije se spojení v poolu. Pokud se nenajde shoda, vytvoří se nové spojení.

Pokud je atribut SQL_ATTR_CP_MATCH prostředí nastaven na SQL_CP_STRICT_MATCH, musí být shoda přesná, aby bylo možné použít spojení v poolu. Pokud je atribut SQL_ATTR_CP_MATCH prostředí nastaven na SQL_CP_RELAXED_MATCH, musí se možnosti připojení ve volání SQLConnect shodovat, ale ne všechny atributy spojení.

Následující pravidla se aplikují, když atribut spojení, nastavený aplikací před voláním SQLConnect , neodpovídá atributu spojení spojení v poolu:

  • Pokud musí být atribut spojení nastaven před navázáním spojení:

    Pokud je SQL_ATTR_CP_MATCH SQL_CP_STRICT_MATCH, musí být SQL_ATTR_PACKET_SIZE ve spojení ve skupině totožné s atributovou sadou aplikace. Pokud SQL_CP_RELAXED_MATCH, hodnoty SQL_ATTR_PACKET_SIZE mohou být různé.

    Hodnota SQL_ATTR_LOGIN_VALUE neovlivňuje samotný zápas.

  • Pokud lze atribut spojení nastavit buď před, nebo po navázání spojení:

    Pokud atribut spojení nebyl nastaven aplikací, ale byl nastaven na spojení ve skupině a existuje výchozí nastavení, atribut spojení ve skupině se vrátí na výchozí hodnotu a je deklarováno shodování. Pokud nedojde k defaultu, spojené spojení se nepovažuje za shodu.

    Pokud byl atribut spojení nastaven aplikací, ale nebyl nastaven na spojení v poolu, atribut connection v poolu se změní na atribut nastavený aplikací a je deklarováno shoda.

    Pokud byl atribut spojení nastaven aplikací a byl také nastaven na spojení v poolu, ale hodnoty jsou odlišné, použije se hodnota atributu spojení aplikace a je deklarováno shodování.

  • Pokud hodnoty atributů spojení specifických pro ovladač nejsou totožné a SQL_ATTR_CP_MATCH je nastaveno na SQL_CP_STRICT_MATCH, spojení v poolu se nepoužívá.

Když aplikace zavolá SQLDisconnect k odpojení, spojení se vrátí do poolu a je k dispozici pro opětovné použití.

Optimalizace výkonu poolingu spojení

Pokud jsou zapojeny distribuované transakce, je možné optimalizovat výkon poolingu spojení pomocí SQL_DTC_TRANSITION_COST, což je SQLUINTEGER bitmask. Přechody, o kterých se mluví, jsou přechody atributu spojení SQL_ATTR_ENLIST_IN_DTC přechodu z hodnoty 0 do nenulové hodnoty a naopak. Jedná se o spojení přechodu z nezařazení do distribuované transakce na zařazení do distribuované transakce a naopak. V závislosti na tom, jak řidič implementoval zařazení (nastavení atributu spojení SQL_ATTR_ENLIST_IN_DTC), mohou být tyto přechody nákladné a proto by se jim mělo vyhnout pro nejlepší výkon.

Hodnota vrácená ovladačem obsahuje libovolnou kombinaci následujících bitů:

  • SQL_DTC_ENLIST_EXPENSIVE, když je nastaven, znamená, že přechod z nuly na nenulu je výrazně dražší než přechod z nenulového na jinou nenulovou hodnotu (při začlenění dříve zapsaného spojení do další transakce).

  • SQL_DTC_UNENLIST_EXPENSIVE, když je nastaveno, znamená, že přechod z nenuly na nulu je výrazně dražší než použití spojení, jehož atribut SQL_ATTR_ENLIST_IN_DTC je již nastaven na nulu.

Existuje kompromis mezi výkonem a využitím připojení. Pokud ovladač uvede, že jeden nebo více těchto přechodů je nákladné, správce ovladačů na to reaguje tím, že ponechá více spojení ve skupině. Některá spojení v poolu jsou preferována pro netransakční použití, jiná pro transakční použití. Pokud však ovladač uvádí, že tyto přechody nejsou nákladné, lze použít méně spojení, možná střídavě mezi netransakčním a transakčním použitím.

Ovladače, které nepodporují SQL_ATTR_ENLIST_IN_DTC, nemusí podporovat SQL_DTC_TRANSITION_COST. U ovladačů, které podporují SQL_ATTR_ENLIST_IN_DTC, ale ne SQL_DTC_TRANSITION_COST, se předpokládá, že přechody nejsou drahé, jako by ovladač vracel 0 (bez nastavených bitů) pro tuto hodnotu.

Ačkoliv byl SQL_DTC_TRANSITION_COST zaveden v ODBC 3.5, ODBC 2. Ovladač X jej také podporuje, protože správce ovladačů tyto informace dotazuje bez ohledu na verzi ovladače.

Příklad kódu

V následujícím příkladu aplikace přiděluje prostředí a kontaktní handle. Poté se připojí ke zdroji dat SalesOrders s uživatelským ID JohnS a heslem Sesame a zpracovává data. Po dokončení zpracování dat se odpojí od zdroje dat a uvolní rukojeti.

// SQLConnect_ref.cpp  
// compile with: odbc32.lib  
#include <windows.h>  
#include <sqlext.h>  
  
int main() {  
   SQLHENV henv;  
   SQLHDBC hdbc;  
   SQLHSTMT hstmt;  
   SQLRETURN retcode;  
  
   SQLCHAR * OutConnStr = (SQLCHAR * )malloc(255);  
   SQLSMALLINT * OutConnStrLen = (SQLSMALLINT *)malloc(255);  
  
   // 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*) "NorthWind", SQL_NTS, (SQLCHAR*) NULL, 0, NULL, 0);  
  
            // 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);  
   }  
}  
Informace o Podívejte se
Přiřazení rukojeti SQLAllocHandle Function
Objevování a vyčíslování hodnot potřebných k připojení ke zdroji dat Funkce SQLBrowseConnect
Odpojení od datového zdroje Funkce SQLDisconnect
Připojení ke zdroji dat pomocí připojovací řetězec nebo dialogového okna FUNKCE SQLDriverConnect
Vrácení nastavení atributu připojení FUNKCE SQLGetConnectAttr
Nastavení atributu spojení SQLSetConnectAttr – funkce

Viz také

Referenční rozhraní ODBC API
Soubory hlaviček ODBC