SQLDriverConnect-functie

Conformiteit
Versie geïntroduceerd: ODBC 1.0 Standaardnaleving: ODBC

Samenvatting
SQLDriverConnect is een alternatief voor SQLConnect. Het ondersteunt databronnen die meer verbindingsinformatie vereisen dan de drie argumenten in SQLConnect, dialoogvensters die de gebruiker om alle verbindingsinformatie vragen, en databronnen die niet in de systeeminformatie zijn gedefinieerd. Voor meer informatie, zie Verbinden met SQLDriverConnect.

Syntax

  
SQLRETURN SQLDriverConnect(  
     SQLHDBC         ConnectionHandle,  
     SQLHWND         WindowHandle,  
     SQLCHAR *       InConnectionString,  
     SQLSMALLINT     StringLength1,  
     SQLCHAR *       OutConnectionString,  
     SQLSMALLINT     BufferLength,  
     SQLSMALLINT *   StringLength2Ptr,  
     SQLUSMALLINT    DriverCompletion);  

Arguments

ConnectionHandle
[Invoer] Verbindingsgreep.

WindowHandle
[Invoer] Raamhandvat. De applicatie kan de handle van het oudervenster, indien van toepassing, doorgeven, of een nullpointer als de vensterhandle niet van toepassing is of SQLDriverConnect geen dialoogvensters zal tonen.

InConnectionString
[Invoer] Een volledige verbindingsreeks (zie de syntaxis in "Comments"), een partial verbindingsreeks, of een lege string.

StringLength1
[Invoer] Lengte van *InConnectionString, in tekens als de string Unicode is, of bytes als string ANSI of DBCS is.

OutConnectionString
[Output] Wijs naar een buffer voor de voltooide verbindingsreeks. Bij succesvolle verbinding met de doel-databron bevat deze buffer de voltooide verbindingsreeks. Applicaties moeten minstens 1.024 tekens toewijzen voor deze buffer.

Als OutConnectionString NULL is, zal StringLength2Ptr nog steeds het totale aantal tekens teruggeven (exclusief het null-beëindigingsteken voor tekengegevens) dat beschikbaar is om terug te geven in de buffer waarnaar OutConnectionString wijst.

BufferLength
[Invoer] Lengte van de *OutConnectionString-buffer , in tekens.

StringLength2Ptr
[Output] Wijs naar een buffer waarin het totale aantal tekens (exclusief het null-beëindigingsteken) dat beschikbaar is in *OutConnectionString, wordt teruggegeven. Als het aantal tekens dat kan worden teruggegeven groter is dan of gelijk aan BufferLength, wordt de voltooide verbindingsreeks in *OutConnectionString afgekapt tot BufferLength minus de lengte van een null-terminatiekarakter.

DriverCompletion
[Invoer] Flag die aangeeft of de Driver Manager of driver om meer verbindingsinformatie moet vragen:

SQL_DRIVER_PROMPT, SQL_DRIVER_COMPLETE, SQL_DRIVER_COMPLETE_REQUIRED of SQL_DRIVER_NOPROMPT.

(Voor meer informatie, zie "Reacties.")

Returns

SQL_SUCCESS, SQL_SUCCESS_WITH_INFO, SQL_NO_DATA, SQL_ERROR, SQL_INVALID_HANDLE of SQL_STILL_EXECUTING.

Diagnostics

Wanneer SQLDriverConnect ofwel SQL_ERROR of SQL_SUCCESS_WITH_INFO teruggeeft, kan een bijbehorende SQLSTATE-waarde worden verkregen door SQLGetDiagRec aan te roepen met een fHandleType van SQL_HANDLE_DBC en een hHandle van ConnectionHandle. De volgende tabel geeft een overzicht van de SQLSTATE-waarden die vaak door SQLDriverConnect worden geretourneerd en legt elk uit in de context van deze functie; de notatie "(DM)" gaat vooraf aan de beschrijvingen van SQLSTATES die door de Driver Manager worden teruggegeven. De retourcode die is gekoppeld aan elke SQLSTATE-waarde is SQL_ERROR, tenzij anders vermeld.

