Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di alexmaz
    Registrato dal
    May 2001
    Messaggi
    972

    [ADOX] Ricollegare file collegati via codice

    Se vi dovesse capitare, come a me, di avere in un database Access dei file di testo collegati come tabelle e voleste ricollegarli via codice in modo che l'utente dell'applicazione faccia il meno possibile, doveste stare attenti alle proprietà del file collegato, non basta ricollegarli come si farebbe con le tabelle, perchè cambia il provider che è non o mal documentato. La cosa migliore da fare è recuperare i dati dal file collegato esistente; leproprietà sono accessibili anche se il percorso del file è cambiato (e quindi va ricollegato) perchè sono è cmq un oggetto presente nel db.

    io ho usato queste procedure (ok, il codice fa schifo e i nomi delle variabili sono criptici, ma tenete conto che odio vb )

    questa procedura mette in un array le proprietà del file collegato.
    codice:
    Public Function pf_getLinkedFileProp(f_strFileName As String) As String()
    
        Dim f_astrFileProp(10) As String
        Dim f_cn As Connection
        Dim f_cat As ADOX.Catalog
        
        Set f_cn = New ADODB.Connection
    
        Set f_cat = New ADOX.Catalog
        Set f_cat.ActiveConnection = CurrentProject.Connection
        f_astrFileProp(1) = f_cat.Tables(f_strFileName).Name
        Dim x As Integer
        For x = 1 To 9
            f_astrFileProp(x + 1) = f_cat.Tables(f_strFileName).Properties(x).Value
        Next x
        
        pf_getLinkedFileProp = f_astrFileProp
        
    End Function
    e questa lo ricollega. Alcune cose sono un po' strane, ho adattato una procedura trovata su un libro che tiene i nomi dei file o tabelle nel db. La procedura serve sia a ricollegare tabelle collegate normali che file di testo collegati ed è in teoria utilizzabile per qulunque collegamento attraverso JET OLEDB (ISAM?).

    codice:
    Public Sub sp_CollegaTabelle(f_rsTblCol As ADODB.Recordset, f_strDBName As String, f_strTipo As String)
        Dim f_catCur As New ADOX.Catalog
        Dim f_intTotTbl As Integer
        Dim f_intCurTbl As Integer
        Dim f_strCurTbl As String
        Dim f_astrFileProp() As String
        
        On Error GoTo Errore_CollegaTabelle
        
        If f_strTipo = "text" Then
            f_astrFileProp = pf_getLinkedFileProp(pstrNomeFile)
        End If
        
        f_rsTblCol.MoveLast
        f_intTotTbl = f_rsTblCol.RecordCount
        f_rsTblCol.MoveFirst
        
        f_catCur.ActiveConnection = CurrentProject.Connection
        
        f_intCurTbl = 1
        
        Do Until f_rsTblCol.EOF
            On Error Resume Next
            
            f_strCurTbl = f_rsTblCol!tabella
            f_catCur.Tables.Delete f_strCurTbl
            f_catCur.Tables.Refresh
            
            On Error GoTo Errore_CollegaTabelle
            
            Dim f_tblCur As New ADOX.Table
            Set f_tblCur.ParentCatalog = f_catCur
        
            
            f_tblCur.Name = f_rsTblCol!tabella
            
            If f_strTipo = "text" Then
                Dim i As Integer
                Dim b_strNome As String
                i = InStr(1, f_strDBName, f_astrFileProp(1))
                b_strNome = Left(f_strDBName, i - 1)
                f_tblCur.Properties("Jet OLEDB:Link Datasource") = b_strNome
                f_tblCur.Properties("Jet OLEDB:Create Link") = True
                f_tblCur.Properties("Jet OLEDB:Remote Table Name") = f_rsTblCol!tabella & "#txt"
                f_tblCur.Properties("Jet OLEDB:Link Provider String") = f_astrFileProp(6)
                f_tblCur.Properties("Jet OLEDB:Exclusive Link") = False
            Else
                f_tblCur.Properties("Jet OLEDB:Link Datasource") = f_strDBName
                f_tblCur.Properties("Jet OLEDB:Create Link") = True
                f_tblCur.Properties("Jet OLEDB:Remote Table Name") = f_rsTblCol!tabella
            End If
                
            f_catCur.Tables.Append f_tblCur
            
            Set f_tblCur = Nothing
            
            f_rsTblCol.MoveNext
            f_intCurTbl = f_intCurTbl + 1
        Loop
        
        Exit Sub
    
    Errore_CollegaTabelle:
        
        
    End Sub
    Queste cmq sono le proprietà di un file di testo collegato

    codice:
    Jet OLEDB:Table Validation Text 
    Jet OLEDB:Table Validation Rule 
    Jet OLEDB:Cache Link Name/Password False
    Jet OLEDB:Remote Table Name FILE_TESTATA#txt
    Jet OLEDB:Link Provider String Text;DSN=FILE_TESTATA - specifica di collegamento1;FMT=Delimited;HDR=NO;IMEX=2;CharacterSet=850;
    Jet OLEDB:Link Datasource C:\Documents and Settings\alex\Desktop
    Jet OLEDB:Exclusive Link False
    Jet OLEDB:Create Link True
    Jet OLEDB:Table Hidden In Access False
    Ma vanno riprese ogni volta perchè la stringa del provider può cambiare
    Saluti
    The individual has always had to struggle to keep from being overwhelmed by the tribe. If you try it, you will be lonely often, and sometimes frightened. But no price is too high to pay for the privilege of owning yourself.

  2. #2
    Utente di HTML.it L'avatar di alexmaz
    Registrato dal
    May 2001
    Messaggi
    972
    Per migliorare la cosa si può usare una transazione, altrimenti se qualcosa va storto vi sega la tabella collegata...

    f_catCur.ActiveConnection.BeginTrans prima di iniziare

    f_catCur.ActiveConnection.CommitTrans dope aver finito

    f_catCur.ActiveConnection.RollbackTrans in caso di errore.

    Ho fatto una scoperta agghiacciante: nel caso di file di testo in rete, al primo ricollegamento fallisce perchè non roconosce il DSN. Rifacendo tutta la procedura una seconda volta, funziona

    Grazie Microsoft :quipy:
    The individual has always had to struggle to keep from being overwhelmed by the tribe. If you try it, you will be lonely often, and sometimes frightened. But no price is too high to pay for the privilege of owning yourself.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.