Connettere DB access a database MYSQL diversi

di il
8 risposte

Connettere DB access a database MYSQL diversi

Buongiorno,

qualcuno cortesemente sa dirmi se è possibile collegare un db front-end di access a tabelle presenti in diversi database MySQL?
In pratica avendo diversi database , vorrei avere un DB MySQL che contiene tutte le tabelle comuni ( es. tabella Utenti) ed evitare la duplicazione dei dati.
Attualmente definisco una stringa contenente i dati di accesso al db MySQL
Public Const gstrODBC As String = "ODBC;DATABASE=TEST_TDS_DB;UID=pippo_user;PWD=123;DSN=TROSRVMYSQL;" 
la stringa viene richiamata all'apertura del DB tramite una funzione.

Grazie.

8 Risposte

  • Re: Connettere DB access a database MYSQL diversi

    Il motivo per cui hai DIVERSI MySQL ....?
    Non si capisce cosa vuoi fare perché non ha senso unire le tabelle in un solo Db... quando ha senso connettere le tabelle al Db che le contiene, quindi la Connection String non deve essere solo 1, può esserlo, ma nel tuoncaso dovrai avere tante connection string quanti sono i Server a cui connettere la tabella....
    Ora trovo assai anomala questa cosa e vorrei vedere e capire come funzionano le indicizzazioni su Db separati... oppurr se i db sono uguali e devi solo switchare server...

    Se ho frainteso devi chiarire bene, in quanto lo scenario è assai poco normale
  • Re: Connettere DB access a database MYSQL diversi

    Ciao Alex, grazie per la risposta.
    Abbiamo diversi database MySQL sullo stesso server MySQL: esempio per semplificare
    DB1: tabelle utenti, ordini, fornitori, prodotti
    DB2: tabelle utenti, fornitori progetti
    DB3: tabelle utenti, cataloghi

    L'utente "pippo" è presente in 3 diverse tabelle "utenti", lo stesso vale per i fornitori con conseguente disallineamento dei dati.
    Lo scopo è quello di avere un unico DB con le tabelle comuni e altri DB con tabelle specifiche dell'applicazione stessa. Dall'app ms access di ogni specifica applicazione richiamare le tabelle "proprie" e quelle comuni senza duplicare ulteriormente i dati.
    Lo so che la soluzione più corretta sarebbe un unico DB su MySQL con tutto insieme, ma abbiamo problemi "politici interni " che vanno oltre il buon senso e la logica di uno scenario normale e quindi si devono accettare dei compromessi. Se ancora non fosse chiara la mia domanda chiedimi pure, grazie
  • Re: Connettere DB access a database MYSQL diversi

    Quello che vuoi fare si può fare : ovviamente dovrai avere le stringhe di connessione apposite (cambia il DNS e il DATABASE).
    Siccome il (re)link alle tabelle devi farlo all'avvio del FE e per ogni utente, quello che devi considerare è che a livello di mySQL devi avere lo stesso utente (mySQL) che ha accesso ai DB (e alle proprie tabelle) ... oppure devi memorizza da qualche parte (nel FE oppure in un ulteriore DB) l'utente quali quali tabelle può linkare e poi gestire accuratamente quali maschere può aprire (o all'apertura della maschera devi verificare le permission dell'utente sulle tabelle utilizzate nella maschera stessa).
  • Re: Connettere DB access a database MYSQL diversi

    max.riservo ha scritto:


    Quello che vuoi fare si può fare : ovviamente dovrai avere le stringhe di connessione apposite (cambia il DNS e il DATABASE).
    Siccome il (re)link alle tabelle devi farlo all'avvio del FE e per ogni utente, quello che devi considerare è che a livello di mySQL devi avere lo stesso utente (mySQL) che ha accesso ai DB (e alle proprie tabelle) ... oppure devi memorizza da qualche parte (nel FE oppure in un ulteriore DB) l'utente quali quali tabelle può linkare e poi gestire accuratamente quali maschere può aprire (o all'apertura della maschera devi verificare le permission dell'utente sulle tabelle utilizzate nella maschera stessa).
    grazie max.riservo per il tuo riscontro. A livello MySQL l'utente è sempre lo stesso, dal FE carico appunto la stringa. Anche il DNS è lo stesso, cambierebbe solo il nome del database.
    Siccome non sono un esperto, se ho capito bene è sufficiente creare "n" stringhe di connessione tante quanti sono i DB da puntare, ma come richiamarli all'apertura? La funzione che utilizzo prevede l'apertura di una sola stringa ( e non l'ho neanche scritta io ma adattata da un db già funzionante ) .
    Grazie per la pazienza ed il supporto.
    -
  • Re: Connettere DB access a database MYSQL diversi

    Mostra il codice che usi, proponi come vorresti fare e poi, se serve, il forum ti darà i suggerimenti necessari ...
  • Re: Connettere DB access a database MYSQL diversi

    max.riservo ha scritto:


    Mostra il codice che usi, proponi come vorresti fare e poi, se serve, il forum ti darà i suggerimenti necessari ...
    Questo è il codice:
    Public Function CheckConnect() As Integer
    ' It is also called by function CheckStartup (called from frmSplash)
    ' It calls functions AttachAgain and GetFileName as needed
    Dim db As DAO.Database, rst As DAO.Recordset, tdf As DAO.TableDef
    Dim rstV As DAO.Recordset, intFirst As Integer, intI As Integer
    Dim strFilePath As String, strPath As String, varRet As Variant
    Dim strConnect As String, blnNeedReattach As Boolean
    Dim strDataFileName As String, strPwd As String
        ' Set an Error trap
        On Error GoTo CheckConnect_Err
        
        ' Point to this database
        Set db = DBEngine(0)(0)
        ' Turn on the progress meter on the status bar
        varRet = SysCmd(acSysCmdInitMeter, "Verifying data tables...", db.TableDefs.count)
        ' Loop through all TableDefs
        blnNeedReattach = False
        
        For Each tdf In db.TableDefs
            ' Looking for attached tables
            If (tdf.Attributes And dbAttachedTable) Or (tdf.Attributes And dbAttachedODBC) Then
                'per ogni tabella verifico a che datafile appartiene
             
                strDataFileName = GetFileFromPath(GetDBFromstrConn(tdf.Connect))
                'poi se il nome del datafile è quello dell'applicazione
                If strDataFileName = gstrDataFile Or IsNothing(strDataFileName) Then
                    strPath = gstrApplicationPath & "\" & gstrDBPath
                Else
                    strPath = GetDBPath(gstrDataFile)
                End If
                'cerco la password nella tabella di gestione database ztblDBPath
                strPwd = GetDBPwd(strDataFileName)
                
                If gblnODBC Then
                    strConnect = gstrODBC
                Else
                   
                    strConnect = "MS Access;PWD=" & strPwd & ";DATABASE=" & strPath & "\" & strDataFileName & ";"
                End If
                
                'verifico che il percorso sia lo stesso dichiarato nella tabella di boot
                If tdf.Connect = strConnect Then
                    ' Try to open the table
                    ' Use alternate recordset if already processed the first
                    If intFirst = True Then
                        Set rst = tdf.OpenRecordset()
                        ' This one OK - close it
                        rst.Close
                        ' And clear the object
                        Set rst = Nothing
                    Else
                        ' Doing the first one - use alternate
                        ' recordset and leave it open to speed up the process
                        Set rstV = tdf.OpenRecordset()
                        ' OK - set "first processed" flag
                        intFirst = True
                    End If
                Else
                    blnNeedReattach = True
                End If
            End If
            ' Update the progress counter
            intI = intI + 1
            varRet = SysCmd(acSysCmdUpdateMeter, intI)
        Next tdf
        If blnNeedReattach Then
            Resume CheckConnect_Err
        End If
        ' Got through them all - clear the progress meter
        varRet = SysCmd(acSysCmdClearStatus)
        ' Turn off the hourglass
        DoCmd.Hourglass False
        ' Close the "first" recordset
        'rstV.Close
        ' and clear it
        Set rstV = Nothing
        ' Set a good return
        CheckConnect = True
        
    CheckConnect_Exit:
        Exit Function
        
    CheckConnect_Err:
        ' Clear the error
        Err.Clear
        ' Set new error trap
        On Error GoTo CheckConnect_Err2
        ' If we successfully got the "first" one open
        If intFirst = True Then
            ' Close and clear it
            rstV.Close
            Set rstV = Nothing
        End If
        ' Turn off the hourglass for now
        DoCmd.Hourglass False
        ' .. and clear the status bar
        varRet = SysCmd(acSysCmdClearStatus)
        ' Call the generic re-attach code ztbl
        If AttachAgain_ztbl() = -1 Then
            ' Got a good re-attach
            ' Set OK return
             CheckConnect = True
             ' Done
             Exit Function
        End If
        ' No success to this point
        ' Tell the user about the problem - about to show an open file dialog
        MsgBox "There's a temporary problem connecting to the " & gstrShortTitle & " data.  " & _
            "Please locate the " & gstrShortTitle & " data file in the following dialog.", _
            vbInformation, gstrAppTitle
        ' Set up the default file name
        strFilePath = gstrDataFile
        ' Call the file dialog function
        If Not (GetFileName(strFilePath)) Then
            ' Tell user of error
            MsgBox "You failed to select the correct file.  WARNING: " & _
                "You may not be able to open any of the linked tables or run the " & _
                "application.  You can open application again. ", vbCritical, gstrAppTitle
            ' Set Failed return
            CheckConnect = False
            ' Done
            Exit Function
        End If
        ' Open the "info" form telling what we're doing
        DoCmd.OpenForm "frmReconnect"
        ' .. and be sure it has the focus
        Forms!frmReconnect.SetFocus
        ' Try calling the attach code again
        If AttachAgain(strFilePath) = 0 Then
            MsgBox "Relinking of attached tables failed.  The file " & gstrDataFile & " must " & _
                " be in the folder you located and cannot be renamed." & _
                vbCrLf & vbCrLf & "You can open frmCopyright to try again.", _
                vbCritical, "Catalogo Materiali"
            ' Close and bail
            CheckConnect = False
            Exit Function
        End If
        
        ' Close the reconnect "splash" form
        DoCmd.Close acForm, "frmReconnect"
        ' All OK
        CheckConnect = True
        Exit Function
        
    CheckConnect_Err2:
        ' Got an unexpected error
        ' Tell user-
        MsgBox "Unexpected error checking attached tables. " & Err & ", " & Error, vbCritical
        ' Log it
        ErrorLog "CheckConnect", Err, Error
        ' Bail
        CheckConnect = False
        ' Close the info form if it is open
        If IsFormLoaded("frmReconnect") Then DoCmd.Close acForm, "frmReconnect"
        ' ... bail
        Resume CheckConnect_Exit
    
    End Function
    la funzione viene richiamata dopo l'evento timer della finestra frmSplash che è la finestra di avvio del FE
  • Re: Connettere DB access a database MYSQL diversi

    Quella Funzione va completramente riscritta...

    A mio avviso dovresti offrire all'utente un Login con la selezione del Server a cui connettersi.
    Questo lo fai avendo una Tabella Server, una Tabella Utenti ed una Tabella UtentiServer.

    Nella Tabella Server salvi la stringa di connessione in chiaro, sto solo ragionando sul procedimento, poi se servirà renderlo più sicuro lo farai.
    Nella Tabella Utenti avrai USer e Pwd.

    Nella Form Login, servirà una COmbo che consenta la selezione del Server e, di conseguenza 2 TextBox con User e PWd che controllerai se soddisfano gli utenti ammessi da quel server contenuti nella Tabella UtentiServer.

    Effettuato il LOGIN e verificata l'autenticazione, devi ciclare le Tabelle ed aggiornare la ConnectionString, pescandola dalla Tabella Server, e passandola alla proprietà Connect.

    Ora il codice che hai postato ha già buoni punti di partenza, ma devi strutturarlo e strutturare le tabelle, se tuttavia non hai gran dimestichezza nel codice sicuramente non è scontato riuscirci.
  • Re: Connettere DB access a database MYSQL diversi

    Grazie farò qualche tentativo, anche se sono dubbioso sull'esito.
Devi accedere o registrarti per scrivere nel forum
8 risposte