SQLSTATE Fout Description
01000 Algemene waarschuwing Stuurprogrammaspecifiek informatiebericht. (Functie retourneert SQL_SUCCESS_WITH_INFO.)
01004 Tekenreeksgegevens, rechts afgekapt De buffer *OutConnectionString was niet groot genoeg om de volledige verbindingsreeks terug te geven, dus werd de verbindingsreeks afgekapt. De lengte van de niet-afgeknotte verbindingsreeks wordt teruggegeven in *StringLength2Ptr. (Functie retourneert SQL_SUCCESS_WITH_INFO.)
01S00 Ongeldige verbindingsreeks-attribuut Er werd een ongeldig attribuut-sleutelwoord opgegeven in de verbindingsreeks (InConnectionString), maar de driver kon toch verbinding maken met de databron. (Functie retourneert SQL_SUCCESS_WITH_INFO.)
01S02 Optiewaarde gewijzigd De driver ondersteunde de gespecificeerde waarde die door het ValuePtr-argument in SQLSetConnectAttr werd aangeduid niet en gebruikte een vergelijkbare waarde. (Functie retourneert SQL_SUCCESS_WITH_INFO.)
01S08 Foutopslaan van bestand DSN De string in *InConnectionString bevatte een FILEDSN-sleutelwoord , maar het .dsn-bestand werd niet opgeslagen. (Functie retourneert SQL_SUCCESS_WITH_INFO.)
01S09 Ongeldig trefwoord (DM) De string in *InConnectionString bevatte een SAVEFILE-sleutelwoord maar geen DRIVER of FILEDSN-sleutelwoord . (Functie retourneert SQL_SUCCESS_WITH_INFO.)
08001 Client kan geen verbinding tot stand brengen De driver kon geen verbinding maken met de databron.
08002 Verbindingsnaam in gebruik (DM) De gespecificeerde ConnectionHandle was al gebruikt om een verbinding met een databron op te bouwen, en de verbinding was nog steeds open.
08004 Server weigerde de verbinding De databron wees de verbinding af om implementatie-gedefinieerde redenen.
08S01 Communicatiekoppelingsfout De communicatielink tussen de driver en de databron waarmee de driver probeerde verbinding te maken, faalde voordat de SQLDriverConnect-functie de verwerking voltooide.
28000 Ongeldige autorisatiespecificatie Ofwel de gebruikersidentificatie, de autorisatiestring, of beide, zoals gespecificeerd in de verbindingsreeks (InConnectionString), schonden beperkingen die door de databron zijn gedefinieerd.
HY000 Algemene fout Er is een fout opgetreden waarvoor er geen specifieke SQLSTATE is en waarvoor geen implementatiespecifieke SQLSTATE is gedefinieerd. Het foutbericht dat door SQLGetDiagRec in de *szMessageText-buffer wordt teruggegeven, beschrijft de fout en de oorzaak ervan.
HY000 Algemene fout: Ongeldig bestand dsn (DM) De string in *InConnectionString bevatte een FILEDSN-sleutelwoord, maar de naam van het .dsn-bestand werd niet gevonden.
HY000 Algemene fout: Kan geen bestandsbuffer aanmaken (DM) De string in *InConnectionString bevatte een FILEDSN-sleutelwoord, maar het .dsn-bestand was onleesbaar.
HY001 Fout bij geheugentoewijzing De Driver Manager kon het geheugen dat nodig was om de uitvoering of voltooiing van de SQLDriverConnect-functie niet toe te wijzen.

Het stuurprogramma kan geen geheugen toewijzen dat nodig is om de uitvoering of voltooiing van de functie te ondersteunen.
HY008 Bewerking geannuleerd Asynchrone verwerking werd ingeschakeld voor de ConnectionHandle. De functie werd aangeroepen, en voordat de uitvoering werd voltooid, werd de SQLCancelHandle-functie aangeroepen op de ConnectionHandle, waarna de SQLDriverConnect-functie opnieuw werd aangeroepen op de ConnectionHandle.

Of, de SQLDriverConnect-functie werd aangeroepen, en voordat deze werd uitgevoerd, werd SQLCancelHandle aangeroepen op de ConnectionHandle vanuit een andere thread in een multithread-applicatie.
HY010 Fout in functiereeks (DM) Een andere asynchroon uitvoerende functie (niet SQLDriverConnect) werd aangeroepen voor de ConnectionHandle en was nog steeds aan het uitvoeren toen de SQLDriverConnect-functie werd aangeroepen.
HY013 Fout bij geheugenbeheer De SQLDriverConnect-functieaanroep kon niet worden verwerkt omdat de onderliggende geheugenobjecten niet toegankelijk konden worden, mogelijk vanwege lage geheugencondities.
HY090 Ongeldige tekenreeks- of bufferlengte (DM) De waarde die werd gespecificeerd voor argument StringLength1 was kleiner dan 0 en was niet gelijk aan SQL_NTS.

(DM) De waarde die is opgegeven voor argument BufferLength was kleiner dan 0.
HY092 Ongeldige attribuut/optie-identificatie (DM) Het DriverCompletement-argument was SQL_DRIVER_PROMPT, en het WindowHandle-argument was een nullpointer.
HY110 Ongeldige drivervoltooiing (DM) De waarde die voor het argument DriverCompletion werd gespecificeerd, was niet gelijk aan SQL_DRIVER_PROMPT, SQL_DRIVER_COMPLETE, SQL_DRIVER_COMPLETE_REQUIRED of SQL_DRIVER_NOPROMPT.

