Connessione ODBC VBA Access
Hai un problema con Excel? 
Connessione ODBC VBA Access
di gugluca (utente non iscritto) data: 28/01/2013 13:39:46
Ciao a tutti,
sto provando a creare tre connessioni tramite ODBC in VBA di Access.
Ho provato a seguire la guida in linea, ma con scarso successo.
Riporto il codice che ho scritto (lanciandolo però si pianta subito)..
Cosa sbaglio?
Grazie in anticipo
Luca
Sub connetti
Dim ConnA As ADODB.Connection
Dim ConnB As ADODB.Connection
Dim ConnC As ADODB.Connection
Set ConnA = New ADODB.Connection
ConnA.ConnectionString = "Data Source='DATABASE1';" & _
"User ID='USER'; Password='PASSWORD';"
ConnA.ConnectionTimeout = 30
ConnA.Open
Set ConnB= New ADODB.Connection
ConnBConnectionString = "Data Source='DATABASE2;" & _
"User ID='USER'; Password='PASSWORD';"
ConnBConnectionTimeout = 30
ConnBOpen
Set ConnC= New ADODB.Connection
ConnCConnectionString = "Data Source='DATABASE3;" & _
"User ID='USER'; Password='PASSWORD';"
ConnCConnectionTimeout = 30
ConnCOpen
.... altro codice..
End sub
|
di Vecchio Frac data: 28/01/2013 21:31:09
Non è che basta semplicemente omettere user id e password, visto che dubito che il tuo database abbia come utente 'USER' e come password 'PASSWORD' (anzi dubito che abbia uno user e una password) ?
di gugluca (utente non iscritto) data: 29/01/2013 08:28:44
Ciao,
no il mio database ha user e password (ovviamente non quelli).. Il DB si trova su un server condiviso.
Il codice che ho scritto è corretto?
Se provo a lanciare la macro mi esce fuori un errore di questo tipo:
Errore tipo di compilazione: Tipo definito dall'utente non definito
Dove sto sbagliando?
Grazie delle info
Ciao
Luca
di gugluca (utente non iscritto) data: 29/01/2013 09:35:34
Risolto il problema di connessione..
Non avevo abilitato fra i riferimenti questo:
Microsoft ActivX data Objects
Ora il problema si è spostato però sulla query che riporto sotto..
Sto provando ad inserire dalla tabella che ho salvato nel file di access (TAB_LOCALE) alla tabella che ho salvato in rete (TAB_RETE), utilizzando la connessione che ora funziona..
Secondo voi dove sto sbagliando ora?
Grazie ancora per il supporto
Luca
SQL = "INSERT INTO TAB_RETE " & _
"SELECT * FROM TAB_LOCALE;"
ConnA.Execute SQL |
di Vecchio Frac data: 29/01/2013 10:56:43
Ottieni qualche errore o non ottieni nessun un risultato?
I campi di tab_rete e di tab_locale sono gli stessi vero?
Tab_locale ha qualche record da inserire in tab_rete?
Prova a essere più esplicito con l'istruzione Insert into:
INSERT INTO table (field1, field2, field3, field4) IN 'external_database.mdb' VALUES (p1, p2, p3, p4)
Comunque: invece di aprire una connessione e lavorarci, perchè non linki direttamente la tabella in Access e la utilizzi come una normale tabella?
Eviteresti l'uso di ADO (Access non è ottimizzato per ADO, ma per DAO). Anche se conoscere ADO e il suo modello è ottima cosa (soprattutto se poi punti a sviluppare in VB o con altri database).
di gugluca (utente non iscritto) data: 29/01/2013 13:43:06
Non ottengo errori espliciti.. L'esecuzione del codice si interrompe sulla linea 'ConnA.Execute SQL'..
I campi delle due tabelle sono gli stessi, se provo a girare la stessa query tramite access la query funziona... La tab_rete è sul DB al quale ho avuto accesso con ConnA.. La tab_locale è sul mio DB di Access.. Sembra che non riesca ad utilizzare nella stessa query due tabelle in due mondi diversi (ma con una query pass-trough però si riesce)...
Ho già provato a creare una tabella collegata in Access e funziona bene. Unica cosa è che mentre esegue il codice (che riporto sotto) mi richiede USER e PASSWORD per la connessione...
Nel codice sotto, riporto il passaggio che funziona perfettamente..
Ci sono due query: la prima di DELETE direttamente sul DB in rete (che gestendo solo tabelle del DB in rete funziona perfettamente) e la seconda di INSERT (che lavora su access tra la tabella di access e la tabella collegata alla rete). Unico problema è che la seconda query girando mi chiede Username e Password..
SQL = "DELETE FROM TAB_RETE" & _
"WHERE DATA ='" & data & "';"
ConnA.Execute SQL
SQL = "INSERT INTO TAB_COLLEGATA" & _
"SELECT * FROM TAB_RETE;"
DB.Execute SQL
|
di gugluca (utente non iscritto) data: 29/01/2013 13:44:07
Scusate, riposto il codice corretto..
SQL = "DELETE FROM TAB_RETE" & _
"WHERE DATA ='" & data & "';"
ConnA.Execute SQL
SQL = "INSERT INTO TAB_COLLEGATA" & _
"SELECT * FROM TAB_LOCALE;"
DB.Execute SQL
|
di Vecchio Frac data: 29/01/2013 21:56:50
Ma l'oggetto DB come è stato definito? cioè, a cosa punta?
Set DB = ... ?
Come hai impostato la connessione a DB?
di gugluca (utente non iscritto) data: 30/01/2013 08:38:26
L'oggetto DB è impostato Set DB = CurrentDb
Il codice che ho postato dove è presente l'oggetto DB (che riporto qui di sotto) funziona perfettamente.
Scusa ma sono stato poco chiaro prima.. provo a rispiegarmi:
Il codice inserito funziona, la prima query SQL (è di tipo pass through), lavora esclusivamente sulla tabella TAB_RETE e funziona bene. La seconda query SQL lavora sul DB locale e funziona altrettanto bene lavorando su una tabella locale e su una collegata (collegata alla rete).
Il problema è che la seconda query girando, nel tentativo di collegarsi richiede user e password.
Le problematiche sono:
1) posso far in modo che la seconda query non mi richieda user e password per accedere? posso impostargliele da qualche parte nel codice?
2) in alternativa (preferirei), posso cambiare la seconda query inserendo una query che non vada ad inserire nella TAB_COLLEGATA, ma direttamente nella TAB_RETE, creando una query del genere:
"INSERT INTO TAB_RETE SELECT * FROM TAB_LOCALE"
VBA non mi fa eseguire quest'ultima query, perchè utilizzo due tabelle posizionate in 2 DB differenti (locale e rete).. come posso impostare questa query che punta su due tabelle su due DB diversi senza passare da una tabella collegata?
Grazie ancora
Luca
SQL = "DELETE FROM TAB_RETE" & _
"WHERE DATA ='" & data & "';" (prima query)
ConnA.Execute SQL
SQL = "INSERT INTO TAB_COLLEGATA" & _
"SELECT * FROM TAB_LOCALE;" (seconda query)
DB.Execute SQL
|
di Vecchio Frac data: 30/01/2013 11:33:55
Da poco (un anno circa) mi sono deciso a costruire le mie query parametriche di inserimento sfruttando le QueryDef.
Nell'esempio che segue (stralciato da un codice funzionante) creo un oggetto Query al volo, fornito di quattro parametri (da p1 a p4, di tipo Integer, Text, Data e Memo rispettivamente), che si occupa di inserire nella tabella Contributors i quattro campi che vedi, e (ecco la parte che ti interessa) specificando che il database che contiene la tabella Contributors si trova IN sSource.
Nella fattispecie tanto per chiarire abbiamo
sSource = "\asp66050 est_mdbasedati.mdb"
Tu dovresti riuscire a fare una cosa tipo
SQL = "INSERT INTO TAB_RETE IN " & database_remoto & " SELECT * FROM TAB_LOCALE;"
Set qdf = CurrentDb.CreateQueryDef("", "PARAMETERS p1 Int, p2 Text(255), p3 DateTime, p4 Text; " & _
"INSERT INTO Contributors (C_ID, matricola, [timestamp], osservazioni) IN '" & sSource & "' VALUES (p1, p2, p3, p4);")
qdf.Parameters("p1") = DMax("C_ID", mTable) + 1
qdf.Parameters("p2") = UserName
qdf.Parameters("p3") = Now()
qdf.Parameters("p4") = Nz(o, "")
qdf.Execute dbFailOnError |
di gugluca (utente non iscritto) data: 30/01/2013 15:25:33
Ciao,
ho preso spunto da quanto hai indicato (riporto il codice che ho tentato di creare qua sotto).
Se provo ad eseguire il codice mi esce un messaggio di errore di sintassi nell'istruzione INSERT_INTO..
Secondo te, cosa sto sbagliando adesso?
Public ConnA As ADODB.Connection
Dim DB As DAO.Database
Dim sqld As QueryDef
Set ConnA = New ADODB.Connection
ConnA.ConnectionString = "Data Source='DATABASE1';" & _
"User ID='USER'; Password='PASSWORD';"
ConnA.ConnectionTimeout = 30
ConnA.Open
Set DB = CurrentDb
Set sqld = DB.CreateQueryDef("", "INSERT INTO TAB_RETE IN '" & ConnA & "' SELECT " & _
" ......... " & _
"FROM [TAB_LOCALE] ")
sqld.Execute dbFailOnError
DB.Close
End Sub
|
di Vecchio Frac data: 30/01/2013 18:35:21
Non devi inserire ConnA come percorso del database remoto, ma il vero percorso di rete e il nome di file (vedi il mio esempio di prima per sSource).
Per velocizzare, senza usare QueryDef (il mio era solo un esempio per query parametriche) fai così:
CurrentDB.Execute "INSERT INTO TAB_RETE IN '" & percorso_e_nome_database_remoto & "' SELECT * FROM [TAB_LOCALE] "
e dimmi cosa otteniamo.
Attenzione che tab_rete deve avere gli stessi campi di tab_locale (ma mi pare che l'avevamo già assodato).
di gugluca (utente non iscritto) data: 31/01/2013 10:52:21
Il problema è che il database non ha un percorso.. Non è un file access o altro file.
Ho creato delle tabelle collegate via ODBC, ma lanciando il codice mi viene chiesto la password nel momento in cui la procedura utilizza la tabella.. È possibile impostare la username e password da qualche parte per le tabelle collegate in modo che non mi venga più richiesta?
Vuoi Approfondire?