Set DB connectionstring DOA

Status
Niet open voor verdere reacties.

sanders1969

Gebruiker
Lid geworden
29 dec 2018
Berichten
243
Wie is er bekend met een variabele DB te connecten via VBA aan een SQL server database?
Ik gebruik geen ADO maar DOA en die twee samen krijg ik errors tenminste dat kreeg ik eerder.
Onderstaande heb ik alvast de connectionstring
Ik kon het online niet 123 vinden en iemand die het al doet, kan het zo aangeven.

Code:
strServerName = "server"
strSQLDatabaseName = "databasenaam"
strSQLUsername = "gebruikernaam"
strSQLPassword = "wachtwoord"
strConnectString = "ODBC;Driver={SQL Server};SERVER=" & strServerName & _
                        ";DATABASE=" & strSQLDatabaseName & _
                        ";UID=" & strSQLUsername & _
                        ";PWD=" & strSQLPassword
 
Okay het lijkt erop dat ADO connectie ook werkt zonder dat ik in de reference ADO moet registreren.
Alleen krijg ik onderstaande foutmelding:
[Microsoft][ODBC SQL Server Driver][SQL Server]Login failed. The login is from an untrusted domain and cannot be used with Windows authentication. -2147217843
Wellicht zien één van jullie meteen wat ik kennelijk verkeerd doe.

Code:
Private Sub ConnectAdo()
Dim connection As Object: Set connection = CreateObject("ADODB.Connection")
Dim rs As Object: Set rs = CreateObject("ADODB.Recordset")
        
    strServerName = "server"
    strSQLDatabaseName = "databasenaam"
    strSQLUsername = "gebruikernaam"
    strSQLPassword = "wachtwoord"
    strConnectString = "DRIVER=SQL Server;Server=" & strServerName & _
                        ";Trusted_Connection=No;APP=2007 Microsoft Office system;DATABASE=" & strSQLDatabaseName & _
                        "User ID=" & strSQLDatabaseName & _
                        "Password=" & strSQLPassword
    With connection
        .ConnectionString = strConnectString
        .CommandTimeout = 0
        .Open
    End With
    
ConnectAdoErr:
If Err.number <> 0 Then
    Debug.Print Err.Description & " " & Err.number
    MsgBox Err.Description, vbInformation + vbOKOnly, "Foutnummer: " & Err.number
    Err.Clear    
End If
End Sub
 
* Check of je met de gebruiker/paswoord configuratie rechtstreeks kan inloggen op de SQL server.
* Check of de active directory account gekend is en voldoende rechten heeft op beide machines.

Eenvoudige work around: configureer je SQL server om te werken met Windows accounts én SQL accounts en maak een SQL account aan voor je applicatie.

MixedSecurity.JPG
 
Ik kan gewoon via DAO inloggen dus het ligt aan de connectionstring.
Ik koppel mijn tabellen aan mijn Access Applicatie echter ik wil via een database object uit een ander database gegevens ophalen of wegschrijven.
Deze andere database koppel ik ook tabellen via vba echter ik heb code gevonden om via ADO te koppelen maar dan moet ik deze in de reference verwijzen en dan krijg ik conflicten vanwege DAO en ADO.
Liefst heb een vba syntaxis hoe ik een SQL server database via de Database object kan connecten via een DAO en een connectionsting.
 
De precieze connection string hangt af van je SQL-server versie, je ODBC versie en of je met AD werkt of niet. Hier kan je er een aantal vinden:
https://www.connectionstrings.com/microsoft-odbc-driver-17-for-sql-server/
De meeste programmeurs die ik ken maken eerst een DSN bestand aan en gebruiken die dan in hun code. Bij ons wordt DAO niet gebruikt, maar hier kan je een code voorbeeld vinden:
https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/connections-collection-dao
 
Okay het lijkt erop dat ADO connectie ook werkt zonder dat ik in de reference ADO moet registreren.
Dat komt omdat je Late Binding gebruikt, en geen Early Binding. Oftewel: je legt de ADO referentie pas bij het aanroepen van de code. Is a) langzamer, en b) mis je de voordelen van IntelliSense. Eigenlijk zou je Late Binding dus alleen moeten gebruiken als je de db op verschillende computers gebruikt, en geen garantie hebt dat op alle andere pc's de bibliotheek netjes aan staat. Gebruik je de db op één pc, zet dan de bibliotheek aan en gebruik Early Binding.
 
