Newsgroup: it.comp.appl.access
Titolo: Connessione ODBC Oracle utilizzando odbc di sistema

Buongirono a tutti
dopo tempo finalmente (purtroppo per voi :)) torno a scirver esul NG :)
ma venendo ai fatti..
avrei la necessità di crare una procedura VBA che sfruttando gli odbc di 
sistema inseriti nel pc mi faccia il relink di alcune tabelle che 
risiedono su un db oracle.
la domanda è come faccio ad usare la connessione odbc già esistente?
sono partito dalla FAQ 1.29 del sitocomune, e la stringa di connessione 
ho messo ODBC;DSN=DB_TEST;UID=T;PWD=h;DBQ=DB_TEST
ma non va, non restituisce errori ma non carica le tabelle
ho provato a linkare manualmente una tabella a copiarmi la stringa che 
viene inserita nella MsysObjects ma non va cmq (sempre zero errori e 
nessuna nuova tabella)
vorrei provare con il metodo del docm.TransferDatabase.. ma non so come 
impostare l'utilizzzo di un odbc già esistente e configurato
qualcuno ha qualche suggerimento?
grazie
Ciao
Nick

Da mie esperienze passate, è necessario il client oracle installato.
Ce l'hai?
Parli di connessione odbc già esistente ma non specifichi quale
cesare
Nick ha scritto:


 
certo che il client è installato :)
parlo di connessione odbc esistente nel senso che tra gli odbc di 
sistema del client ho la connessione "db_test" la quale fariferimento al 
dirver oracle 10g e punta ad uno specifico db presente del tnsname.ora.
vorrei utilizzare la connessione esistente (e non inserire tutti i 
parametri all'interno della stringa odbc) perchè essendo un tnsname 
condiviso al cambio di qualche parametro (ip server, ambiente, ecc) è 
sufficiente cambiarlo in questo file e tutti i client avranno le stringe 
corrette.
non so se è questo il dubbio che avevi...
grazie
ciao
Nick

Nick ha scritto:

Ok.
Non puoi collegare le tabelle manualmente e prevedere eventualmente un 
relink all'avvio?
Cesare

Cesare Fortis ha scritto:

sono più di 100 tabelle e cmq per il relink all'avvio.. cosa suggerisci?
perchè se devo pasare da vba..farlo da zero o relinkare è cmq uguale no?
grazie
ciao
Nick

Nick ha scritto:

Ho risolto, era più banale a farsi che a dirsi:
DoCmd.TransferDatabase acLink, "ODBC Database", _
     "ODBC;DSN=Nome connessione;UID=user;PWD=password;LANGUAGE=italian;" _
    , acTable, S, S
(S è la variabile che hail nome della tabella)
ora devo trovare il metodo per creare l'indice che mi dia l'univocità 
per quelle tabelle sporvviste di indice e ci sono :)
ciao
Nick

Nick ha scritto:

1 o 100 non fa differenza, perchè comunque le devi selezionare o 
scrivere in una tabella di appoggio, etc, etc.
Sul sitocomune ci sono molti esempi di procedure che eseguono il relink.
Normalmente io allego le tabelle manualmente (anche perchè per 
sviluppare le devo avere anche nel mio db), poi all'avvio le relinko.
Molte query che utilizzo sono passthrough ed in questo caso la stringa 
di connessione la passo comunque.
Cesare


sono d'accordo, ma il mio problema era come costruire la stringa di 
connessione, cmq ora ho risolto (vedi post delle 13.39)
grazie!
ciao
Nick

 
Ecco la soluzione finale con il link di tabelle odbc usando un odbc 
source esistente sul pc (per la funzione Esiste_Oggetto fare riferimento 
al sitocomune). Ho inserito anche 4 righe per avere su file di testo un 
log delle operazioni di linkaggio.
L'ho commentata per le parti più strane, se servono chiarimenti son qua :)
----------- CODICE ------------------------------
Private Const cCnnString As String = 
"ODBC;DSN=DB_TEST;UID=t;PWD=h;LANGUAGE=italian;";stringa che richiama 
l'odbc, in questo caso trattandosi di oracle non viene memorizzato user 
e pass nell'odbc quindi è necesario ripassarglieli
Private Const SuffixDB As String = "test." ;proprietario della tabella
Private Const cLnkTbl As String = "PUBLIC_USER_TABLES"; tabella su 
oracle contenente l'elenco delle tabella da linkare
Private Function LinkODBCTbl() As Boolean
    On Error GoTo Err_RlnkODBCTbl
    Dim tdf As TableDef
    Dim rs As Recordset
    Dim T As String
    Dim S As String
    Dim strSQL As String
    Dim strSQL2 As String
    LinkODBCTbl = False
    strSQL = "SELECT * FROM " & cLnkTbl & " WHERE [TABLESPACE_NAME]=" & 
Chr(34) & "DATI" & Chr(34)
    'Debug.Print strSQL
    Set rs = CurrentDb.OpenRecordset(strSQL)
    rs.MoveFirst
    DoCmd.SetWarnings False
    Open "C:\logtbl.txt" For Output As #1
    Print #1, Date
    Do Until rs.EOF
       T = SuffixDB & rs.Fields("TABLE_NAME").Value
       S = rs.Fields("TABLE_NAME").Value
       If Esiste_Oggetto(S, fTabella) Then _
             CurrentDb.TableDefs.Delete S
         Set tdf = CurrentDb.CreateTableDef(S)
         tdf.SourceTableName = T
         tdf.Connect = cCnnString
         tdf.Attributes = dbAttachSavePWD
         CurrentDb.TableDefs.Append tdf
         CurrentDb.TableDefs.Refresh
         Print #1, "Tabella " & S & " connessa"
         If CurrentDb.TableDefs(S).Indexes.Count < 1 Then
	;se la tabella non ha indici o non riesce a leggerli metto come default 
il primo campo. l'ideale sarebbe creare una tabella in locale dove poter 
leggere quali sono gli indici reali da aggiungere... ma a me ora questo 
passo non serve
             strSQL2 = "ALTER TABLE " & S & _
     " ADD CONSTRAINT __uniqueindex PRIMARY KEY (" & 
CurrentDb.TableDefs(S).Fields(0).Name & ")"
             Print #1, "Inserito indice per " & S & " campo usato: " & 
CurrentDb.TableDefs(S).Fields(0).Name
         End If
       rs.MoveNext
    Loop
    LinkODBCTbl = True
    DoCmd.SetWarnings True
Exit_Here:
     Close #1
     rs.Close
     DoCmd.SetWarnings True
     Set rs = Nothing
     Set tdf = Nothing
     Exit Function
Err_RlnkODBCTbl:
     If Err.Number = 3283 Then Resume Next 'chiave già essitente
    Print #1, Err.Number & " " & Err.Description & " --> " & S
    LinkODBCTbl = False
    MsgBox Err.Number & " " & Err.Description
    Resume Exit_Here
End Function
----------- FINE CODICE ------------------------------
Ciao
Nick