(DM) Connection pooling was ingeschakeld, en de waarde die voor het argument DriverCompletion was gespecificeerd was niet gelijk aan SQL_DRIVER_NOPROMPT.
HYC00 Optionele functie niet geïmplementeerd De driver ondersteunt niet de versie van ODBC-gedrag die de applicatie heeft gevraagd.
HYT00 Time-out verlopen De inlogtime-out periode liep af voordat de verbinding met de databron werd voltooid. De time-out periode wordt ingesteld via SQLSetConnectAttr, SQL_ATTR_LOGIN_TIMEOUT.
HYT01 Time-out voor de verbinding is overschreden De time-outperiode voor de verbinding is verlopen voordat de gegevensbron op de aanvraag heeft gereageerd. De time-outperiode voor de verbinding wordt ingesteld via SQLSetConnectAttr, SQL_ATTR_CONNECTION_TIMEOUT.
IM001 Stuurprogramma biedt geen ondersteuning voor deze functie (DM) De driver die overeenkomt met de opgegeven gegevensbronnaam ondersteunt de functie niet.
IM002 Gegevensbron niet gevonden en geen standaard driver gespecificeerd (DM) De naam van de gegevensbron die in de verbindingsreeks (InConnectionString) werd gespecificeerd, werd niet gevonden in de systeeminformatie, en er was geen standaarddriverspecificatie.

(DM) ODBC-gegevensbron- en standaardstuurinformatie kon niet worden gevonden in de systeeminformatie.
IM003 De opgegeven driver kon niet worden geladen (DM) De driver die in de databronspecificatie in de systeeminformatie werd vermeld of werd gespecificeerd door het DRIVER-sleutelwoord werd niet gevonden of kon om een andere reden niet worden geladen.
IM004 De SQLAllocHandle van de driver op SQL_HANDLE_ENV faalde (DM) Tijdens SQLDriverConnect riep de Driver Manager de SQLAllocHandle-functie van de driver aan met een fHandleType SQL_HANDLE_ENV en de driver gaf een foutmelding.
IM005 De SQLAllocHandle van de driver op SQL_HANDLE_DBC faalde. (DM) Tijdens SQLDriverConnect riep de Driver Manager de SQLAllocHandle-functie van de driver aan met een fHandleType van SQL_HANDLE_DBC en de driver gaf een foutmelding.
IM006 De driver's SQLSetConnectAttr faalde (DM) Tijdens SQLDriverConnect riep de Driver Manager de SQLSetConnectAttr-functie van de driver aan en gaf de driver een foutmelding.
IM007 Geen databron of driver gespecificeerd; Dialoog verboden Er werd geen naam of driver van de databron opgegeven in de verbindingsreeks, en DriverCompletion was SQL_DRIVER_NOPROMPT.
IM008 Dialoog mislukte De driver probeerde zijn inlogvenster te tonen en faalde.

WindowHandle was een nullpointer, en DriverCompletion was niet SQL_DRIVER_NO_PROMPT.
IM009 Vertaaldll kan niet laden De driver kon de vertaal-DLL die voor de databron of voor de verbinding was gespecificeerd niet laden.
IM010 Naam van de gegevensbron is te lang (DM) De attribuutwaarde voor het DSN-sleutelwoord was langer dan SQL_MAX_DSN_LENGTH tekens.
IM011 Rijdersnaam te lang (DM) De attribuutwaarde voor het DRIVER-sleutelwoord was langer dan 255 tekens.
IM012 DRIVER sleutelwoordsyntaxis fout (DM) Het trefwoord-waardepaar voor het DRIVER-sleutelwoord bevatte een syntaxisfout.

(DM) De string in *InConnectionString bevatte een FILEDSN-sleutelwoord , maar het .dsn-bestand bevatte geen DRIVER-sleutelwoord of DSN-sleutelwoord .
IM014 Het gespecificeerde DSN bevat een architectuurmismatch tussen de Driver en de Applicatie (DM) 32-bits applicatie gebruikt een DSN die verbinding maakt met een 64-bits driver; of andersom.
IM015 De SQLDriverConnect van de driver op SQL_HANDLE_DBC_INFO_HANDLE faalde Als een driver SQL_ERROR terugstuurt, zal de Driver Manager SQL_ERROR teruggeven aan de applicatie en zal de verbinding falen.

Voor meer informatie over SQL_HANDLE_DBC_INFO_TOKEN, zie Developing Connection-Pool Awareness in an ODBC Driver.
IM017 Polling is uitgeschakeld in de asynchrone meldingsmodus Wanneer het meldingsmodel wordt gebruikt, wordt polling uitgeschakeld.
IM018 SQLCompleteAsync is niet aangeroepen om de vorige asynchrone bewerking op deze ingang te voltooien. Als de vorige functieaanroep op de ingang SQL_STILL_EXECUTING retourneert en als de meldingsmodus is ingeschakeld, moet SQLCompleteAsync worden aangeroepen op de ingang om naverwerking te kunnen uitvoeren en de bewerking te voltooien.
S1118 De driver ondersteunt geen asynchrone meldingen Wanneer de driver geen asynchrone meldingen ondersteunt, kun je SQL_ATTR_ASYNC_DBC_EVENT of SQL_ATTR_ASYNC_DBC_RETCODE_PTR niet instellen.

Comments

Een verbindingsreeks heeft de volgende syntaxis:

connection-string ::= lege-string[;] | attribuut[;] | attribuut; verbindingsstring

lege-string ::=attribuut ::= attribuut-sleutelwoord=attribuut-waarde | DRIVER=[{]attribuutwaarde[}]

attribuut-sleutelwoord ::= DSN | UID | PWD | driver-gedefinieerd-attribuut-sleutelwoord

attribuut-waarde ::= tekenstring

driver-gedefinieerd-attribuut-sleutelwoord ::= identificatie

waarbij de tekenreeks nul of meer tekens heeft; de identificatie heeft één of meer tekens; attribuut-sleutelwoord is niet hoofdlettergevoelig; attribuutwaarde kan hoofdlettergevoelig zijn; en de waarde van het DSN-sleutelwoord bestaat niet uitsluitend uit lege plekken.

Vanwege de grammatica, trefwoorden en attribuutwaarden van verbindingsreeks en initialisatiebestanden, die de tekens []{}(),;? bevatten. *=!@ Niet omsloten met beugel moet worden vermeden. De waarde van het DSN-trefwoord mag niet alleen uit lege waarden bestaan en mag geen voorloopspaties bevatten. Vanwege de grammatica van de systeeminformatie mogen trefwoorden en namen van gegevensbronnen het backslashteken (\) niet bevatten.

Applicaties hoeven geen haakjes rond de attribuutwaarde na het DRIVER-sleutelwoord toe te voegen, tenzij het attribuut een puntkomma bevat (;), in welk geval de haken vereist zijn. Als de kenmerkwaarde die het stuurprogramma ontvangt accolades bevat, moet het stuurprogramma deze niet verwijderen, maar moeten ze deel uitmaken van de geretourneerde verbindingsreeks.

Een DSN- of verbindingsreeks-waarde omgeven door haakjes ({}) die een van de tekens bevat []{}(),;? *=!@ wordt intact doorgegeven aan de chauffeur. Wanneer deze tekens echter in een trefwoord worden gebruikt, geeft de Driver Manager een foutmelding wanneer hij met bestands-DSN's werkt, maar geeft de verbindingsreeks door aan de driver voor gewone verbindingsstrings. Vermijd het gebruik van ingesloten accolades in een trefwoordwaarde.

De verbindingsreeks kan een willekeurig aantal door het stuurprogramma gedefinieerde trefwoorden bevatten. Omdat het DRIVER-sleutelwoord geen informatie uit de systeeminformatie gebruikt, moet de driver voldoende trefwoorden definiëren zodat een driver verbinding kan maken met een databron die alleen de informatie in de verbindingsreeks gebruikt. (Voor meer informatie, zie "Bestuurdersrichtlijnen," later in dit gedeelte.) De driver bepaalt welke trefwoorden nodig zijn om verbinding te maken met de databron.

De volgende tabel beschrijft de attribuutwaarden van de DSN-, FILEDSN-, DRIVER-, UID-, PWD- en SAVEFILE-zoekwoorden .

Keyword Beschrijving van attribuutwaarde
DSN Naam van een databron zoals geretourneerd door SQLDataSources of het dialoogvenster van SQLDriverConnect.
FILEDSN Naam van een .dsn-bestand waaruit een verbindingsreeks wordt opgebouwd voor de databron. Deze gegevensbronnen worden bestandsgegevensbronnen genoemd.
BESTUURDER Beschrijving van de driver zoals teruggegeven door de SQLDrivers-functie . Bijvoorbeeld Rdb of SQL Server.
UID Een gebruikers-id.
PWD Het wachtwoord dat overeenkomt met de gebruikers-ID, of een lege string als er geen wachtwoord voor de gebruikers-ID is (PWD=;).
SAVEFILE De bestandsnaam van een .dsn-bestand waarin de attribuutwaarden van trefwoorden die zijn gebruikt bij het maken van de huidige, succesvolle verbinding moeten worden opgeslagen.

Voor informatie over hoe een applicatie een databron of driver kiest, zie Kies van een gegevensbron of driver.

Als sleutelwoorden worden herhaald in de verbindingsreeks, gebruikt de driver de waarde die hoort bij het eerste voorkomen van het trefwoord. Als de DSN- en DRIVER-sleutelwoorden in dezelfde verbindingsreeks zitten, gebruiken de Driver Manager en de driver het trefwoord dat als eerste voorkomt.