Nee krijg Ado nog niet aan de praat. Ik hoop dat iemand nog een connectie heeft gemaakt met een SQL server database.
Als ik hem via DOA direct via de Currentdb connect dan lukt dat wel maar ik wil het via een database object connecten.

Code:
[ATTACH]351573.vB[/ATTACH]


Code:
Dim connection As Object: Set connection = CreateObject("ADODB.Connection")
Dim rs As Object: Set rs = CreateObject("ADODB.Recordset")
Dim strCon As String

    strServerName = "server"
    strSQLDatabaseName = "databasenaam"
    strSQLUsername = "gebruikernaam"
    strSQLPassword = "wachtwoord"
             'Driver={ODBC Driver 17 for SQL Server};Server=myServerAddress
    strCon = "Driver={ODBC Driver 17 for SQL Server};Server=" & strServerName
                      ';Database=myDataBase
    strCon = strCon & ";Database=" & strSQLDatabaseName
                      ';UID=myUsername;PWD=myPassword;
    strCon = strCon & ";UID=" & strSQLUsername
                      ';PWD=myPassword;
    strCon = strCon & ";PWD=" & strSQLPassword
    With connection
        .ConnectionString = strCon
        .CommandTimeout = 0
        .Open
    End With
    
ConnectAdoErr:
If Err.number <> 0 Then
    Debug.Print Err.Description & " " & Err.number
    MsgBox Err.Description, vbInformation + vbOKOnly, "Foutnummer: " & Err.number
    Err.Clear
    Resume
End If
 

Bijlagen

  • foutmelding_connectionstring.png
    foutmelding_connectionstring.png
    49,6 KB · Weergaven: 50
Kan je geen werkende DSN string aanmaken en gebruiken?

Trouwens iedereen die je code leest kan daar zomaar het paswoord voor de database lezen wat , om zacht uit te drukken, niet veilig is. Alleen daarom zou ik toch een meer veilige methode gebruiken om de connectie te maken.
Als ik zulke code ergens vind (wat al gebeurd is), disable ik onmiddellijk de user waarmee op deze manier een connectie gemaakt wordt met één van mijn databases en verwittig ik zijn/haar manager (niet mijn idee maar bedrijfs policy).
 
Huuh?
Dit is niet de echt databasenaam, username en wachtwoord hoor ;-)

Ennuhh ik heb tegen mijn wil in maar een ODBC connectie gemaakt en daarmee kan ik wel weer DOA gebruiken.
Had liever geen derde partij willen gebruiken maar het is niet anders en duurt het te lang om uit te zoeken.
Iig dank voor je hulp en het meedenken.
Onderstaande code heb ik de databasenaam gelijk gemaakt aan ODBC drivernaam

Code:
Sub ConnectDbOdbc()
Dim wsAccess As Workspace
Dim dbODBC As Database
    
    strSQLDatabaseName = "databasenaam"
    strSQLUsername = "gebruikernaam"
    strSQLPassword = "wachtwoord"

    strConnectString = "ODBC;DATABASE=" & strSQLDatabaseName & ";DSN=" & strSQLDatabaseName & ";UID=" & strSQLUsername & ";PWD=" & strSQLPassword
    Set dbODBC = wsAccess.OpenDatabase(strSQLDatabaseName, dbDriverComplete, True, strConnectString)
   
End Sub
 
natuurlijk is de hier ingegeven code niet het echte wachtwoord ;). Maar in de code die je in productie in je applicatie gaat gebruiken mag je ook nooit het echte wachtwoord zetten. Op zijn minst dan een wachtwoord op je access VBA code zetten. VBA codes en niet gecompileerde scripts zijn één van de eerste plaatsen waar hackers naar paswoorden geen zoeken.
 
O op die fiets nee, ik heb dit als voorbeeld aangeboden dus de connectiegegevens staan niet in de VBA code.
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan