Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

OPEN ACCESS MDB


Information sur la source

Description

Cliquez pour voir la capture en taille normale
En fait cette source simple permet de dépaner un PC ou il n'y a pas Access et sur lequel on a besoin de travailler avec, vu que sous Linux OpenOffice n'ouvre pas les base de donnée .MDB, j'ai eu cet idée de développer ce petit programme permettant d'éxecuter des requêtes SQL sur des bases de donnée MDB, de les parcourir selon leurs tables ainsi que d'ajouter des tables.
 

Source

  • Public Function Download(Zip as Zip)
  • 'Telechargement du zip
  • ...
  • End Function
Public Function Download(Zip as Zip)
  'Telechargement du zip
  ...
End Function

Conclusion

Ce programme montre une utilisation simple de DAO comme le listage de champs ou de tables, l'utilisation de ADO pour éxecuter une requête ainsi que l'utilisation du composant ADODC.

Enfin tous vos commentaires sont les bienvenus et n'hésitez pas à noter ce programme ainsi que de me faire parts des différents bug et eventuels problèmes que vous rencotrés, Bonne Prog :)
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de PCPT le 06/08/2008 10:32:49 administrateur CS

salut,

pourquoi avoir choisi DAO?
ADO est plus approprié et ne nécessite pas non plus d'avoir Access sur sa machine, juste le MDAC

signaler à un administrateur
Commentaire de MALIKcpp le 06/08/2008 10:38:09

Bonjour, >> PCPT

En fait vu que je n'avait pas trouvé de solution pour lister les tables en ADO j'ai utilisé DAO et seulement pour cela sinon les requêtes s'execute en ADO.

Donc je n'ai pas uniquement choisi le DAO mais aussi l'ADO donc c'est un mélange des deux.

signaler à un administrateur
Commentaire de PCPT le 06/08/2008 10:57:11 administrateur CS

beh c'est pas bien ^^

ajoute ADOX : msadox.dll (Microsoft ADO Ext. 2.7 for DLL and Security)

Dim oCat As New ADOX.Catalog
Dim oTab As New ADOX.Table

oCat.ActiveConnection = mCnx 'nom de ta connexion ADO

For Each oTab In oCat.Tables
    If oTab.Type = "TABLE" Then Debug.Print oTab.Name
Next oTab

Set oTab = Nothing
Set oCat = Nothing

signaler à un administrateur
Commentaire de MALIKcpp le 06/08/2008 13:08:16

Merci, pour ton aide, je n'avait pas trouvé cette méthode qui me permet donc de n'utilisé qu'ADO. Encore merci PCPT.

signaler à un administrateur
Commentaire de Patrice99 le 07/08/2008 10:13:33

Et VB6 ça tourne sous Linux ? curieux de voir ça !
Par contre DotNet devrait tourner sous Linux via Mono, voir par exemple :
ODBCDotNet : Extraire des requêtes ODBC dans un tableau de tableaux de String
www.vbfrance.com/code.aspx?ID=34701
Mais le problème, c'est de trouver un pilote ODBC pour Access sous Linux : dans tous les cas de figure, cela ne sera pas évident de lire une base Access sous Linux.

signaler à un administrateur
Commentaire de asimengo le 07/08/2008 11:11:55

Merci PCPT, ceci m'aidera à generaliser mon utilitaire qui recree la structure des bases de données pour mes logiciels. Car avec une instruction du genre call classX.Implement (<Nom Table>), tu as la liste, ajouter/modifier/supprimer/Imprimer, gratoch.

J'avais effectivement comme MalikCPP fait un truc avec DAO et pour des bases autre que Jet je devais migrer sur Access pour lire la structure, mais bien sur après c'est ADO.

Juste une autre question sur ADO, est-ce possible d'utiliser la clause IN avec la propriété Filter d'un ADODB.Recordset. Je me suis crée une syntaxe pour le filtre a..b signifie entre a et b, {a | b | c} signifie IN (a,b,c) mais la clause IN ne marche pas avec filter, il faut passer par SELECT ... Where ...
Je pense que Between ne marche pas aussi avec Filter, je passe pas >= et <=

Espérant une réponse.

signaler à un administrateur
Commentaire de PCPT le 07/08/2008 12:58:37 administrateur CS

Patrice99 -> VB6 n'est pas trop l'ami de Linux, le nom du dossier en est souriant oui :)

asimengo -> pas vérifié mais me semble que IN de toute façon n'est pas connu d'Access (enfin tu me mets le doute maintenant ^^)
quant à filter en général on évite de l'utiliser en parallèle d'une requête déjà restrictive. habitude ou obligation...
je testerai à l'occas.
regarde ADO HELPER dans mes sources, çà peut peut-être te donner quelques pistes
++

signaler à un administrateur
Commentaire de asimengo le 07/08/2008 17:23:38

@PCPT : J'ai regardé ta source ADO HELPER, c'est bien, je passe forcement par là avec les différents DLL que j'utilise pour mes applis qui permettent d'implementer une table d'un provider quelconque.

Je me suis par contre interesser à ta méthode Public Sub LV_ResizeColumns(Lv As ListView) que j'ai essayé de réecrire pour le DataGrid comme suit mais aucun résultat et aucune erreur declenché.

'   *- REDIMENTIONNE UNE LISTVIEW SELON SON CONTENU -*
'      http://www.codyx.org/snippet_redimensionner-colonnes-listview-fonction-leur-contenu_320.aspx
Public Sub DataGrid_ResizeColumns(poDataGrid As DataGrid)
Dim i As Long
    
    If poDataGrid.Columns.Count > 0 Then
        Call LockWindowUpdate(poDataGrid.hwnd)
        For i = 0 To poDataGrid.Columns.Count - 1
            Call SendMessage(poDataGrid.hwnd, LVM_SETCOLUMNWIDTH, i, LVSCW_AUTOSIZE_USEHEADER)
        Next i
        Call LockWindowUpdate(0&)
    End If
    DoEvents
End Sub

Ai-je manquer quelque chose?, ou alors ce n'est pas valable pour le Datagrid. Pour mes listes je préfère mieux le DataGrid parceque je peux lui affecter directement un recordset. Mais l'utilisation du Form qui contient le DataGrid passe par une classe ce qui ressemble bien à ton Public Function FillListViewFromAdoCnx(ByRef CnxAdo As ADODB.Connection, MyLv As ListView, ByVal sSql As String, Optional ByVal bHeader As Boolean = True, Optional ByVal lFirstRow As Long = 1, Optional ByVal lLastRow As Long = 0) As Boolean
A la seule différence que la classe clone le recordset qui sera en mémoire avant d'appeler le form qui a le datagrid. Après je suis tous les mouvements de la lsite à partir du Datagrid, j'utilise les evenements du datagrid pour savoir quand on a clique sur une entête. Le tri est quasic basic juste recordset.sort ..., le filtre sur un champ quasi basik egalement recordset.filter=...

signaler à un administrateur
Commentaire de asimengo le 07/08/2008 17:30:01

Je vais quand même donner le code que j'utilise pour cloner un recordset, il y'a 2 méthodes soit de Recordset à Recordset, soit de Commande à Recordset

'Copie les enregistrements de poRstSource dans poRstDestination
Public Function CloneRecordset(ByVal poRstSource As ADODB.Recordset, ByRef poRstDestination As ADODB.Recordset) As Boolean
On Error GoTo Err_CloneRecordset
Dim oFld As ADODB.Field, vBookmark As Variant

    Set poRstDestination = New ADODB.Recordset
    With poRstDestination
        .CursorLocation = adUseClient
        .CursorType = adOpenDynamic
        .LockType = adLockPessimistic
        'Initialisation de la liste des champs
        For Each oFld In poRstSource.Fields
            .Fields.Append oFld.Name, oFld.Type, oFld.DefinedSize, oFld.Attributes
        Next oFld
        'Ouverture du recordset pour remplissage
        .Open
    End With
    
    'Remplissage du recordset
    'On peut
    With poRstSource
    'On peut aussi faire With poRstSource.Clone(adLockReadOnly), ainsi on ne s'embetera plus avec la gestion des bookmarks.
    'Mais je me suis demandé si ce n'était pas du temps perdu cette méthode, temps de Clone.
    'je ne me suis pas penché dessus pour voir les différences de vitesse.
        If .RecordCount <> 0 Then
            vBookmark = .Bookmark
            .MoveFirst
            Do While Not .EOF
                poRstDestination.AddNew
                For Each oFld In .Fields
                    poRstDestination.Fields(oFld.Name).Value = oFld.Value
                Next oFld
                poRstDestination.Update
                .MoveNext
            Loop
            .Bookmark = vBookmark
            poRstDestination.MoveFirst
        End If
    End With
    
    CloneRecordset = True

Exit_CloneRecordset:
    Exit Function

Err_CloneRecordset:
    MsgBox Err.Description
    Resume Exit_CloneRecordset
End Function

Public Function CloneCommandRecordset(ByVal psCommandText As String, ByVal puConnection, ByRef poRstDestination As ADODB.Recordset) As Boolean
On Error GoTo Err_CloneCommandRecordset
Dim oCnx As ADODB.Connection, oRst As ADODB.Recordset, bCloseConnection As Boolean

    If IsObject(puConnection) Then
        Set oCnx = puConnection
    Else
        Set oCnx = New ADODB.Connection
        oCnx.Open puConnection
        bCloseConnection = True
    End If
    
    Set oRst = New ADODB.Recordset
    With oRst
        .CursorLocation = adUseClient
        .CursorType = adOpenDynamic
        .LockType = adLockPessimistic
        
        .Open psCommandText, oCnx, adOpenStatic
        'Clone le recordset oRst et met le contenu dans poRstDestination
        Call CloneRecordset(oRst, poRstDestination)
        'Ferme le recordset
        .Close
    End With
    CloneCommandRecordset = True

Exit_CloneCommandRecordset:
    Set oRst = Nothing
    If bCloseConnection Then oCnx.Close
    Set oCnx = Nothing
    Exit Function

Err_CloneCommandRecordset:
    MsgBox Err.Description
    Resume Exit_CloneCommandRecordset
End Function

signaler à un administrateur
Commentaire de PCPT le 07/08/2008 17:32:30 administrateur CS

en effet les constantes sont réservées à la listview (LVM_...)
va falloir mesurer la chaine du header ou de chaque items selon ce que tu souhaites faire

signaler à un administrateur
Commentaire de PCPT le 07/08/2008 17:35:21 administrateur CS

euh....
un recordset possède une méthode '.Clone', elle ne te convient pas?

signaler à un administrateur
Commentaire de asimengo le 07/08/2008 17:42:45

Je ne sais pas si je me suis gouré, mais avec mes tests, j'ai constaté que la BD restait verouillée (cas avec Access), le but pour moi étant de minimiser le traffic réseau et d'accelérer les recherches sur les données. Lorsque j'imagine une dizaine de users en réseau sur une appli avec pleins de combo alors il vaudrait mieux minimiser le traffic réseau. En plus j'ai même la possibilité par propriété de définir la méthode de raffraichissement automatique ou manuel (bouton refresh disponible pour le user).

signaler à un administrateur
Commentaire de PCPT le 07/08/2008 18:01:49 administrateur CS

pour le clone, la MDSN conseille ces paramètres :
.CursorType = adOpenStatic
.LockType = adLockBatchOptimistic

signaler à un administrateur
Commentaire de asimengo le 07/08/2008 18:37:10

Merci PCPT j'ai noté l'info, mais malheureusement lorsque j'appelle la méthode ci-dessous, les opérations .MoveX, Sort, Filter ne sont plus possibles.

Public Function CloneRecordsetMSDN(ByVal poRstSource As ADODB.Recordset, ByRef poRstDestination As ADODB.Recordset) As Boolean
    Set poRstDestination = New ADODB.Recordset
    With poRstDestination
'        .CursorLocation = adUseClient
        .CursorType = adOpenStatic
        .LockType = adLockBatchOptimistic
    End With
    
    Set poRstDestination = poRstSource.Clone
End Function