De zoekwoorden FILEDSN en DSN sluiten elkaar uit: het eerste trefwoord wordt gebruikt, en het trefwoord dat als tweede voorkomt wordt genegeerd. De zoekwoorden FILEDSN en DRIVER sluiten elkaar daarentegen niet uit. Als een sleutelwoord voorkomt in een verbindingsreeks met FILEDSN, wordt de attribuutwaarde van het trefwoord in de verbindingsreeks gebruikt in plaats van de attribuutwaarde van hetzelfde trefwoord in het .dsn-bestand.

Als het FILEDSN-sleutelwoord wordt gebruikt, worden de sleutelwoorden die in een .dsn-bestand zijn gespecificeerd gebruikt om een verbindingsreeks te maken. (Voor meer informatie, zie "Bestandsgegevensbronnen," later in deze sectie.) Het UID-sleutelwoord is optioneel; een .dsn-bestand kan worden aangemaakt met alleen het sleutelwoord DRIVER . Het PWD-sleutelwoord wordt niet opgeslagen in een .dsn-bestand. De standaardmap voor het opslaan en laden van een .dsn-bestand is een combinatie van het pad dat door CommonFileDir in HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ Windows\CurrentVersion is gespecificeerd, en "ODBC\DataSources". (Als CommonFileDir "C:\Program Files\Common Files" was, zou de standaardmap "C:\Program Files\Common Files\ODBC\Data Sources" zijn.)

Note

Een .dsn-bestand kan direct worden bewerkt door de SQLReadFileDSN- en SQLWriteFileDSN-functies aan te roepen in de installer-DLL.

Als het SAVEFILE-sleutelwoord wordt gebruikt, worden de attribuutwaarden van trefwoorden die zijn gebruikt bij het maken van de huidige, succesvolle verbinding opgeslagen als een .dsn-bestand met de naam van de attribuutwaarde van het SAVEFILE-zoekwoord . Het SAVEFILE-sleutelwoord moet samen worden gebruikt met het DRIVER-sleutelwoord , het FILEDSN-sleutelwoord , of beide, anders geeft de functie SQL_SUCCESS_WITH_INFO terug met SQLSTATE 01S09 (Ongeldig sleutelwoord). Het SAVEFILE-sleutelwoord moet vóór het DRIVER-sleutelwoord in de verbindingsreeks verschijnen, anders zijn de resultaten ongedefinieerd.

Richtlijnen voor de bestuurdersmanager

De Driver Manager construeert een verbindingsreeks die aan de driver wordt doorgegeven in het InConnectionString-argument van de SQLDriverConnect-functie van de driver. De Driver Manager wijzigt het InConnectionString-argument dat door de applicatie aan hem wordt doorgegeven niet.

De actie van de Driver Manager is gebaseerd op de waarde van het DriverCompletement-argument :

  • SQL_DRIVER_PROMPT: Als de verbindingsreeks het sleutelwoord DRIVER,DSN of FILEDSN niet bevat, toont de Driver Manager het dialoogvenster Data Sources. Het construeert een verbindingsreeks uit de naam van de databron die door het dialoogvenster wordt teruggegeven en alle andere trefwoorden die door de applicatie worden doorgegeven. Als de naam van de gegevensbron die door het dialoogvenster wordt teruggegeven leeg is, specificeert de Driver Manager het trefwoord-waardepaar DSN=Default. (Dit dialoogvenster toont geen gegevensbron met de naam "Default".)

  • SQL_DRIVER_COMPLETE of SQL_DRIVER_COMPLETE_REQUIRED: Als de door de applicatie gespecificeerde verbindingsreeks het DSN-sleutelwoord bevat, kopieert de Driver Manager de door de applicatie gespecificeerde verbindingsreeks. Anders voert het dezelfde acties uit als wanneer DriverCompletion SQL_DRIVER_PROMPT.

  • SQL_DRIVER_NOPROMPT: De Driver Manager kopieert de verbindingsreeks die door de applicatie is gespecificeerd.

Als de door de applicatie gespecificeerde verbindingsreeks het DRIVER-sleutelwoord bevat, kopieert de Driver Manager de door de applicatie gespecificeerde verbindingsreeks.

Met behulp van de verbindingsreeks die het heeft geconstrueerd, bepaalt de Driver Manager welke driver wordt gebruikt, maakt verbinding met die driver en geeft de door hem geconstrueerde verbindingsreeks aan de driver; voor meer informatie over de interactie tussen de Driver Manager en de driver, zie de sectie "Comments" in de SQLConnect Function. Als de verbindingsreeks het sleutelwoord DRIVER niet bevat, bepaalt de Driver Manager welke driver als volgt wordt gebruikt:

  1. Als de verbindingsreeks het DSN-sleutelwoord bevat, haalt de Driver Manager de driver die aan de databron is gekoppeld op uit de systeeminformatie.

  2. Als de verbindingsreeks het DSN-sleutelwoord niet bevat of de databron niet wordt gevonden, haalt de Driver Manager de driver die aan de standaarddatabron is gekoppeld op uit de systeeminformatie. (Voor meer informatie, zie Standaard Subsleutel.) De Driver Manager verandert de waarde van het DSN-sleutelwoord in de verbindingsreeks naar "DEFAULT".

  3. Als het DSN-sleutelwoord in de verbindingsreeks is ingesteld op "DEFAULT", haalt de Driver Manager de driver die aan de standaarddatabron is gekoppeld op uit de systeeminformatie.

  4. Als de gegevensbron niet wordt gevonden en de standaardbron niet wordt gevonden, geeft de Driver Manager SQL_ERROR terug met SQLSTATE IM002 (Gegevensbron niet gevonden en geen standaarddriver gespecificeerd).

