Quel choix de base de données ?

Résolu
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012 - 4 août 2012 à 16:34
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012 - 7 août 2012 à 12:04
Bonjour la communauté,

Je dois me lancer dans la gestion de base de données. Je n'y connais absolument rien dans ce domaine, et reste perdu dans le choix : DAO, ADO, SQL ou mySLQL... au autres.
En fait, j'ai écrit un lecteur pour mes chansons, j'affiche ces dernières soit par le nom de fichier même, soit par leur tag ID3v2. Mais ça devient trop long avec ma collection de musique grandissante. Et je dois donc faire le grand pas d'utiliser une base de données.
En plus, je distribue le programme en freeware, alors je ne voudrais pas imposer aux personnes d'installer un serveur complet qui prendrait plusieurs dizaines de Mo.

Bref, je cherche une DB qui puisse être gérée entièrement en VB6, compatible depuis Win XP jusqu'à Win 7, et pas trop lourde. Celà existe t-il au moins?

Merci pour vos réponses :)
titicar

14 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
4 août 2012 à 18:08
Salut Titi

Sous VB6, il n'y a que ADO qui fonctionne correctement (DAO étant obsolète).
- ADODC (composant COM) si tu veux utiliser l'interface de navigation dans les enregistrements
- ADODB (simple référence) si tu veux gérer ta base sans interface graphique (que tu créeras toi même)

Ensuite, il faut choisir un fournisseur de DB.
Du moment qu'ils répondent à la norme de langage SQL, ils sont tous utilisables, il n'y a que la chaine de connexion qui changera.
Donc, même si tu pars avec du mySQL et que tu veux basculer sous Access, rien de plus simple : juste la chaine de connexion à modifier; les Recordsets nécessaires au filtrage des données resteront compatibles.
Seul impératif : Rester dans le standard du langage SQL :
mySQL comme Access acceptent le SQL de base, mais ils ajoutent aussi des fonctionnalités à ce langage et celles-ci n'ont pas d'équivalences inter-logiciel. Méfiance donc.

Ton choix va aussi se baser sur la lourdeur du serveur.
Là, il n'y a pas photo, seul les bases de données de Access (fichiers MDB) permettent d'être utilisées sans avoir Access, n'est qu'un outil permettant de créer et gérer des bases de données.
Donc, à part toi, le créateur du logiciel qui aura surement besoin de cet outil pour créer et paramétrer tes tables, tu fourniras à tes utilisateurs un fichier MDB avec ton programme VB6 qui n'aura pas besoin de Access pour fonctionner.

Ensuite, avec ce choix, viennent les capacités des bases.
Pour l'exemple, les fichiers MDB ne peuvent pas dépasser ~2 Go, ou 32768 objets, etc.
Ca parait grand, mais selon l'utilisation, ça peut gêner.
mySQL a surement aussi des limites - à vérifier.

Il me semble que SQL Server Express pourrait aussi faire l'affaire : Gratuit, plus moderne que Access et surement moins de limitations mais nécessite une installation.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 août 2012 à 16:44
Vérifie, mais il me semble que ADO est systématiquement installé sous XP/W7 :
Program files/Common Files/System/ado/
ou "Program files (x86)" sous W7-64
3
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
4 août 2012 à 21:37
Salut Jack et merci pour ta réponse rapide.

Ok, faut donc que je choisisse ADO. Et vu qu'une simple référence me suffira (je compte tout afficher depuis un TView et LView vu que c'est ce que j'utilise en ce moment avec mon prog), alors je choisi ADODB (que je ne connais absolument pas, comme tout le reste lol).

S'il n'y a pas photo quand à la lourdeur du serveur, alors je choisi Access.

Pour la capacité, je ne pense pas pouvoir dépasser une limite quelconque :)

Par contre, je suis effectivement aussi tombé sur SQL Serveur Express dans mes recherches. J'ai vu
- une v2008 (http://www.microsoft.com/fr-fr/download/details.aspx?id=1695) compatible entre autre avec win Xp, vista, mais pas 7.
- une v2012 (http://www.microsoft.com/fr-fr/download/details.aspx?id=29062) compatible Win Vista, 7, mais pas XP.

La v2008 est-elle redistribuable (en tant que composants) avec un utilisateur sous Win 7? Je suppose que oui, mais des fois je me méfie des compatibilités des produits MS.
J'ai aussi un peu peur des proportions que peuvent utiliser les composants nécessaires à une distribution avec ce SQL Serveur Express. Mais je peux me tromper vu que je n'ai pas encore essayé.

Et vu que je n'ai encore rien essayé d'un point de vu DB, j'ai encore du pain sur la planche. Dommage, je venais de trouver un super tuto qui explique depuis le début (parfait pour moi) une base DAO. Je n'ai plus qu'à trouver le même genre pour l'ADO.

Merci encore ;)
titicar
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 août 2012 à 00:19
Tu verras, en lisant des sources qui parlent ou utilisent ADODB, que ce n'est pas plus compliqué que DAO, ça y ressemble beaucoup d'ailleurs.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 août 2012 à 00:37
Pour la référence à ADODB :
Menu Projet + Références + "Microsoft ActiveX Data Objects 2.8 Library"

Pour l'utiliser, simple :
    Dim oConn   As ADODB.Connection
    Dim oRS     As ADODB.Recordset
    Dim sSQL    As String
    
    Set oConn = New ADODB.Connection
    With oConn
        ' La chaine de connexion
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                            "Persist Security Info=False;" & _
                            "Data Source=monFichier.MDB"
        .Open
        Do While .State = adStateConnecting
            DoEvents
        Loop
        If .State <> adStateOpen Then
            MsgBox "Pas de connexion"
            Exit Sub
        End If
    End With
    
    Set oRS = New ADODB.Recordset
    With oRS
        ' Ta requète SQL
        sSQL = "Select * From maTable"
        ' L'exécution
        .CursorLocation = adUseClient
        .Open sSQL, oConn, adOpenStatic, adLockReadOnly
        ' La récupération des données
        If .RecordCount > 0 Then
            .MoveFirst
            Do While Not .EOF
                DoEvents
                Debug.Print .Fields(0).Value
                .MoveNext
            Loop
        End If
    End With
    oRS.Close
    oConn.Close
Avec la chaine de connexion qui va bien avec la DB que tu auras choisie.
Voir dans les exemples dispos sur vbfrance ou sur ce site de référence en ConnectionString : http://www.connectionstrings.com/

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
5 août 2012 à 00:39
ou, à la place de
Debug.Print .Fields(0).Value
tu peux aussi utiliser cette syntaxe :
Debug.Print .Fields("LeNomDuChamp").Value
0
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
5 août 2012 à 10:59
Merci pour tout

titicar
0
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
5 août 2012 à 22:54
Au fur et à mesure de mes lectures quant à ADO, et en voyant la 'précision' (ou la complexité) de paramètres du genre:
myRecordSet.ActiveConnection = myADODB
myRecordSet.CursorLocation = adUseClient
myRecordSet.Open , , adOpenStatic, adLockBatchOptimistic, ...

, et j'en passe...
je me dis qu'ADO est une rolls pour mon appli : je n'ai pas besoin de tout ça quand même.
Et puis ce luxe a aussi un prix : au moins 6 nouvelle DLL et autres à installer dans l'empaquetage, sachant que j’essaie d'éliminer (au maximum... ou presque) ces genres de fichiers qui rendent hélas mon programme encore un peu plus dépendant.

En fait, j'ai un souvenir trop vague hélas, d'API simples (sans DLL ou autres) exploitant une DB (peut-être une DB allégée, mais pas du INI, XML ou autre genre évidemment).
J'avais lu cette source sur vbfrance il y a trop longtemps (entre 2004 et 2009... pour dire que c'est flou), sans pour autant avoir sauvegarder le code ou le tester. Et impossible de remettre la main dessus. Dommage

titicar
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 août 2012 à 12:08
6 DLLs ?
Non, une seule et en plus, elle existe déjà sur XP et W7.
Les fichiers TLB n'ont pas besoin de faire partie du paquetage : il ne s'agit que d'un annuaire permettant de programmer (pour que les objets soient reconnus par l'interface de programmation=IDE quand tu commences à taper leurs noms, méthodes ou propriétés) et de s'adresser à la DLL.

myRecordSet.ActiveConnection = myADODB
est accessoire.
Le nom de l'objet de connexion peut simplement être inséré dans le 2ème paramètre de la commande .Open du RecordSet.
Côté constantes de la commande .Open du RecordSet, il faut bien les choisir car le comportement du RecordSet en dépend.
Si tu ne fais pas de Transaction, utilises adLockOptimistic ou adLockReadOnly pour le dernier paramètre.

Je t'assure que l'utilisation de ADODB n'est pas compliquée, juste les paramètres à répéter après chaque instanciation d'un RecordSet, comme dans l'exemple de base que je t'ai fourni.
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
6 août 2012 à 12:18
PS : "elle existe déjà sur XP"
A vérifier, mais si ton XP est à jour, cela devrait être Ok.
La dernière version de ADO est la 2.8, mais les précédentes versions marchent aussi bien.
0
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
6 août 2012 à 15:03
Oups, les 6 DLL correspondait à un projet DAO. Je me suis trompé.
Par contre avec mon début de projet ADO, l'empaquetage prend 1 seul fichier supplémentaire : MDAC_TYP.exe qui prend plus de 6Mo à lui tout seul :(
En double-cliquant sur ce fichier, je m'aperçois que c'est un 'installeur' pour Microsoft Data Access Componment v2.0.
Sommes-nous obligé d'inclure ce fichier?

titicar
0
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
6 août 2012 à 18:23
Bien joué et merci
En effet, j'ai ado sur Vista, sans avoir installer l'environnement VB6 (je programme sous XP) ou MS Access.
Pour en avoir le coeur net, j'ai lancé sous Vista l'EXE de mon 'début de projet ADO' sans l'installer. Et ça marche.
Comme quoi, pas besoin du MDAC_TYP.exe.

Voilà, je n'ai plus aucune excuse pour ne pas me lancer dans ADO, et dans le fonctionnement d'une DB en général. Je ne sais même pas ce qu'est une table. Mais y a pas d'âge pour apprendre lol.
0
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
6 août 2012 à 23:33
Va falloir que je migre mes futures questions dans la section ADO, mais j'ai encore 2 questions... Oui, j'abuse un peu car tu m'as déjà bien aidé.

1) Je vois souvent en exemple dans un RecordSet que la fonction associée ouvre une nouvelle connexion à la DB. Pour ma part (et par simplicité), je considère qu'une connexion à cette DB commence au début du programme, et se termine à la fin du programme (quand l'appli est fermée). Est-ce critique de garder une connexion active durant tout une session du programme?

2) Ca se complique... J'arrive ouvrir une table, mais juste 'en brut' (donc en connaissance du nom de la table). Idem pour les différents champs associées à une table : je les écris en brut ne sachant pas comment les récupérer.
Voici un code source. J'ai pris comme exemple, le fameux BIBLIO.MDB livré avec VB6.

Global MaCon As ADODB.Connection 'En global car UN SEUL fichier MDB traité en même temps _
    , mais changement de DB possible, donc pas de constante
    '!!! Exemple pris=BIBLIO.MDB très connu du Visual Studio
Global GlobFichier_MDB As String
'
Public Function Con_Ouvre(ByVal NomFichierEntierMDB As String) As Long
'! A appeler au démarrage du programe
'! Function As Long (au lieu de Sub) pour un retour futur d'erreur

    'If MaCon.State = adStateOpen Then MaCon.Close 'Error 91 si non Open avant
    
    '# Avant d'ouvrir une nouvelle connexion, on réinitialise:
    '# (En s'assurant que l'ancienne connexion est déjà fermée!)
    Set MaCon = Nothing
    Set MaCon = New ADODB.Connection
    
    '# Nouvelle chaine de connexion:
    With MaCon
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
                            "Persist Security Info=False;" & _
                            "Data Source=" & NomFichierEntierMDB '! Pour le moment BIBLIO.MDB que l'on trouve partout:)
        .Open
        Do While .State = adStateConnecting
            DoEvents
        Loop
        If .State <> adStateOpen Then
            MsgBox "Pas de connexion"
            Exit Function
        End If
    End With
End Function

Public Sub Con_Ferme()
'! A ajouter dans Main.frm\Unload, ou avant la fin du programme
    MaCon.Close '! Error 91 si non Open
    Set MaCon = Nothing
End Sub

Public Function LV_Affiche_Table(myLV As ListView, myTable As String) As Long
'! Function As Long (au lieu de Sub) pour un retour futur d'erreur
'[Problème1] : myTable=Authors uniquement car je ne sais pas comment récupérer les différents _
    champs d'une table sous ADODB
Dim myRs As ADODB.Recordset
Dim sSQL As String 'Je l'aurais bien appelé mySQL, mais ça peut prêter confusion lol

    '# Requête:
    '----------
    Set myRs = New ADODB.Recordset
    'myRs.Open "select * from " & myTable, MaCon, adOpenDynamic, adLockOptimistic
    '! myRs.Open Source, ActiveConnection, CursorType, LockType, Options
    With myRs
        '# Requète SQL
        sSQL = "Select * From " & myTable
        '# L'exécution
        .CursorLocation = adUseClient
        .Open sSQL, MaCon, adOpenStatic, adLockReadOnly
    End With
    
'    If myRs.BOF And myRs.EOF Then
    If myRs.RecordCount < 1 Then
        MsgBox "Aucun enregistrement"
        GoTo LV_Affiche_Table_Fin
    End If
    
    '# Par précaution après Open:
    'myRs.MoveLast
    myRs.MoveFirst
    

    '# Récupération des données dans myLV:
    '-------------------------------------
Dim i As Integer, x As Integer
Dim itmX As ListItem

    '# Initilisation EN BRUT des colonnes dans myLV:
'Table : Authors
'   champ : Au_ID
'   champ : Author
'   champ : Year Born
    With myLV
        .ColumnHeaders.Clear
        .ColumnHeaders.Add , , "Au_ID"
        .ColumnHeaders.Add , , "Author"
        .ColumnHeaders.Add , , "Year Born"
    End With
        
    '# Affichage des différents itmX
    Do Until myRs.EOF
        i = i + 1
        Set itmX = myLV.ListItems.Add(i, , myRs.Fields(0))
        For x = 1 To 1
            '[Problème2] J'aurai dû écrire For X=1 To 2 (Year Born), sauf que le champ 'Year Born' est vide _
                , et provoque Erreur d'exécution '94': Utilisation non autorisé de Null
            itmX.SubItems(x) = myRs.Fields(x)
        Next x
        myRs.MoveNext
    Loop

LV_Affiche_Table_Fin:
    Set myRs = Nothing
End Function
0
cs_titicar Messages postés 181 Date d'inscription jeudi 30 mai 2002 Statut Membre Dernière intervention 19 août 2012
7 août 2012 à 12:04
Pour le point 2), j'ai trouvé sur vb.developpez.com.
0
Rejoignez-nous