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.
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 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
Queste cmq sono le proprietà di un file di testo collegatocodice: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
Ma vanno riprese ogni volta perchè la stringa del provider può cambiarecodice: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
Saluti![]()
![]()


)
Rispondi quotando