Gegevensbronnen van bestanden

Als de door de applicatie gespecificeerde verbindingsreeks in de aanroep naar SQLDriverConnect het FILEDSN-sleutelwoord bevat, en dit trefwoord niet wordt vervangen door het DSN- of DRIVER-sleutelwoord, dan maakt de Driver Manager een verbindingsreeks aan met de informatie in het .dsn-bestand en het InConnectionString-argument. De Driver Manager gaat als volgt te werk:

  1. Controleert of de bestandsnaam van het .dsn-bestand geldig is. Zo niet, dan geeft hij SQL_ERROR terug met SQLSTATE IM014 (Ongeldige naam van bestand DSN). Als de bestandsnaam een lege string is ("") en SQL_DRIVER_NOPROMPT niet is gespecificeerd, wordt het dialoogvenster File-Open weergegeven. Als de bestandsnaam een geldig pad bevat maar geen bestandsnaam of een ongeldige bestandsnaam, en SQL_DRIVER_NOPROMPT niet is gespecificeerd, wordt het dialoogvenster File-Open weergegeven met de huidige map ingesteld op die in de bestandsnaam. Als de bestandsnaam een lege string is ("") of de bestandsnaam een geldig pad bevat maar geen bestandsnaam of een ongeldige bestandsnaam, en SQL_DRIVER_NOPROMPT is gespecificeerd, dan wordt SQL_ERROR teruggegeven met SQLSTATE IM014 (Ongeldige bestandsnaam DSN).

  2. Leest alle trefwoorden in het [ODBC]-gedeelte van het .dsn-bestand. Als het DRIVER-sleutelwoord niet aanwezig is, geeft het SQL_ERROR terug met SQLSTATE IM012 (Driver-sleutelwoordsyntaxisfout), behalve wanneer het .dsn-bestand niet deelbaar is en dus alleen het DSN-sleutelwoord bevat.

    Als de bestandsgegevensbron niet deelbaar is, leest de Driver Manager de waarde van het DSN-sleutelwoord en verbindt hij indien nodig met de gebruikers- of systeemgegevensbron waar de niet-deelbare bestandsgegevensbron naar verwijst. Stappen 3 tot en met 5 worden niet uitgevoerd.

  3. Bouwt een verbindingsreeks voor de driver. De driver verbindingsreeks is de unie van de trefwoorden die in het .dsn-bestand zijn gespecificeerd en die in de oorspronkelijke applicatie-verbindingsreeks. Regels voor de constructie van de driver verbindingsreeks waarbij sleutelwoorden overlappen zijn als volgt:

    • Als het DRIVER-sleutelwoord bestaat in de applicatie-verbindingsreeks en de drivers die door de DRIVER-sleutelwoorden worden gespecificeerd niet hetzelfde zijn in het .dsn-bestand en de applicatie-verbindingsreeks, dan wordt de driverinformatie in het .dsn-bestand genegeerd en wordt de driverinformatie in de application verbindingsreeks gebruikt. Als de drivers die door het DRIVER-sleutelwoord worden gespecificeerd hetzelfde zijn in het .dsn-bestand als in de verbindingsreeks van de applicatie, dan hebben waar alle trefwoorden elkaar overlappen, die in de application verbindingsreeks worden gespecificeerd voorrang boven die in het .dsn-bestand.

    • In de nieuwe verbindingsreeks wordt het FILEDSN-sleutelwoord verwijderd.

  4. Laadt de driver door in de registervermelding te kijken HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI\<Driver Name>\Driver, waar <Driver Name> wordt opgegeven door het DRIVER-sleutelwoord .

  5. Geeft de driver de nieuwe verbindingsstring door.

Voor voorbeelden van .dsn-bestanden, zie Verbinden met Bestandsgegevensbronnen.

SAVEFILE Sleutelwoord

