Bonjour à tous,
travaillant avec Access (et VB6 bien sur) je voudrai savoir s'il existe ,
soit une source , soit une piste pour analyser assez complètement la
structure d'une base access afin de la sauvegarder (format texte ou autre)
afin de pouvoir la "régénérer" en cas de plantage..
Bien sûr j'ai de nombreuses copies de cette table..
Mais je voulais, "à titre d'exercice" analyser cette structure : tables (y
compris les tables cachées), indexes, requêtes, relations..
pour ma part j'utilise DAO mais je crois qu'il faudrait utiliser ADOX ?
Comment apprendre à manipuler cela ?
Je voudrai aussi prévoir un module de "reconstruction de la base de
données"..
merci pour vos pistes pour ce projet "assez vaste" il me semble..
Driss
Bonjour à tous,
travaillant avec Access (et VB6 bien sur) je voudrai savoir s'il existe ,
soit une source , soit une piste pour analyser assez complètement la
structure d'une base access afin de la sauvegarder (format texte ou autre)
afin de pouvoir la "régénérer" en cas de plantage..
Bien sûr j'ai de nombreuses copies de cette table..
Mais je voulais, "à titre d'exercice" analyser cette structure : tables (y
compris les tables cachées), indexes, requêtes, relations..
pour ma part j'utilise DAO mais je crois qu'il faudrait utiliser ADOX ?
Comment apprendre à manipuler cela ?
Je voudrai aussi prévoir un module de "reconstruction de la base de
données"..
merci pour vos pistes pour ce projet "assez vaste" il me semble..
Driss
Bonjour à tous,
travaillant avec Access (et VB6 bien sur) je voudrai savoir s'il existe ,
soit une source , soit une piste pour analyser assez complètement la
structure d'une base access afin de la sauvegarder (format texte ou autre)
afin de pouvoir la "régénérer" en cas de plantage..
Bien sûr j'ai de nombreuses copies de cette table..
Mais je voulais, "à titre d'exercice" analyser cette structure : tables (y
compris les tables cachées), indexes, requêtes, relations..
pour ma part j'utilise DAO mais je crois qu'il faudrait utiliser ADOX ?
Comment apprendre à manipuler cela ?
Je voudrai aussi prévoir un module de "reconstruction de la base de
données"..
merci pour vos pistes pour ce projet "assez vaste" il me semble..
Driss
Bonjour à tous,
travaillant avec Access (et VB6 bien sur) je voudrai savoir s'il existe ,
soit une source , soit une piste pour analyser assez complètement la
structure d'une base access afin de la sauvegarder (format texte ou autre)
afin de pouvoir la "régénérer" en cas de plantage..
Bien sûr j'ai de nombreuses copies de cette table..
Mais je voulais, "à titre d'exercice" analyser cette structure : tables (y
compris les tables cachées), indexes, requêtes, relations..
pour ma part j'utilise DAO mais je crois qu'il faudrait utiliser ADOX ?
Comment apprendre à manipuler cela ?
Je voudrai aussi prévoir un module de "reconstruction de la base de
données"..
merci pour vos pistes pour ce projet "assez vaste" il me semble..
Driss
Bonjour à tous,
travaillant avec Access (et VB6 bien sur) je voudrai savoir s'il existe ,
soit une source , soit une piste pour analyser assez complètement la
structure d'une base access afin de la sauvegarder (format texte ou autre)
afin de pouvoir la "régénérer" en cas de plantage..
Bien sûr j'ai de nombreuses copies de cette table..
Mais je voulais, "à titre d'exercice" analyser cette structure : tables (y
compris les tables cachées), indexes, requêtes, relations..
pour ma part j'utilise DAO mais je crois qu'il faudrait utiliser ADOX ?
Comment apprendre à manipuler cela ?
Je voudrai aussi prévoir un module de "reconstruction de la base de
données"..
merci pour vos pistes pour ce projet "assez vaste" il me semble..
Driss
Bonjour à tous,
travaillant avec Access (et VB6 bien sur) je voudrai savoir s'il existe ,
soit une source , soit une piste pour analyser assez complètement la
structure d'une base access afin de la sauvegarder (format texte ou autre)
afin de pouvoir la "régénérer" en cas de plantage..
Bien sûr j'ai de nombreuses copies de cette table..
Mais je voulais, "à titre d'exercice" analyser cette structure : tables (y
compris les tables cachées), indexes, requêtes, relations..
pour ma part j'utilise DAO mais je crois qu'il faudrait utiliser ADOX ?
Comment apprendre à manipuler cela ?
Je voudrai aussi prévoir un module de "reconstruction de la base de
données"..
merci pour vos pistes pour ce projet "assez vaste" il me semble..
Driss
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps
j'utilise des requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL,
peut être dans un premier temps par VB..
Driss
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps
j'utilise des requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL,
peut être dans un premier temps par VB..
Driss
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps
j'utilise des requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL,
peut être dans un premier temps par VB..
Driss
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps
j'utilise des requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL,
peut être dans un premier temps par VB..
Driss
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps
j'utilise des requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL,
peut être dans un premier temps par VB..
Driss
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps
j'utilise des requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL,
peut être dans un premier temps par VB..
Driss
Driss HANIB wrote:
Driss HANIB wrote:
Driss HANIB wrote:
Jean-marc wrote:Driss HANIB wrote:
Jean-marc wrote:
Driss HANIB wrote:
Jean-marc wrote:Driss HANIB wrote:
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps j'utilise des
requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL, peut être
dans un premier temps par VB..
Driss
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps j'utilise des
requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL, peut être
dans un premier temps par VB..
Driss
merci Jean-Marc,
j'attends avec impatience tes pistes.
Effectivement le format SQL me plait bien, mais pour l'instant je ne
maitrise pas encore ce langage, puis que la plupart du temps j'utilise des
requêtes précompilées dasn mes bases de données.
mai cela m'interesse à double titre : je pense aussi tester MySQL, peut être
dans un premier temps par VB..
Driss
Driss HANIB wrote:
> merci Jean-Marc,
>
> j'attends avec impatience tes pistes.
> Effectivement le format SQL me plait bien, mais pour l'instant je ne
> maitrise pas encore ce langage, puis que la plupart du temps
> j'utilise des requêtes précompilées dasn mes bases de données.
> mai cela m'interesse à double titre : je pense aussi tester MySQL,
> peut être dans un premier temps par VB..
> Driss
Hello Driss,
Bon je me rends compte que le sujet est très vaste et suppose
connu une floppée de concepts.
Le plus simple est sans doute de procéder en 2 étapes:
1) Comprendre le modèle de données des bases Access
2) Voir comment on peut à partir de ces infos stocker tout cela
pour recréer la base.
Pour la partie 1) :
Tout est décrit dans la Doc. Je ne sais pas si tu as un MSDN installé.
A toutes fins utiles, j'ai placé ici les 2 fichiers CHI et CHM qui
donne la doc de DAO:
http://users.skynet.be/candide/daohlp/daohlp.htm
Le chapitre "DAO Objects Reference" (le 2eme petit livre) contient
DAO Object Model For Microsoft JetWorkspaces: c'est la qu'est décrit
le modèle de données.
Une fois ceci compris, le reste est assez simple.
Note que le schéma est interactif et pointe à chaque fois vers une
explication complète et contient des exemples.
Pour commencer, voici un petit exemple qui permet de récupérer les
tables et pour chaque table les champs avec les détails:
=> Note, il te faut inclure une référence àMicrosoft DAO 3.6 dans le
Public Sub AnalyzeDB(ByVal dbFileName As String, ByVal dbFileStructReport
String)
Dim db As Database
Dim f As Integer
Dim i As Integer
Dim tblDefs As TableDefs
Dim tblDef As TableDef
Dim nbTable As Long
Dim colFields As Fields
Dim aField As Field
If Not FileExists(dbFileName) Then
MsgBox dbFileName & " : Chemin invalide.", vbCritical, "Erreur"
Exit Sub
End If
' ouverture du fichier de rapport
f = FreeFile
Open dbFileStructReport For Output As #f
' Ouverture de la base
Set db = OpenDatabase(dbFileName)
Print #f, "Analyse de la base : " & dbFileName
Print #f, ""
' Analyse des tables
' ------------------
Print #f, "Analyse des Tables"
Print #f, "------------------"
Print #f, ""
' On récupère la collection des Tables
Set tblDefs = db.TableDefs
Print #f, "Nombre de tables : " & tblDefs.Count
' Parcours des tables avec un simple for each
For Each tblDef In tblDefs
nbTable = nbTable + 1
Print #f, "Table " & nbTable & " : " & tblDef.Name;
' Détection des tables système
If (tblDef.Attributes And dbSystemObject) Then
Print #f, " - (table système)"
Else
Print #f, ""
End If
' Détail des tables non système
If (tblDef.Attributes And dbSystemObject) Then
' rien
Else
' décommenter pour voir le détail - traitement assez long
' la seule propriété intéressante potentiellement est
"SourceTableName" (tables liées)
'For i = 0 To tblDef.Properties.Count - 1
' If tblDef.Properties(i).Type <> 11 Then
' Print #f, tblDef.Properties(i).Name & "=" &
tblDef.Properties(i).Value
' End If
'Next i
End If
If (tblDef.Attributes And dbSystemObject) Then
' rien à faire
Else
' détail des champs pour les tables non système
Print #f, "-------------------------------"
Print #f, "Fields : "
' obligatoire car toutes les propriétés ne sont pas définies
On Error Resume Next
Set colField = tblDef.Fields
For Each aField In colField
For i = 0 To aField.Properties.Count - 1
Print #f, aField.Properties(i).Name & "=" &
aField.Properties(i).Value
Next i
Print #f, "-------------------------------"
Next
End If
Next
' fermeture de la base
db.Close
Set db = Nothing
' fermeture du fichier
Close #f
End Sub
Pour l'appeler:
Private Sub Command2_Click()
Call AnalyzeDB("C:JMDvpmtVBstructdbexemple.mdb",
"C:JMDvpmtVBstructdbexemple.txt")
ShellExecute Me.hwnd, "open", "C:JMDvpmtVBstructdbexemple.txt",
vbNullString, "C:", SW_SHOWNORMAL
End Sub
Les indexes se lisent de façon similaire. Il y a des subtilités
pour par exemple la définition des clés priamires, mais c'est assez
Bon c'est sommaire, mais ça donne déjà des pistes.
Note que tu peux accéder aux propriétés directement par leur nom.
Par exemple, le nom d'un field est accessible directement par:
afield.Name
le type par: afield.Type
etc.
les principales caractèristiques d'un champ, permettant de le reconstruire
sont une combinaison
de Type/attribute/Size. Voir l'aide de ces 3 propriétés.
Pour la partie 2, le plus simple et le plus facile est de construire
du SQL à partir des infos des tables, index, relations.
En effet, il suffit alors de faire exécuter ce SQL sur une base
nouvellement créée pour reconstruire toute la base.
note: c'est comme ça qu'on fait dans toutes les applications
pro ou on doit utiliser des DB: on donne simplement au DBA chargé
de l'installation les fichiers SQL qu'il doit exécuter, et toute
la base est créée.
Une doc indispensable à lire pour le SQL d'Access:
http://msdn2.microsoft.com/en-us/library/aa140015(office.10).aspx
En pratique, voici par exemple un bout de code qui créé une base, et
quelques champs.
Tu peux le faire tourner tel quel:
Private Sub Command1_Click()
Dim mydb As DAO.Database
Dim szSQL As String
Kill "c:essai.mdb"
Set mydb = CreateDatabase("c:essai.mdb", dbLangGeneral)
szSQL = ""
szSQL = szSQL & "CREATE TABLE MATABLE ( " & vbCrLf
szSQL = szSQL & "CHAMP1 TEXT(50) , " & vbCrLf
szSQL = szSQL & "MEMO1 MEMO , " & vbCrLf
szSQL = szSQL & "FLDOCTET BYTE , " & vbCrLf
szSQL = szSQL & "FLDENTIER SMALLINT , " & vbCrLf
szSQL = szSQL & "FLDENTIERLNG INTEGER , " & vbCrLf
szSQL = szSQL & "FLDREELSIMPL REAL , " & vbCrLf
szSQL = szSQL & "FLDREELDOUBL FLOAT , " & vbCrLf
szSQL = szSQL & "FLDDATEHOUR DATETIME , " & vbCrLf
szSQL = szSQL & "FLDCURRENCY CURRENCY , " & vbCrLf
szSQL = szSQL & "FLDNUMAUTO COUNTER , " & vbCrLf
szSQL = szSQL & "FLDYESNO YESNO , " & vbCrLf
szSQL = szSQL & "FLDDECIMAL NUMERIC , " & vbCrLf
szSQL = szSQL & "FLDOLE OLEOBJECT " & vbCrLf
szSQL = szSQL & ") " & vbCrLf
'szSQL = szSQL & "FLDDECIMAL DECIMAL(10,5) " & vbCrLf ' ne
passe pas en DAO ??
mydb.Execute (szSQL)
mydb.Close
Set mydb = Nothing
End Sub
Pour lier 1) et 2), il suffit de lire les infos de la base existante et de
générer
dans un fichier ce genre de statement SQL.
Il suffit ensuite de l'exécuter, comme dans l'exemple ci dessus.
C'est un document extrèmement bien fait et complet sur le sujet.
Ca reste concret et une fois ça compris, tu as tout pour faire ce que tu
veux.
Espérant que cela t'aide :-)
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Driss HANIB wrote:
> merci Jean-Marc,
>
> j'attends avec impatience tes pistes.
> Effectivement le format SQL me plait bien, mais pour l'instant je ne
> maitrise pas encore ce langage, puis que la plupart du temps
> j'utilise des requêtes précompilées dasn mes bases de données.
> mai cela m'interesse à double titre : je pense aussi tester MySQL,
> peut être dans un premier temps par VB..
> Driss
Hello Driss,
Bon je me rends compte que le sujet est très vaste et suppose
connu une floppée de concepts.
Le plus simple est sans doute de procéder en 2 étapes:
1) Comprendre le modèle de données des bases Access
2) Voir comment on peut à partir de ces infos stocker tout cela
pour recréer la base.
Pour la partie 1) :
Tout est décrit dans la Doc. Je ne sais pas si tu as un MSDN installé.
A toutes fins utiles, j'ai placé ici les 2 fichiers CHI et CHM qui
donne la doc de DAO:
http://users.skynet.be/candide/daohlp/daohlp.htm
Le chapitre "DAO Objects Reference" (le 2eme petit livre) contient
DAO Object Model For Microsoft JetWorkspaces: c'est la qu'est décrit
le modèle de données.
Une fois ceci compris, le reste est assez simple.
Note que le schéma est interactif et pointe à chaque fois vers une
explication complète et contient des exemples.
Pour commencer, voici un petit exemple qui permet de récupérer les
tables et pour chaque table les champs avec les détails:
=> Note, il te faut inclure une référence àMicrosoft DAO 3.6 dans le
Public Sub AnalyzeDB(ByVal dbFileName As String, ByVal dbFileStructReport
String)
Dim db As Database
Dim f As Integer
Dim i As Integer
Dim tblDefs As TableDefs
Dim tblDef As TableDef
Dim nbTable As Long
Dim colFields As Fields
Dim aField As Field
If Not FileExists(dbFileName) Then
MsgBox dbFileName & " : Chemin invalide.", vbCritical, "Erreur"
Exit Sub
End If
' ouverture du fichier de rapport
f = FreeFile
Open dbFileStructReport For Output As #f
' Ouverture de la base
Set db = OpenDatabase(dbFileName)
Print #f, "Analyse de la base : " & dbFileName
Print #f, ""
' Analyse des tables
' ------------------
Print #f, "Analyse des Tables"
Print #f, "------------------"
Print #f, ""
' On récupère la collection des Tables
Set tblDefs = db.TableDefs
Print #f, "Nombre de tables : " & tblDefs.Count
' Parcours des tables avec un simple for each
For Each tblDef In tblDefs
nbTable = nbTable + 1
Print #f, "Table " & nbTable & " : " & tblDef.Name;
' Détection des tables système
If (tblDef.Attributes And dbSystemObject) Then
Print #f, " - (table système)"
Else
Print #f, ""
End If
' Détail des tables non système
If (tblDef.Attributes And dbSystemObject) Then
' rien
Else
' décommenter pour voir le détail - traitement assez long
' la seule propriété intéressante potentiellement est
"SourceTableName" (tables liées)
'For i = 0 To tblDef.Properties.Count - 1
' If tblDef.Properties(i).Type <> 11 Then
' Print #f, tblDef.Properties(i).Name & "=" &
tblDef.Properties(i).Value
' End If
'Next i
End If
If (tblDef.Attributes And dbSystemObject) Then
' rien à faire
Else
' détail des champs pour les tables non système
Print #f, "-------------------------------"
Print #f, "Fields : "
' obligatoire car toutes les propriétés ne sont pas définies
On Error Resume Next
Set colField = tblDef.Fields
For Each aField In colField
For i = 0 To aField.Properties.Count - 1
Print #f, aField.Properties(i).Name & "=" &
aField.Properties(i).Value
Next i
Print #f, "-------------------------------"
Next
End If
Next
' fermeture de la base
db.Close
Set db = Nothing
' fermeture du fichier
Close #f
End Sub
Pour l'appeler:
Private Sub Command2_Click()
Call AnalyzeDB("C:JMDvpmtVBstructdbexemple.mdb",
"C:JMDvpmtVBstructdbexemple.txt")
ShellExecute Me.hwnd, "open", "C:JMDvpmtVBstructdbexemple.txt",
vbNullString, "C:", SW_SHOWNORMAL
End Sub
Les indexes se lisent de façon similaire. Il y a des subtilités
pour par exemple la définition des clés priamires, mais c'est assez
Bon c'est sommaire, mais ça donne déjà des pistes.
Note que tu peux accéder aux propriétés directement par leur nom.
Par exemple, le nom d'un field est accessible directement par:
afield.Name
le type par: afield.Type
etc.
les principales caractèristiques d'un champ, permettant de le reconstruire
sont une combinaison
de Type/attribute/Size. Voir l'aide de ces 3 propriétés.
Pour la partie 2, le plus simple et le plus facile est de construire
du SQL à partir des infos des tables, index, relations.
En effet, il suffit alors de faire exécuter ce SQL sur une base
nouvellement créée pour reconstruire toute la base.
note: c'est comme ça qu'on fait dans toutes les applications
pro ou on doit utiliser des DB: on donne simplement au DBA chargé
de l'installation les fichiers SQL qu'il doit exécuter, et toute
la base est créée.
Une doc indispensable à lire pour le SQL d'Access:
http://msdn2.microsoft.com/en-us/library/aa140015(office.10).aspx
En pratique, voici par exemple un bout de code qui créé une base, et
quelques champs.
Tu peux le faire tourner tel quel:
Private Sub Command1_Click()
Dim mydb As DAO.Database
Dim szSQL As String
Kill "c:essai.mdb"
Set mydb = CreateDatabase("c:essai.mdb", dbLangGeneral)
szSQL = ""
szSQL = szSQL & "CREATE TABLE MATABLE ( " & vbCrLf
szSQL = szSQL & "CHAMP1 TEXT(50) , " & vbCrLf
szSQL = szSQL & "MEMO1 MEMO , " & vbCrLf
szSQL = szSQL & "FLDOCTET BYTE , " & vbCrLf
szSQL = szSQL & "FLDENTIER SMALLINT , " & vbCrLf
szSQL = szSQL & "FLDENTIERLNG INTEGER , " & vbCrLf
szSQL = szSQL & "FLDREELSIMPL REAL , " & vbCrLf
szSQL = szSQL & "FLDREELDOUBL FLOAT , " & vbCrLf
szSQL = szSQL & "FLDDATEHOUR DATETIME , " & vbCrLf
szSQL = szSQL & "FLDCURRENCY CURRENCY , " & vbCrLf
szSQL = szSQL & "FLDNUMAUTO COUNTER , " & vbCrLf
szSQL = szSQL & "FLDYESNO YESNO , " & vbCrLf
szSQL = szSQL & "FLDDECIMAL NUMERIC , " & vbCrLf
szSQL = szSQL & "FLDOLE OLEOBJECT " & vbCrLf
szSQL = szSQL & ") " & vbCrLf
'szSQL = szSQL & "FLDDECIMAL DECIMAL(10,5) " & vbCrLf ' ne
passe pas en DAO ??
mydb.Execute (szSQL)
mydb.Close
Set mydb = Nothing
End Sub
Pour lier 1) et 2), il suffit de lire les infos de la base existante et de
générer
dans un fichier ce genre de statement SQL.
Il suffit ensuite de l'exécuter, comme dans l'exemple ci dessus.
C'est un document extrèmement bien fait et complet sur le sujet.
Ca reste concret et une fois ça compris, tu as tout pour faire ce que tu
veux.
Espérant que cela t'aide :-)
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ; _no_spam_jean_marc_n2@yahoo.fr
FAQ VB: http://faq.vb.free.fr/
Driss HANIB wrote:
> merci Jean-Marc,
>
> j'attends avec impatience tes pistes.
> Effectivement le format SQL me plait bien, mais pour l'instant je ne
> maitrise pas encore ce langage, puis que la plupart du temps
> j'utilise des requêtes précompilées dasn mes bases de données.
> mai cela m'interesse à double titre : je pense aussi tester MySQL,
> peut être dans un premier temps par VB..
> Driss
Hello Driss,
Bon je me rends compte que le sujet est très vaste et suppose
connu une floppée de concepts.
Le plus simple est sans doute de procéder en 2 étapes:
1) Comprendre le modèle de données des bases Access
2) Voir comment on peut à partir de ces infos stocker tout cela
pour recréer la base.
Pour la partie 1) :
Tout est décrit dans la Doc. Je ne sais pas si tu as un MSDN installé.
A toutes fins utiles, j'ai placé ici les 2 fichiers CHI et CHM qui
donne la doc de DAO:
http://users.skynet.be/candide/daohlp/daohlp.htm
Le chapitre "DAO Objects Reference" (le 2eme petit livre) contient
DAO Object Model For Microsoft JetWorkspaces: c'est la qu'est décrit
le modèle de données.
Une fois ceci compris, le reste est assez simple.
Note que le schéma est interactif et pointe à chaque fois vers une
explication complète et contient des exemples.
Pour commencer, voici un petit exemple qui permet de récupérer les
tables et pour chaque table les champs avec les détails:
=> Note, il te faut inclure une référence àMicrosoft DAO 3.6 dans le
Public Sub AnalyzeDB(ByVal dbFileName As String, ByVal dbFileStructReport
String)
Dim db As Database
Dim f As Integer
Dim i As Integer
Dim tblDefs As TableDefs
Dim tblDef As TableDef
Dim nbTable As Long
Dim colFields As Fields
Dim aField As Field
If Not FileExists(dbFileName) Then
MsgBox dbFileName & " : Chemin invalide.", vbCritical, "Erreur"
Exit Sub
End If
' ouverture du fichier de rapport
f = FreeFile
Open dbFileStructReport For Output As #f
' Ouverture de la base
Set db = OpenDatabase(dbFileName)
Print #f, "Analyse de la base : " & dbFileName
Print #f, ""
' Analyse des tables
' ------------------
Print #f, "Analyse des Tables"
Print #f, "------------------"
Print #f, ""
' On récupère la collection des Tables
Set tblDefs = db.TableDefs
Print #f, "Nombre de tables : " & tblDefs.Count
' Parcours des tables avec un simple for each
For Each tblDef In tblDefs
nbTable = nbTable + 1
Print #f, "Table " & nbTable & " : " & tblDef.Name;
' Détection des tables système
If (tblDef.Attributes And dbSystemObject) Then
Print #f, " - (table système)"
Else
Print #f, ""
End If
' Détail des tables non système
If (tblDef.Attributes And dbSystemObject) Then
' rien
Else
' décommenter pour voir le détail - traitement assez long
' la seule propriété intéressante potentiellement est
"SourceTableName" (tables liées)
'For i = 0 To tblDef.Properties.Count - 1
' If tblDef.Properties(i).Type <> 11 Then
' Print #f, tblDef.Properties(i).Name & "=" &
tblDef.Properties(i).Value
' End If
'Next i
End If
If (tblDef.Attributes And dbSystemObject) Then
' rien à faire
Else
' détail des champs pour les tables non système
Print #f, "-------------------------------"
Print #f, "Fields : "
' obligatoire car toutes les propriétés ne sont pas définies
On Error Resume Next
Set colField = tblDef.Fields
For Each aField In colField
For i = 0 To aField.Properties.Count - 1
Print #f, aField.Properties(i).Name & "=" &
aField.Properties(i).Value
Next i
Print #f, "-------------------------------"
Next
End If
Next
' fermeture de la base
db.Close
Set db = Nothing
' fermeture du fichier
Close #f
End Sub
Pour l'appeler:
Private Sub Command2_Click()
Call AnalyzeDB("C:JMDvpmtVBstructdbexemple.mdb",
"C:JMDvpmtVBstructdbexemple.txt")
ShellExecute Me.hwnd, "open", "C:JMDvpmtVBstructdbexemple.txt",
vbNullString, "C:", SW_SHOWNORMAL
End Sub
Les indexes se lisent de façon similaire. Il y a des subtilités
pour par exemple la définition des clés priamires, mais c'est assez
Bon c'est sommaire, mais ça donne déjà des pistes.
Note que tu peux accéder aux propriétés directement par leur nom.
Par exemple, le nom d'un field est accessible directement par:
afield.Name
le type par: afield.Type
etc.
les principales caractèristiques d'un champ, permettant de le reconstruire
sont une combinaison
de Type/attribute/Size. Voir l'aide de ces 3 propriétés.
Pour la partie 2, le plus simple et le plus facile est de construire
du SQL à partir des infos des tables, index, relations.
En effet, il suffit alors de faire exécuter ce SQL sur une base
nouvellement créée pour reconstruire toute la base.
note: c'est comme ça qu'on fait dans toutes les applications
pro ou on doit utiliser des DB: on donne simplement au DBA chargé
de l'installation les fichiers SQL qu'il doit exécuter, et toute
la base est créée.
Une doc indispensable à lire pour le SQL d'Access:
http://msdn2.microsoft.com/en-us/library/aa140015(office.10).aspx
En pratique, voici par exemple un bout de code qui créé une base, et
quelques champs.
Tu peux le faire tourner tel quel:
Private Sub Command1_Click()
Dim mydb As DAO.Database
Dim szSQL As String
Kill "c:essai.mdb"
Set mydb = CreateDatabase("c:essai.mdb", dbLangGeneral)
szSQL = ""
szSQL = szSQL & "CREATE TABLE MATABLE ( " & vbCrLf
szSQL = szSQL & "CHAMP1 TEXT(50) , " & vbCrLf
szSQL = szSQL & "MEMO1 MEMO , " & vbCrLf
szSQL = szSQL & "FLDOCTET BYTE , " & vbCrLf
szSQL = szSQL & "FLDENTIER SMALLINT , " & vbCrLf
szSQL = szSQL & "FLDENTIERLNG INTEGER , " & vbCrLf
szSQL = szSQL & "FLDREELSIMPL REAL , " & vbCrLf
szSQL = szSQL & "FLDREELDOUBL FLOAT , " & vbCrLf
szSQL = szSQL & "FLDDATEHOUR DATETIME , " & vbCrLf
szSQL = szSQL & "FLDCURRENCY CURRENCY , " & vbCrLf
szSQL = szSQL & "FLDNUMAUTO COUNTER , " & vbCrLf
szSQL = szSQL & "FLDYESNO YESNO , " & vbCrLf
szSQL = szSQL & "FLDDECIMAL NUMERIC , " & vbCrLf
szSQL = szSQL & "FLDOLE OLEOBJECT " & vbCrLf
szSQL = szSQL & ") " & vbCrLf
'szSQL = szSQL & "FLDDECIMAL DECIMAL(10,5) " & vbCrLf ' ne
passe pas en DAO ??
mydb.Execute (szSQL)
mydb.Close
Set mydb = Nothing
End Sub
Pour lier 1) et 2), il suffit de lire les infos de la base existante et de
générer
dans un fichier ce genre de statement SQL.
Il suffit ensuite de l'exécuter, comme dans l'exemple ci dessus.
C'est un document extrèmement bien fait et complet sur le sujet.
Ca reste concret et une fois ça compris, tu as tout pour faire ce que tu
veux.
Espérant que cela t'aide :-)
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Jean-marc wrote:
> Jean-marc wrote:
>> Driss HANIB wrote:
en complément bis:
Voici un progrramme complet.
Il suffit de modifier la seconde procédure command1_click()
pour faire tourner ça sur une de tes bases. Tu verras qu'avec
ce tout petit code, tu peux déjà sauver les tables et générer
le SQL pour recréer une base copie.
Il reste à compléter pour récupérer les index et les
contraintes, etc.
Il suffit alors de générer les qq ALTER TABLE nécessaires pour
fabriquer les index et clés primaires. C'est idiqué dans les liens
de mes posts précédents.
Bref, assez parlé, voici le code:
Private Sub buildSQLFromDb(ByVal DBFileName As String, _
ByRef sqlScript As String)
Dim db As Database
Dim tb As TableDef
Dim fd As Field
Dim fieldName As String
Dim fieldType As String
Dim szSQL As String
Dim p As Long
Set db = OpenDatabase(DBFileName)
For Each tb In db.TableDefs
If (tb.Attributes And dbSystemObject) = 0 Then
szSQL = szSQL & "CREATE TABLE " & tb.Name & " ( " & vbCrLf
For Each fd In tb.Fields
fieldName = fd.Name
Select Case fd.Type
Case 1
fieldType = "YESNO"
Case 2
fieldType = "BYTE"
Case 3
fieldType = "SMALLINT"
Case 4
If fd.Attributes = 1 Then
fieldType = "INTEGER"
ElseIf fd.Attributes = 17 Then
fieldType = "COUNTER"
Else
' unforeseen
fieldType = "INTEGER"
End If
Case 5
fieldType = "CURRENCY"
Case 6
fieldType = "REAL"
Case 7
fieldType = "FLOAT"
Case 8
fieldType = "DATETIME"
Case 10
fieldType = "TEXT(" & fd.Size & ")"
Case 11
fieldType = "OLEOBJECT"
Case 12
If fd.Attributes = 2 Then
fieldType = "MEMO"
ElseIf fd.Attributes = 32770 Then
' Hyperlink ? SQL ??
fieldType = "MEMO"
Else
' unforeseen
fieldType = "MEMO"
End If
Case 15
'numrep ?? - assume float
fieldType = "FLOAT"
Case 20
fieldType = "NUMERIC"
Case Else
' here we should log something ...
fieldType = "NUMERIC"
End Select
szSQL = szSQL & fieldName & " " & fieldType & "," & vbCrLf
Next
p = InStrRev(szSQL, ",")
Mid$(szSQL, p, 1) = " "
szSQL = szSQL & ");" & vbCrLf
End If
Next
sqlScript = szSQL
db.Close
Set db = Nothing
End Sub
Private Sub Command1_Click()
Dim sqlScript As String
Dim mydb As DAO.Database
Dim t() As String
Dim i As Integer
Call buildSQLFromDb("C:JMDvpmtVBbibliobiblio.mdb", sqlScript)
Kill "c:essai.mdb"
Set mydb = CreateDatabase("c:essai.mdb", dbLangGeneral)
t() = Split(sqlScript, ";")
For i = LBound(t()) To UBound(t()) - 1
mydb.Execute (t(i))
Next i
mydb.Close
Set mydb = Nothing
End Sub
Le principe:
buildSQLFromDb prend une base en parametre, l'ouvre, scanne les tables et
fabrique les CREATE TABLE en conséquence.
Le tout est fabrique dans la variable sqlScript, qu'il suffirait de
sauvegarder
dans un fichier pour avoir une sauvegarde de la structure de la base.
Chaque CREATE TABLE se termine par un ";"
Comme jet ne sait pas exécuter directement les statements multiples,
on split et on les passe un par un à Execute.
Pour la petite histoire, tu peux même sauvegarder des données comme cela,
ou créer des valeurs d'initialisation.
Il suffit de générer des "INSERT" statements et le tour est joué.
C'est aussi expliqué dans les liens précédents.
j'arrete la, tu as normalement matière à quelques heures de lecture
et tests en tous genres :-)
Bonne prog !
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Jean-marc wrote:
> Jean-marc wrote:
>> Driss HANIB wrote:
en complément bis:
Voici un progrramme complet.
Il suffit de modifier la seconde procédure command1_click()
pour faire tourner ça sur une de tes bases. Tu verras qu'avec
ce tout petit code, tu peux déjà sauver les tables et générer
le SQL pour recréer une base copie.
Il reste à compléter pour récupérer les index et les
contraintes, etc.
Il suffit alors de générer les qq ALTER TABLE nécessaires pour
fabriquer les index et clés primaires. C'est idiqué dans les liens
de mes posts précédents.
Bref, assez parlé, voici le code:
Private Sub buildSQLFromDb(ByVal DBFileName As String, _
ByRef sqlScript As String)
Dim db As Database
Dim tb As TableDef
Dim fd As Field
Dim fieldName As String
Dim fieldType As String
Dim szSQL As String
Dim p As Long
Set db = OpenDatabase(DBFileName)
For Each tb In db.TableDefs
If (tb.Attributes And dbSystemObject) = 0 Then
szSQL = szSQL & "CREATE TABLE " & tb.Name & " ( " & vbCrLf
For Each fd In tb.Fields
fieldName = fd.Name
Select Case fd.Type
Case 1
fieldType = "YESNO"
Case 2
fieldType = "BYTE"
Case 3
fieldType = "SMALLINT"
Case 4
If fd.Attributes = 1 Then
fieldType = "INTEGER"
ElseIf fd.Attributes = 17 Then
fieldType = "COUNTER"
Else
' unforeseen
fieldType = "INTEGER"
End If
Case 5
fieldType = "CURRENCY"
Case 6
fieldType = "REAL"
Case 7
fieldType = "FLOAT"
Case 8
fieldType = "DATETIME"
Case 10
fieldType = "TEXT(" & fd.Size & ")"
Case 11
fieldType = "OLEOBJECT"
Case 12
If fd.Attributes = 2 Then
fieldType = "MEMO"
ElseIf fd.Attributes = 32770 Then
' Hyperlink ? SQL ??
fieldType = "MEMO"
Else
' unforeseen
fieldType = "MEMO"
End If
Case 15
'numrep ?? - assume float
fieldType = "FLOAT"
Case 20
fieldType = "NUMERIC"
Case Else
' here we should log something ...
fieldType = "NUMERIC"
End Select
szSQL = szSQL & fieldName & " " & fieldType & "," & vbCrLf
Next
p = InStrRev(szSQL, ",")
Mid$(szSQL, p, 1) = " "
szSQL = szSQL & ");" & vbCrLf
End If
Next
sqlScript = szSQL
db.Close
Set db = Nothing
End Sub
Private Sub Command1_Click()
Dim sqlScript As String
Dim mydb As DAO.Database
Dim t() As String
Dim i As Integer
Call buildSQLFromDb("C:JMDvpmtVBbibliobiblio.mdb", sqlScript)
Kill "c:essai.mdb"
Set mydb = CreateDatabase("c:essai.mdb", dbLangGeneral)
t() = Split(sqlScript, ";")
For i = LBound(t()) To UBound(t()) - 1
mydb.Execute (t(i))
Next i
mydb.Close
Set mydb = Nothing
End Sub
Le principe:
buildSQLFromDb prend une base en parametre, l'ouvre, scanne les tables et
fabrique les CREATE TABLE en conséquence.
Le tout est fabrique dans la variable sqlScript, qu'il suffirait de
sauvegarder
dans un fichier pour avoir une sauvegarde de la structure de la base.
Chaque CREATE TABLE se termine par un ";"
Comme jet ne sait pas exécuter directement les statements multiples,
on split et on les passe un par un à Execute.
Pour la petite histoire, tu peux même sauvegarder des données comme cela,
ou créer des valeurs d'initialisation.
Il suffit de générer des "INSERT" statements et le tour est joué.
C'est aussi expliqué dans les liens précédents.
j'arrete la, tu as normalement matière à quelques heures de lecture
et tests en tous genres :-)
Bonne prog !
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ; _no_spam_jean_marc_n2@yahoo.fr
FAQ VB: http://faq.vb.free.fr/
Jean-marc wrote:
> Jean-marc wrote:
>> Driss HANIB wrote:
en complément bis:
Voici un progrramme complet.
Il suffit de modifier la seconde procédure command1_click()
pour faire tourner ça sur une de tes bases. Tu verras qu'avec
ce tout petit code, tu peux déjà sauver les tables et générer
le SQL pour recréer une base copie.
Il reste à compléter pour récupérer les index et les
contraintes, etc.
Il suffit alors de générer les qq ALTER TABLE nécessaires pour
fabriquer les index et clés primaires. C'est idiqué dans les liens
de mes posts précédents.
Bref, assez parlé, voici le code:
Private Sub buildSQLFromDb(ByVal DBFileName As String, _
ByRef sqlScript As String)
Dim db As Database
Dim tb As TableDef
Dim fd As Field
Dim fieldName As String
Dim fieldType As String
Dim szSQL As String
Dim p As Long
Set db = OpenDatabase(DBFileName)
For Each tb In db.TableDefs
If (tb.Attributes And dbSystemObject) = 0 Then
szSQL = szSQL & "CREATE TABLE " & tb.Name & " ( " & vbCrLf
For Each fd In tb.Fields
fieldName = fd.Name
Select Case fd.Type
Case 1
fieldType = "YESNO"
Case 2
fieldType = "BYTE"
Case 3
fieldType = "SMALLINT"
Case 4
If fd.Attributes = 1 Then
fieldType = "INTEGER"
ElseIf fd.Attributes = 17 Then
fieldType = "COUNTER"
Else
' unforeseen
fieldType = "INTEGER"
End If
Case 5
fieldType = "CURRENCY"
Case 6
fieldType = "REAL"
Case 7
fieldType = "FLOAT"
Case 8
fieldType = "DATETIME"
Case 10
fieldType = "TEXT(" & fd.Size & ")"
Case 11
fieldType = "OLEOBJECT"
Case 12
If fd.Attributes = 2 Then
fieldType = "MEMO"
ElseIf fd.Attributes = 32770 Then
' Hyperlink ? SQL ??
fieldType = "MEMO"
Else
' unforeseen
fieldType = "MEMO"
End If
Case 15
'numrep ?? - assume float
fieldType = "FLOAT"
Case 20
fieldType = "NUMERIC"
Case Else
' here we should log something ...
fieldType = "NUMERIC"
End Select
szSQL = szSQL & fieldName & " " & fieldType & "," & vbCrLf
Next
p = InStrRev(szSQL, ",")
Mid$(szSQL, p, 1) = " "
szSQL = szSQL & ");" & vbCrLf
End If
Next
sqlScript = szSQL
db.Close
Set db = Nothing
End Sub
Private Sub Command1_Click()
Dim sqlScript As String
Dim mydb As DAO.Database
Dim t() As String
Dim i As Integer
Call buildSQLFromDb("C:JMDvpmtVBbibliobiblio.mdb", sqlScript)
Kill "c:essai.mdb"
Set mydb = CreateDatabase("c:essai.mdb", dbLangGeneral)
t() = Split(sqlScript, ";")
For i = LBound(t()) To UBound(t()) - 1
mydb.Execute (t(i))
Next i
mydb.Close
Set mydb = Nothing
End Sub
Le principe:
buildSQLFromDb prend une base en parametre, l'ouvre, scanne les tables et
fabrique les CREATE TABLE en conséquence.
Le tout est fabrique dans la variable sqlScript, qu'il suffirait de
sauvegarder
dans un fichier pour avoir une sauvegarde de la structure de la base.
Chaque CREATE TABLE se termine par un ";"
Comme jet ne sait pas exécuter directement les statements multiples,
on split et on les passe un par un à Execute.
Pour la petite histoire, tu peux même sauvegarder des données comme cela,
ou créer des valeurs d'initialisation.
Il suffit de générer des "INSERT" statements et le tour est joué.
C'est aussi expliqué dans les liens précédents.
j'arrete la, tu as normalement matière à quelques heures de lecture
et tests en tous genres :-)
Bonne prog !
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
On Mon, 25 Jun 2007 08:48:23 +0200, "Driss HANIB"
wrote:
>merci Jean-Marc,
>
>j'attends avec impatience tes pistes.
>Effectivement le format SQL me plait bien, mais pour l'instant je ne
>maitrise pas encore ce langage, puis que la plupart du temps j'utilise
>requêtes précompilées dasn mes bases de données.
>mai cela m'interesse à double titre : je pense aussi tester MySQL, peut
>dans un premier temps par VB..
>Driss
Une alternative possible : utiliser un outil de modélisation de type
Toad Data Modeler (on doit trouver une version free - avec quelques
limitations genre 20 tables maximum sur le site de Quest -
http://www.quest.com/)
Tu modélises graphiquement ta base et tu généres ensuite le script sql
à la demande pour les bases de données les plus courantes.
On Mon, 25 Jun 2007 08:48:23 +0200, "Driss HANIB"
<dhanib@club-internet.fr> wrote:
>merci Jean-Marc,
>
>j'attends avec impatience tes pistes.
>Effectivement le format SQL me plait bien, mais pour l'instant je ne
>maitrise pas encore ce langage, puis que la plupart du temps j'utilise
>requêtes précompilées dasn mes bases de données.
>mai cela m'interesse à double titre : je pense aussi tester MySQL, peut
>dans un premier temps par VB..
>Driss
Une alternative possible : utiliser un outil de modélisation de type
Toad Data Modeler (on doit trouver une version free - avec quelques
limitations genre 20 tables maximum sur le site de Quest -
http://www.quest.com/)
Tu modélises graphiquement ta base et tu généres ensuite le script sql
à la demande pour les bases de données les plus courantes.
On Mon, 25 Jun 2007 08:48:23 +0200, "Driss HANIB"
wrote:
>merci Jean-Marc,
>
>j'attends avec impatience tes pistes.
>Effectivement le format SQL me plait bien, mais pour l'instant je ne
>maitrise pas encore ce langage, puis que la plupart du temps j'utilise
>requêtes précompilées dasn mes bases de données.
>mai cela m'interesse à double titre : je pense aussi tester MySQL, peut
>dans un premier temps par VB..
>Driss
Une alternative possible : utiliser un outil de modélisation de type
Toad Data Modeler (on doit trouver une version free - avec quelques
limitations genre 20 tables maximum sur le site de Quest -
http://www.quest.com/)
Tu modélises graphiquement ta base et tu généres ensuite le script sql
à la demande pour les bases de données les plus courantes.