Merci pour ton aide, tu as une idée pour les constantes de resize avec le Datagrid?. Ce qui m'intéresse c'est de pouvoir dimensionner une colonne à la taille de la plus longue donnée, sans devoir passer par une boucle, ce qui implique de prendre en compte la taille des polices, ....

signaler à un administrateur
Commentaire de PCPT le 07/08/2008 20:50:45 administrateur CS

asimengo -> par API je ne trouve rien...
va sans doute falloir boucler et mesurer. calcul par rapport à la font sans objet : http://www.vbfrance.com/code.aspx?ID=40299

mais regarde avant dans les sources, çà doit sans doute déjà exister...

sinon pour l'exemple MSDN, je pensais plus à l'ouverture de la source, pas de la destination :)

en revient que je ne vois pas le but, en quoi un clone va réduire ton traffic?

tout çà a tout de même peut-être plus sa place sur le forum que sur cette source non? quoi que ^^

signaler à un administrateur
Commentaire de asimengo le 08/08/2008 10:20:18

Je viens de download ta source, rien qu'à partir des commentaires je pense que ta source devrait pouvoir m'aider sur bien plus de choses concenant la taille des polices et problablement me permettre d'écrire un éditeur de recordset que je cherche depius sans succès sur le Net.

D'autres part je viens de me trouver une utilité de ma méthode CloneRecordset (en attendant de me repencher sur le problème de Clone en observant l'activité réseau), j'ai rajouté un paramètre variant qui permet à appelant d'avoir la taille maximale des champs.

J'ai pas eu au auparavant du succès avec les forums, c'est pourquoi mes questions sont maintenant plus ciblées, ils doivent se reconnaitre sur vbfrance que je sollicite assez souvent.

Merci encore PCPT et MALIKcpp

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

ADO, RecordSet, SQL & Access [ par jpbest85 ] BonjourJe réalise un petit programme en VB6 dans lequel j'intérroge et modifie une base access.Je fais dc un Select sur ma base (je récupère donc un r ADO & DAO sous Access [ par Cramfr ] Bonjour,Juste une question anodine... Je sais que sous VB6 il est plus interessant d'utiliser ADO plut&#244;t que DAO pour sa rapidit&#233; et peut-&# ADO DAO ACCESS VB [ par djancof ] Je voudrais juste la diff&#233;rence entre ADO et DAO et leurs avantages ....Comme vous le constatez, je suis un d&#233;butant.Autre chose, je voudrai DAO ==> ADO ??? [ par bouv ] Salut,On vient de me confier un assez gros programme (8 Mo compil&#233;) avec une grosse base de donn&#233;es Access (85 Mo apr&#232;s compactage).Ce Liaison Excel <-> Access en ADO et SQL [ par nico39 ] Bonjour à tous,Je souhaiterais à partir d'une macro VBA sous Excel aller chercher certaines données dans une base de données Access, mais qui contient [Access SQL]utilisation d'une fonction d'un module dans une requete SQL [ par Regnak ] Bonjour a tous,Je voudrais faire marcher cette fonction de selection,Mais elle foire au niveau du WHERE :*DatePlusGrandQue : fonction d'un module d'ac Requete ajout dans une base externe [ par dany108 ] Bonjour à tous, je souhaite copier des enregistrements d'une table de la base (access) active vers une table d'une autre base de données. J'ai prép VB6 ADO SQL [ par JeffC1977 ] Salut...J'ai un petit probl&#232;me que je ne suis pas capable de r&#233;gler...Je veux faire une recherche dans un Base de Donn&#233;es Access et dem VB6 ADO ACCESS problème de Caractère [ par JeffC1977 ] Salut...J'ai un petit bug avec Access Versus VB6Quand j'&#233;cris dans Accese le mot Boeuf&nbsp; il s'&#233;crit de la fa&#231;on suivante B&#156;uf Synchronisation SQL Server - ACCESS [ par tenthor ] Bonjour,Je developpe une application sur ACCESS. Dans cette application, j"ai une table PERSONNEL que j'ai créé. Il se trouve que j'ai une autre base


Nos sponsors

Sondage...

CalendriCode

Janvier 2009
LMMJVSD
   1234
567891011
12131415161718
19202122232425
262728293031 

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,827 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.