Als de door de applicatie gespecificeerde verbindingsreeks het SAVEFILE-sleutelwoord bevat, slaat de Driver Manager de verbindingsreeks op in een .dsn-bestand. De Driver Manager gaat als volgt te werk:

  1. Controleert of de bestandsnaam van het .dsn-bestand dat als attribuutwaarde van het SAVEFILE-sleutelwoord is opgenomen, geldig is. Zo niet, dan geeft hij SQL_ERROR terug met SQLSTATE IM014 (Ongeldige naam van bestand DSN). De geldigheid van de bestandsnaam wordt bepaald door standaard systeemnaamgevingsregels. Als de bestandsnaam een lege string is ("") en het DriverCompletement-argument niet SQL_DRIVER_NOPROMPT, dan is de bestandsnaam geldig. Als de bestandsnaam al bestaat, dan wordt het bestand overschreven als DriverCompletion SQL_DRIVER_NOPROMPT is. Als DriverCompletion SQL_DRIVER_PROMPT, SQL_DRIVER_COMPLETE of SQL_DRIVER_COMPLETE_REQUIRED is, vraagt een dialoogvenster de gebruiker om aan te geven of het bestand moet worden overschreven. Als Nee wordt ingevoerd, verschijnt het dialoogvenster Bestand-Opslaan .

  2. Als de driver SQL_SUCCESS retourneert en de bestandsnaam geen lege string was, schrijft de Driver Manager de verbindingsinformatie die in het OutConnectionString-argument wordt teruggegeven naar het opgegeven bestand met het formaat dat eerder in deze sectie in de sectie "Connection Strings" is gespecificeerd.

  3. Als de driver SQL_SUCCESS retourneert en de bestandsnaam een lege string was (""), roept de Driver Manager het gemeenschappelijke dialoogvenster File-Save aan met de hwnd gespecificeerd en schrijft de verbindingsinformatie die in OutConnectionString wordt teruggegeven naar het bestand dat eerder in deze sectie is gespecificeerd in het File-Save gemeenschappelijke dialoogvenster met het formaat dat eerder in deze sectie is gespecificeerd.

  4. Als de driver SQL_SUCCESS teruggeeft, geeft hij het OutConnectionString-argument met de verbindingsreeks terug aan de applicatie.

  5. Als de driver SQL_SUCCESS_WITH_INFO of SQL_ERROR teruggeeft, geeft de Driver Manager de SQLSTATE terug aan de applicatie.

Richtlijnen voor bestuurders

De driver controleert of de verbindingsreeks die door de Driver Manager aan hem wordt doorgegeven het DSN- of DRIVER-sleutelwoord bevat. Als de verbindingsreeks het sleutelwoord DRIVER bevat, kan de driver geen informatie over de databron uit de systeeminformatie ophalen. Als de verbindingsreeks het DSN-trefwoord bevat of niet het DSN- of het DRIVER-sleutelwoord bevat, kan de driver informatie over de databron uit de systeeminformatie als volgt ophalen:

  1. Als de verbindingsreeks het DSN-sleutelwoord bevat, haalt de driver de informatie op voor de gespecificeerde databron.

  2. Als de verbindingsreeks het DSN-sleutelwoord niet bevat, de gespecificeerde databron niet wordt gevonden, of het DSN-sleutelwoord is ingesteld op "DEFAULT", haalt de driver de informatie op voor de standaardgegevensbron.

De driver gebruikt alle informatie die hij uit de systeeminformatie haalt om de informatie die aan hem wordt doorgegeven in de verbindingsreeks aan te vullen. Als de informatie in de systeeminformatie informatie dupliceert informatie in de verbindingsreeks, gebruikt de driver de informatie in de verbindingsreeks.

Op basis van de waarde van DriverCompletion vraagt de driver de gebruiker om verbindingsinformatie, zoals de gebruikers-ID en wachtwoord, en maakt verbinding met de databron:

  • SQL_DRIVER_PROMPT: De driver toont een dialoogvenster, waarin de waarden uit de verbindingsreeks en systeeminformatie (indien aanwezig) als beginwaarden worden gebruikt. Wanneer de gebruiker het dialoogvenster verlaat, maakt de driver verbinding met de databron. Het construeert ook een verbindingsreeks uit de waarde van het DSN- of DRIVER-sleutelwoord in *InConnectionString en de informatie die wordt teruggegeven uit het dialoogvenster. Deze verbindingsreeks plaatst deze in de *OutConnectionString-buffer.

  • SQL_DRIVER_COMPLETE of SQL_DRIVER_COMPLETE_REQUIRED: Als de verbindingsreeks voldoende informatie bevat en die informatie klopt, maakt de driver verbinding met de databron en kopieert *InConnectionString naar *OutConnectionString. Als er informatie ontbreekt of onjuist is, voert de driver dezelfde acties uit als wanneer DriverCompletion SQL_DRIVER_PROMPT, behalve dat als DriverCompletion SQL_DRIVER_COMPLETE_REQUIRED, de driver de besturing uitschakelt voor informatie die niet nodig is om verbinding te maken met de databron.

  • SQL_DRIVER_NOPROMPT: Als de verbindingsreeks voldoende informatie bevat, maakt de driver verbinding met de databron en kopieert *InConnectionString naar *OutConnectionString. Anders geeft de driver SQL_ERROR terug voor SQLDriverConnect.

