+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 7 su 7

Discussione: Stampa nome dei campi tabella Access

  1. #1
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    228

    Stampa nome dei campi tabella Access

    Ho creato un banalissimo programma per stampare la struttura di un database MSAccess.

    codice:
    Dim cn As ADODB.Connection
    Dim rsSchema As ADODB.Recordset
    Dim rs As ADODB.Recordset
    Dim sSQL As String
    
    Sub Tabelle()
    Set rsSchema = cn.OpenSchema(adSchemaTables)
    List1.Clear
    Do While Not rsSchema.EOF
       If (Left$(rsSchema("TABLE_NAME"), 4) <> "MSys") Then
           List1.AddItem rsSchema("TABLE_NAME")
       End If
           rsSchema.MoveNext
    Loop
    rsSchema.Close: Set rsSchema = Nothing  
    End Sub
    
    Private Sub dcButton1_Click()
    On Error GoTo No_File
    cDialog.ShowOpen
    Set cn = New ADODB.Connection
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & cDialog.FileName
    Text1.Text = cDialog.FileName
    
     Tabelle
    
    No_File:
    
    End Sub
    
    Private Sub dcButton2_Click()
    Dim rs As New ADODB.Recordset
    Set rs = New ADODB.Recordset
    rs.Open List1.Text, cn, adOpenKeyset, adLockOptimistic
    
    FreeFile
      Open App.Path & "\Struttura.txt" For Append As #1  
    
                    Print #1, "Tabella : " & List1.Text 
                    
          For i = 0 To rs.Fields.Count - 1
                          
                          Print #1, rs.Fields(i).Name & Chr(13) 
                          rs.MoveNext
                          
          Next
          
          Print #1, Chr(13) 
          
    Close #1
    rs.Close: Set rs = Nothing
    
    End Sub
    Funziona.
    Genera o apre il file Struttura.txt con all'interno il nome della tabella ed il nome dei relativi campi se la tabella ha dei record, altrimenti si blocca con errore "3021 .......è necessario disporre di un record corrente".
    Come stampare i nome dei campi se la tabella è vuota ?
    Grazie

  2. #2
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    228
    Risolto !
    L'errore è in quel ( rs.MoveNext)

    Print #1, rs.Fields(i).Name & Chr(13)
    rs.MoveNext
    che va eliminato perché, ovviamente, quando la tabella è vuota solleva l'errore 3021.
    Ciao a tutti.

  3. #3
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scolaretto
    Post
    483
    Semplicemente il metodo adottato è sbagliato : se leggi i nomi dei campi partendo da un recordset è evidente che se questo (il recordset) è vuoto NON cavi un ragno dal buco .....
    Quindi o inserisci almeno 1 record (che poi magari cancelli) proseguendo nella modalità di programmazione 'approssimativa' oppure utilizzi ADOX e cerchi di comprendere / adattare il seguente codice :
    codice:
    Public Function ShowAllTables(Optional bShowFieldsToo As Boolean)
    '
    'Purpose:   List the tables (and optionally their fields) using ADOX.
    '
    Dim cat         As New ADOX.Catalog 'Root object of ADOX.
    Dim tbl         As ADOX.Table       'Each Table in Tables.
    Dim col         As ADOX.Column      'Each Column in the Table.
    
    'Point the catalog to the current project's connection.
    Set cat.ActiveConnection = CurrentProject.Connection
    
    'Loop through the tables.
    For Each tbl In cat.Tables
        Debug.Print tbl.Name, tbl.Type
        If bShowFieldsToo Then
            'Loop through the columns of the table.
            For Each col In tbl.Columns
                Debug.Print , col.Name, col.Type
            Next
        End If
    Next
    
    'Clean up
    Set col = Nothing
    Set tbl = Nothing
    Set cat = Nothing
    End Function
    Il codice è per Access (VBA) ma sono sicuro che sarai in grado di comprenderlo e adattarlo alle tue esigenze ...

  4. #4
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scolaretto
    Post
    483
    Quote Originariamente inviato da pierovb Visualizza il messaggio
    Risolto !
    L'errore è in quel ( rs.MoveNext)


    che va eliminato perché, ovviamente, quando la tabella è vuota solleva l'errore 3021.
    Ciao a tutti.
    Visto che hai risolto (pare) anche con recordset vuoto puoi fare a meno di utilizzare il metodo proposto ....

  5. #5
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    228
    Ho risolto, senza "pare"
    Ciao.

  6. #6
    L'avatar di Max.Riservo
    Max.Riservo non è in linea Scolaretto
    Post
    483
    Quote Originariamente inviato da pierovb Visualizza il messaggio
    Ho risolto, senza "pare"
    Ciao.
    Bene ....
    Mi sembra di capire che non hai l'esigenza di avere altre informazioni oltre al nome dei campi, quindi puoi anche non 'complicarti' la vita usando ADOX.
    Se poi ti servisse anche sapere il tipo di campo e altre info .... allora dovrai realmente cambiare approccio.

  7. #7
    pierovb non è in linea Scolaretto
    Luogo
    Reggio Calabria
    Post
    228
    Ti ringrazio per la risposta ma, come accennavo all'inizio mi serve semplicemente
    stampare su file di testo un elenco del nome dei campi del database.
    Ciao

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi