Décrypter et enregistrer structure base de données

Le
Driss HANIB
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jean-Marc
Le #15398861
On 22 juin, 16:54, "Driss HANIB"
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



Hello Driss,

Ce n'est pas très compliqué et on peut tout faire en DAO.
Je suis loin de chez moi en ce moment, mais je pourrais d'ici un jour
ou 2 t'envoyer des infos sur le sujet (c'est tout simple en fait).

Pour la sauvegarde, rien de plus simple.
A mon avis, la meilleure solution est simplement de générer toute
la création en SQL: c'est standard, assez portable, c'est du pur
texte,
dans un format connu et reconnu.

Qui plus est tu peux donner le fichier contenenant les statement SQL
à n'importe qui et il sait reconstruire la base sans outils
particuliers,
avec n'importe quelle techno (ADO/DAO/ autre).

Tout le challenge est de générer le SQL à partir des infos des
tables,
mais ce n'est pas dur (sauf cas très particuliers ou si tu utilises
vraiment
des trucs hyper tordus d'Access).

Bien sur, tu peux aussi décider de faire ton propre format décrivant
la
structure, mais ça imposera alors d'utilise obligatoirement ton
programme
de reconstruction (ce qui peut être ce que tu souhaites).

Bon WE,

--
Jean-marc
Driss HANIB
Le #15398851
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
"Jean-Marc" news:
On 22 juin, 16:54, "Driss HANIB"
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



Hello Driss,

Ce n'est pas très compliqué et on peut tout faire en DAO.
Je suis loin de chez moi en ce moment, mais je pourrais d'ici un jour
ou 2 t'envoyer des infos sur le sujet (c'est tout simple en fait).

Pour la sauvegarde, rien de plus simple.
A mon avis, la meilleure solution est simplement de générer toute
la création en SQL: c'est standard, assez portable, c'est du pur
texte,
dans un format connu et reconnu.

Qui plus est tu peux donner le fichier contenenant les statement SQL
à n'importe qui et il sait reconstruire la base sans outils
particuliers,
avec n'importe quelle techno (ADO/DAO/ autre).

Tout le challenge est de générer le SQL à partir des infos des
tables,
mais ce n'est pas dur (sauf cas très particuliers ou si tu utilises
vraiment
des trucs hyper tordus d'Access).

Bien sur, tu peux aussi décider de faire ton propre format décrivant
la
structure, mais ça imposera alors d'utilise obligatoirement ton
programme
de reconstruction (ce qui peut être ce que tu souhaites).

Bon WE,

--
Jean-marc
Jean-marc
Le #15398831
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,

Je ne t'oublie pas, loin de la !

J'essaie de te faire un truc un peu propre pour expliquer
toit cela. C'est un domaine très intéressant, mais très riche!

Si ca dépasse le cadre d'une réponse, je mettrais un lien vers
une petite page web.

Je pense poster qq chose ici même d'ici peu :-)


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Jean-marc
Le #15398741
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 projet.


Public Sub AnalyzeDB(ByVal dbFileName As String, ByVal dbFileStructReport As
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 simple.


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 ajoute
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
Le #15398681
Jean-marc wrote:
Driss HANIB wrote:



en complément,

ACC: Create and Drop Tables and Relationships Using SQL DDL
http://support.microsoft.com/kb/116145/en-us

Attributs pour tableDef
http://support.microsoft.com/kb/210362/fr


--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Jean-marc
Le #15398671
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/
parci
Le #15398661
On Mon, 25 Jun 2007 08:48:23 +0200, "Driss HANIB"

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



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.
Driss HANIB
Le #15398341
Jean Marc,

après quelques jour d'absence , je viens de télecharger ton fichier d'aide..
je continue de lire tes mails..
En fait je n'ai pas de MSDN installé..

Merci

Driss
"Jean-marc" de news:4680e3e9$0$13858$
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


projet.


Public Sub AnalyzeDB(ByVal dbFileName As String, ByVal dbFileStructReport


As
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


simple.


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


ajoute
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
Le #15398331
Merci Jean Marc

je vois effectivement qu'il y a de la lecture dans l'air ;o))
en tout merci pour tes exemples très fournis qui seront une bonne base poue
la compréhension.

Driss
"Jean-marc" de news:4681705a$0$13858$
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/





Driss HANIB
Le #15398321
Merci Parci

pour ce petit lien que je vais de ce pas consulter.
Cela me permettra déjà de mieux créer ce que je veux. en complément de
l'approche complètement VB

Driss

"parci" news:
On Mon, 25 Jun 2007 08:48:23 +0200, "Driss HANIB"

>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

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.



Publicité
Poster une réponse
Anonyme