Bij succesvolle verbinding met de databron stelt de driver ook *StringLength2Ptr in op de lengte van de output verbindingsreeks die beschikbaar is om terug te geven in *OutConnectionString.

Als de gebruiker een dialoogvenster dat door de Driver Manager of de driver wordt aangeboden annuleert, geeft SQLDriverConnect SQL_NO_DATA terug.

Voor informatie over hoe de Driver Manager en de driver interageren tijdens het verbindingsproces, zie SQLConnect Function.

Als een driver SQLDriverConnect ondersteunt, moet het driversleutelwoordgedeelte van de systeeminformatie voor de driver het ConnectFunctions-sleutelwoord bevatten met het tweede teken als "Y".

Verbinden wanneer Connection Pooling is ingeschakeld

Connection pooling stelt een applicatie in staat om een verbinding die al is aangemaakt opnieuw te gebruiken. Wanneer SQLDriverConnect wordt aangeroepen, probeert de Driver Manager de verbinding te maken met een verbinding die deel uitmaakt van een pool van verbindingen in een omgeving die is aangewezen voor verbindingspooling. Voor meer informatie over verbindingspooling, zie SQLConnect Function.

Een applicatie kan SQL_ATTR_RESET_CONNECTION instellen voordat SQLDisconnect wordt aangeroepen op een verbinding waar pooling is ingeschakeld. Zie de functie SQLSetConnectAttr voor meer informatie.

De volgende beperkingen gelden wanneer een applicatie SQLDriverConnect aanroept om verbinding te maken met een gepoolde verbinding:

  • Er wordt geen verbinding pooling-verwerking uitgevoerd wanneer het SAVEFILE-sleutelwoord wordt opgegeven in de verbindingsreeks.

  • Als connection pooling is ingeschakeld, kan SQLDriverConnect alleen worden aangeroepen met een DriverCompletement-argument van SQL_DRIVER_NOPROMPT; als SQLDriverConnect wordt aangeroepen met een andere DriverCompletion, wordt SQLSTATE HY110 (Invalid driver completion) teruggegeven.

Verbindingskenmerken

Het SQL_ATTR_LOGIN_TIMEOUT connection-attribuut, ingesteld met SQLSetConnectAttr, definieert het aantal seconden dat moet wachten tot een inlogverzoek is voltooid met een succesvolle verbinding door de driver voordat het terugkeert naar de applicatie. Als de gebruiker wordt gevraagd om de verbindingsreeks te voltooien, begint een wachttijd voor elk inlogverzoek wanneer de driver het verbindingsproces start.

De driver opent de verbinding standaard in SQL_MODE_READ_WRITE toegangsmodus. Om de toegangsmodus op SQL_MODE_READ_ONLY te zetten, moet de applicatie SQLSetConnectAttr aanroepen met het attribuut SQL_ATTR_ACCESS_MODE voordat SQLDriverConnect wordt aanroepen.

Als een standaard vertaalbibliotheek is opgegeven in de systeeminformatie van de databron, laadt de driver deze op. Een andere vertaalbibliotheek kan worden geladen door SQLSetConnectAttr aan te roepen met het attribuut SQL_ATTR_TRANSLATE_LIB. Een vertaaloptie kan worden gespecificeerd door SQLSetConnectAttr aan te roepen met de SQL_ATTR_TRANSLATE_OPTION-optie.

Voor meer informatie, zie Verbinden met SQLDriverConnect.

// SQLDriverConnect_ref.cpp  
// compile with: odbc32.lib user32.lib  
#include <windows.h>  
#include <sqlext.h>  
  
int main() {  
   SQLHENV henv;  
   SQLHDBC hdbc;  
   SQLHSTMT hstmt;  
   SQLRETURN retcode;  
  
   SQLCHAR OutConnStr[255];  
   SQLSMALLINT OutConnStrLen;  
  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
  
   // 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, 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);  
  
            retcode = SQLDriverConnect( // SQL_NULL_HDBC  
               hdbc,   
               desktopHandle,   
               (SQLCHAR*)"driver=SQL Server",   
               _countof("driver=SQL Server"),  
               OutConnStr,  
               255,   
               &OutConnStrLen,  
               SQL_DRIVER_PROMPT );  
  
            // 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);  
   }  
}  

Zie ook Voorbeeld ODBC-programma.

Voor informatie over Zien!
Toewijzen van een handvat SQLAllocHandle-functie
Het ontdekken en opsommen van waarden die nodig zijn om verbinding te maken met een databron SQLBrowseConnect-functie
Verbinding maken met een gegevensbron SQLConnect-functie
Verbinding verbreken met een databron SQLDisconnect-functie
Terugkerende driverbeschrijvingen en attributen SQLDrivers-functie
Een handvat losmaken SQLFreeHandle-functie
Een verbindingsattribuut instellen SQLSetConnectAttr-functie

Zie ook

ODBC-API-verwijzing
ODBC-headerbestanden