Database / Files IO
ADO
Chaine de connection (ConnectionString)
Stored Code
Dim adoCnx As ADODB.Connection Dim strCnx As String 'création d'un objet Connection Set adoCnx = New ADODB.Connection 'OLEDB Provider pour ODBC 'sans DSN strCnx = "driver={SQL Server};server=srv;uid=sa;pwd=pwd;database=Pubs" 'avec DSN Version 1 strCnx = "DSN=Pubs;UID=sa;PWD=pwd;" 'avec DSN Version 1 strCnx = "Data Source=Pubs;User ID=sa;Password=pwd;" 'OLEDB pour MSSQL strCnx = "Provider=SQLOLEDB; Data Source = NomDuServeur; Initial Catalog = NomDatabase; User Id=Utilisateur; Password=MotDePasse" 'OLEDB Provider pour Access 'Jet 3.51 (MDAC 1.5 et 2.0) strCnx = "Provider=Microsoft.Jet.OLEDB.3.51;Data Source=C:\..\MonFichier.mdb" 'Jet 4.0 (MDAC 2.1 et suivants ou Office 2000) strCnx = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\..\MonFichier.mdb" 'Connection sur un fichier UDL strCnx = "File Name=MonFichier.udl" 'Assignation à l'objet Connection (ou recordset...) adoCnx.ConnectionString = strCnxExample
La manière la plus simple de créer une chaine de connection est de passer par un fichier udl: 1.- créer un fichier avec une extention udl et double-clicker dessus pour faire apparaitre l'assistant 2.- le premier onglet permet de choisir le Provider 3.- le deuxième onglet permet d'entrer les données nécessaires en fonction du Provider 4.- les 3ème et 4ème onglets permettent de paramètrer dans les détails 5.- Sauvegarder (OK) et ouvrir le même fichier dans NotePad (ou autre éditeur) pour lir la chaine de connection correspondante. ConnectionString: http://msdn.microsoft.com/library/psdk/dasdk/mdap46av.htm Exemple1: http://msdn.microsoft.com/library/psdk/dasdk/mdae9flk.htm
Création de Recordset sans accès DB
Stored Code
Dim adoRecordset As ADODB.Recordset ' création du recordset déconnecté Users Set adoRecordset = New ADODB.Recordset With adoRecordset 'Ajout des champs .Fields.Append "Nom", adVarChar, 20 .Fields.Append "Prenom", adVarChar, 20 .Fields.Append "Age", adInteger 'Curseur et LockType .CursorType = adOpenStatic .LockType = adLockOptimistic .Open 'Ajout d'un nouveau Record .AddNew Array("Nom", "Prenom", "Age"), Array("Dupond", "J.", 35) .Update End WithNotes
Référence sur "Microsoft ActiveX Data Objects 2.1 Library" (msado21.tlb) ou version supérieurs (2.5...)Example
Création d'un Recordset indépendent d'une DB. Utilisation: transfert de données, présentation de données sous forme de Tableau... Liste des Types de variables (DataTypeEnum): http://msdn.microsoft.com/library/psdk/dasdk/mdae8o19.htm
Filtre
Stored Code
Dim adoRecordset As ADODB.Recordset Set adoRecordset = New ADODB.Recordset With adoRecordset 'Ouverture d'un Recordset déconnectés .CursorLocation = adUseClient .CursorType = adOpenStatic .ActiveConnection = "......." 'Chaine de connection OLEDB (Access / SQL...) .Open "SELECT * FROM TABLE1" 'Ouverture avec commande SQL .ActiveConnection = Nothing 'Deconnection 'Filtre (AND / OR permis) .Filter "champs1 = 'abcd' AND champs2 LIKE 'S*'" .MoveFirst If Not .EOF() Then 'Recordset trouvé / Scan des RecordSets End If End WithNotes
Référence sur "Microsoft ActiveX Data Objects 2.1 Library" (msado21.tlb) ou version supérieurs (2.5...)Example
Filter : permet de poser un filtre logique sur le Recordset
Optimisation accès aux champs
Stored Code
'Accès répétitif aux données (boucles): 'L’utilisation d’objets “ Fields ” permet d’optimiser les temps d’accès 'aux données lors d’action répétitives (boucles) sur les mêmes champs : Dim rs As New ADODB.Recordset Dim fldFName As ADODB.Field, fldLName As ADODB.Field rs.Open "SELECT au_lname, au_fname FROM authors", "DSN=pubs", , , adCmdText 'création des objets "Field" qui référencent les 2 deux champs Set fldLName = rs.Fields("au_lname") Set fldFName = rs.Fields("au_fname") Do Until rs.EOF 'utilisation des objets Files de références (default property -> value) List1.AddItem fldLName & ", " & fldFName rs.MoveNext Loop rs.Close 'Il peut cependant être plus rapide de passer par une transformation 'en tableau de String : Dim rs As New ADODB.Recordset Dim varArray() As Variant Dim i As Long 'faire exécuter la concatenation par le serveur rs.Open "SELECT au_lname+', '+au_fname FROM authors", "DSN=pubs", , , adCmdText 'retourner tous les records en une opération varArray() = rs.GetRows() 'remplir la ListBox For i = 0 To UBound(varArray, 2) List1.AddItem varArray(0, i) Next 'Accès simple aux données (non répétitif) 'L’utilisation du membre caché (et non documenté) “ Collect ” 'en lieu et place de la propriété “ Field ” permet d’augmenter 'significativement la vitesse de l’instruction (jusqu’à 30% plus rapide avec ADO 2.5) : Dim rs As New ADODB.Recordset rs.Open "authors", "DSN=pubs" 'reference par le nom du champs firstName = rs.Collect("au_fname") 'reference par l'index du champs rs.Collect(2) = "John Doe"
Recherche
Stored Code
Dim adoRecordset As ADODB.Recordset Set adoRecordset = New ADODB.Recordset With adoRecordset 'Ouverture d'un Recordset déconnectés .CursorLocation = adUseClient .CursorType = adOpenStatic .ActiveConnection = "......." 'Chaine de connection OLEDB (Access / SQL...) .Open "SELECT * FROM TABLE1" 'Ouverture avec commande SQL .ActiveConnection = Nothing 'Deconnection .MoveFirst 'AND / OR ne sont pas autorisés .Find "Champs1 LIKE 'S*'" If Not .EOF() Then 'Recordset trouvé / Affiche le Recordset End If End WithNotes
Référence sur "Microsoft ActiveX Data Objects 2.1 Library" (msado21.tlb) ou version supérieurs (2.5...)Example
Find : Permet de recherche un Record répondant à une condition logique simple (AND et OR pas autorisés)
Resynchronisation de Recordset déconnecté
Stored Code
'Retrait du Recordset initial 'Paramètres: strSQL = requête SQL ' strConStr = chaine de connection ADO Public Function GetDecRecordset(ByVal strSQL As String, _ ByVal strConStr As String) As ADODB.Recordset On Error GoTo Err_GetDecRecordset Dim adoRecset As ADODB.Recordset Set adoRecset = New ADODB.Recordset With adoRecset .ActiveConnection = StrConStr .CursorLocation = adUseClient .LockType = adLockBatchOptimistic .Supports adUpdateBatch .CursorType = adOpenStatic .Open strSQL, , , , adCmdText Set .ActiveConnection = Nothing End With Set GetDecRecordset = adoRecset Set adoRecset = Nothing Exit Function Err_GetDecRecordset: Err.Raise Err.Number, App.EXEName & "/GetDecRecordset", Err.Description End Function 'Resynchronisation du Recordset 'Paramètres: adoRecset = recordset à resynchroniser ' strConStr = chaine de connection ADO ' varBkm = tableau vide de Bookmarks (variant) Public Function ResyncRecordset(ByVal adoRecset As ADODB.Recordset, _ ByVal strConStr As String, _ ByRef varBkm() As Variant) As ADODB.Recordset On Error GoTo Err_ResyncRecordset Dim varPosition As Variant Dim intCounter As Integer Dim intCmpt As Integer ' The first thing that must always be done With a disconnected recordset Is To reconnect it To the database. Therefore, we create And Open a connection, Then Set the recordset's ActiveConnection property to the open connection. With adoRecordset Set .ActiveConnection = strConStr .Resync adAffectAllChapters, adResyncUnderlyingValues varPosition = .Bookmark Do While Not .EOF If .Status <> adRecUnmodified And .Status <> adRecOK Then For intCounter = 0 To .Fields.Count - 1 If .Fields(intCounter).UnderlyingValue <> .Fields(intCounter).OriginalValue Then ReDim Preserve varBkm(intCmpt) varBkm(intCmpt) = .Bookmark intCmpt = intCmpt + 1 End If Next End If .MoveNext Loop .Bookmark = varPosition Set .ActiveConnection = Nothing End With Set ResyncRecordset = adoRecordset Exit Function Err_ResyncRecordset: Err.Raise Err.Number, App.EXEName & "/ResyncRecordset", Err.Description End FunctionExample
1.- retrait d'un Recordset déconnecté avec la méthode GetDecRecordset paramètre strSQL : chaine SQL strConStr : chaine de connection 2.- travail sur le recordset 3.- resynchronisation du recrodset avec la méthode ResyncRecordset paramètre adoRecset : recordset à resynchroniser strConStr : chaine de connection varBkm() : tableau vide de Bookmarks à remplir par la méthode La méthode retournera un tableau (varBkm) de Bookmarks sur les Recordset posant un problème de synchronisation.
Tri
Stored Code
Dim adoRecordset As ADODB.Recordset Set adoRecordset = New ADODB.Recordset With adoRecordset 'Ouverture d'un Recordset déconnectés .CursorLocation = adUseClient .CursorType = adOpenStatic .ActiveConnection = "......." 'Chaine de connection OLEDB (Access / SQL...) .Open "SELECT * FROM TABLE1" 'Ouverture avec commande SQL .ActiveConnection = Nothing 'Deconnection 'Tri sur Champs1, Champs2 etc. .Sort "Champs1, Champs2..." .Movefirst If Not .EOF() Then 'Affichage des Recordsets dans leur position triée End If End WithNotes
Référence sur "Microsoft ActiveX Data Objects 2.1 Library" (msado21.tlb) ou version supérieurs (2.5...)Example
Sort : Permet de trier le contenu d'un Recordset par Colonne
Files IO
Accès "Random"
Stored Code
'Put 'Définition du Record (UDT) Type Record ID As Integer Nom As String * 20 End Type Dim udtRecord As Record Dim intRecordNmb As Integer 'Ouverture en mode Random Open "C:\FichierTest" For Random As #1 Len = Len(udtRecord) For intRecordNmb = 1 To 5 'Chargement des données udtRecord.ID = RecordNmb udtRecord.Name = "Nom" & RecordNmb 'écriture du Record Put #1, RecordNmb, udtRecord Next RecordNmb Close #1 '--------------------------------------------------------------------------- 'Get 'Définition du Record (UDT) Type Record ID As Integer Nom As String * 20 End Type Dim udtRecord As Record Dim lngPosition As Long 'Ouverture en mode Random Open "C:\FichierTest" For Random As #1 Len = Len(udtRecord) 'Lit le Record 3 lngPosition = 3 Get #1, lngPosition, udtRecord Close #1Example
Put : écriture d'un Record Get : lit un Record
Accès séquentiel
Stored Code
'Input (Procédure) Dim intNmb As Integer Dim strChaine As String 'Ouverture du fichier en Input Open "C:\FichierTest" For Input As #1 'Parcoure le fichier jusqu'à la fin Do While Not EOF(1) 'Lit les 2 variables (String et Integer) Input #1, strChaine, intNmb 'Affiche les variables lues dans l'Immediate window. Debug.Print strChaine, intNmb Loop Close #1 '--------------------------------------------------------------------------- 'Input et InputB (Fonction) Dim strChaine As String 'Ouverture du fichier en Input Open "C:\FichierTest" For Input As #1 'Parcoure le fichier jusqu'à la fin Do While Not EOF(1) 'Lit un character strChaine = Input(1, #1) 'Affiche le character dans l'Immediate window. Debug.Print strChaine Loop Close #1 'pour lire n characters '-> strChaine = Input(n, #1)) 'Pour charger un fichier entier '-> strFichier = StrConv(InputB(LOF(intFileNmb), intFileNmb), vbUnicode) '--------------------------------------------------------------------------- 'Write (Print peut également être utilisé) Dim blnMyVar As Boolean Dim dteMyVar As Date Dim varMyVal As Variant 'Assigantion de valeurs aux variables blnMyVar = True dteMyVar = #12/31/1985# varMyVal = Null 'Ouverture du fichier en Output Open "C:\FichierTest" For Output As #1 'écrit les données et ferme le fichier Write #1, "Hello World", 234 'String et Integer séparés par virgule Write #1, 'ligne blanche Write #1, blnMyVar ; 'variable Boolean Write #1, dteMyVar ; 'variable date Write #1, varMyVar ; 'variable Null Close #1Example
Input : lit dans le fichier Write, Print : écrit dans un fichier
Informations
Stored Code
'Loc / Lof Dim lngPosition As Long Dim strLigne As String 'Ouverture en mode binaire Open "C:\FichierTest" For Binary As #1 'Test si position < que taille di fichier (LOF) Do While lngPosition < LOF(1) 'Lit le prochain Character et l'ajoute à la ligne strLigne = strLigne & Input(1, #1) 'Sauvegarde la position du Curseur lngPosition = Loc(1) 'Affiche les données dans l'Immediate window. Debug.Print strLigne; Tab; lngPosition Loop Close #1 '--------------------------------------------------------------------------- 'Seek / EOF 'Définition du Record (UDT) Type Record ID As Integer Nom As String * 20 End Type Dim udtRecord As Record 'Pour les fichiers ouverts en "Random" Seek retourne le xème record suivant Open "C:\FichierTest" For Random As #1 Len = Len(udtRecord) Do While Not EOF(1) 'Lit le Record Get #1, , udtRecord 'Affiche le numéro de Record dans l'Immediate window. Debug.Print Seek(1) Loop Close #1 'Pour les fichiers ouverts dans d'autres Modes, Seek retourne 'la position du Curseur valable pour l'opération suivante Dim strChar As String 'Ouverture en mode input séquentiel Open "C:\FichierTest" For Input As #1 'Test si fin du fichier atteint (EOF) Do While Not EOF(1) 'Lit le prochain Character strChar = Input(1, #1) 'Affiche la position du Curseur dans l'Immediate window. Debug.Print Seek(1) Loop Close #1Example
Loc, Seek : retourne la position du Curseur à l'intérieur du fichier Lof : retourne la taille en bytes di fichier Eof : fin de fichier atteint
Open & Close & FreeFile
Stored Code
'Exemple Dim intFileNmb As Integer Dim IntFileNumber As Integer 'Créé 10 fichiers For intFileNmb = 1 To 10 'Fournit un nouveau numéro pour l'ouverture du fichier intFileNumber = FreeFile 'Création du fichier Open "C:\FichierTest" & intFileNmb For Output As #intFileNumber 'écrit dans le fichier Write #intFileNumber, "Exemple " & IntFileNmb 'Fermeture du fichier Close #intFileNumber Next IntFileNmb '--------------------------------------------------------------------------- 'Ouverture en mode input séquentiel Open "C:\FichierTest" For Input As #1 'Travail sur le fichier Close #1 '--------------------------------------------------------------------------- 'Ouverture en mode output séquentiel partagé (read + write) Open "C:\FichierTest" For Output Shared As #1 'Travail sur le fichier Close #1 '--------------------------------------------------------------------------- 'Ouverture en mode binaire pour écriture Open "C:\FichierTest" For Binary Access Write As #1 'Travail sur le fichier Close #1 '--------------------------------------------------------------------------- 'Ouverture en mode Random et utilisation d'un Type pour parcourir le fichier Type Record ID As Integer Nom As String * 20 End Type Dim udtRecord As Record Open "C:\FichierTest" For Random As #1 Len = Len(udtRecord) 'Travail sur le fichier Close #1 '--------------------------------------------------------------------------- 'Ouverture en mode binaire pour lecture en exclusif Open "C:\FichierTest" For Binary Access Read Lock Read As #1 'Travail sur le fichier Close #1Example
FreeFile: fournit un numéro libre de fichier Open : permet d'ouvrir le fichier Close : permet de fermer le fichier
Recordset déconnecté
Stored Code
'Exemple 1 Dim adoRecordset As ADODB.Recordset Set adoRecordset = New ADODB.Recordset ' Obligatoire pour Recordset déconnectés With adoRecordset .CursorLocation = adUseClient .CursorType = adOpenStatic .ActiveConnection = "......." 'Chaine OLEDB Access / SQL etc. .Source = "SELECT * FROM TABLE1" 'Commande SQL .Open 'Ouverture .ActiveConnection = Nothing 'Deconnection End With '--------------------------------------------------------------------------- 'Exemple 2 Dim adoRecordset As ADODB.Recordset Set adoRecordset = New ADODB.Recordset With adoRecordset .CursorLocation = adUseClient .Open "SELECT * FROM TABLE1", "ConnectionString...", adOpenStatic .ActiveConnection = Nothing 'Deconnection End WithNotes
Référence sur "Microsoft ActiveX Data Objects 2.1 Library" (msado21.tlb) ou version supérieurs (2.5...)Example
Création d'un Recordset à partir d'un base de données et déconnection pour transfert et utilisation indépendante par un client
FSO
Retourne le contenu d'un fichier
Stored Code
'Retourne le contenu d'un fichier sous forme d'une String 'strFichier = Nom du fichier avec Path complet 'Retour de fonction = liste des fichiers dans un tableau Public Function Contenu(strFichier As String) As String Dim fsoFSO As FileSystemObject Dim fsoTxtStr As TextStream Dim fsoFile As File Dim intCmpt As Integer 'Ouvre un objet FileSystemObject Set fsoFSO = New FileSystemObject 'Erreur si folder n'existe pas If Not fsoFSO.GetFile(strFichier) Then Err.Raise 5555, "MaDLL/Contenu", "Fichier " & strFichier & " n'existe pas!" Exit Function 'Ouverture du TextStream Set fsoTxtStr = fsoFSO.OpenTextFile(strFichier, ForReading, False) 'Retourne le contenu du fichier 'utiliser "fsoTxtStr.ReadLine" pour lire une ligne unique Contenu = fsoTxtStr.ReadAll fsoTxtStr.Close Set fsoTxtStr = Nothing Set fsoFSO = Nothing End FunctionNotes
Référence sur "Microsoft Scripting Runtime" (scrrun.dll)Example
La fonction 'Contenu' retourne la contenu du fichier passé en paramètre.
Scan un répertoire
Stored Code
'Retourne la liste des répertoires contenus dans le répetoire passé en paramètre 'strPath = répertoire à scanner 'Retour de fonction = liste des répertoires dans un tableau Public Function Repertoires(strPath As String) As String() Dim strTbl() As String Dim fsoFSO As FileSystemObject Dim fsoParent As Folder Dim fsoFolder As Folder Dim intCmpt As Integer 'Ouvre un objet FileSystemObject Set fsoFSO = New FileSystemObject 'Erreur si folder n'existe pas If Not fsoFSO.FolderExists(strPath) Then Err.Raise 5555, "MaDLL/Repertoires", "Répertoire " & strPath & " n'existe pas!" Exit Function 'Retrait de l'objet Folder Set fsoParent = fsoFSO.GetFolder(strPath) 'Redim le tableau en fonction du nombre de sous-répertoires ReDim strTbl(fsoParent.SubFolders.Count) 'Remplissage du tableau de Répertoires intCmpt = 0 For Each fsoFolder In fsoParent.SubFolders strTbl(intCmpt) = fsoFolder.Name intCmpt = intCmpt + 1 Next Set fsoParent = Nothing Set fsoFSO = Nothing End Function 'Retourne la liste des fichiers contenus dans le répetoire passé en paramètre 'strPath = répertoire à scanner 'Retour de fonction = liste des fichiers dans un tableau Public Function Fichiers(strPath As String) As String() Dim strTbl() As String Dim fsoFSO As FileSystemObject Dim fsoParent As Folder Dim fsoFile As File Dim intCmpt As Integer 'Ouvre un objet FileSystemObject Set fsoFSO = New FileSystemObject 'Erreur si folder n'existe pas If Not fsoFSO.FolderExists(strPath) Then Err.Raise 5555, "MaDLL/Fichiers", "Répertoire " & strPath & " n'existe pas!" Exit Function 'Retrait de l'objet Folder Set fsoParent = fsoFSO.GetFolder(strPath) 'Redim le tableau en fonction du nombre de fichiers ReDim strTbl(fsoParent.Files.Count) 'Remplissage du tableau de Répertoires intCmpt = 0 For Each fsoFile In fsoParent.Files strTbl(intCmpt) = fsoFile.Name intCmpt = intCmpt + 1 Next Set fsoParent = Nothing Set fsoFSO = Nothing End FunctionNotes
Référence sur "Microsoft Scripting Runtime" (scrrun.dll)Example
La fonction 'Repertoires' retourne la liste des sous-répertoires contenus dans le répetoire passé en paramètre. La fonction 'Fichiers' retourne la liste des fichiers contenus dans le répetoire passé en paramètre. Ces fonction sont uniquement des exemples d'utilisation de FSO. Le même résultat peut bien entendu être obtenu beaucoup plus simplement avec la fonction 'Dir'.
Oracle
Séquences (Numéros uniques pour ID)
Stored Code
'Exemple d'insertion d'une PK obtenue à partir d'un nouveau numéro de la séquence INSERT INTO projets values (seq_projets.nextval,'pp') 'Exemple d'insertion d'une FK obtenue à partir du numéro de séquence courant INSERT INTO interventions values (...,seq_projets.currval,...) 'Exemple d'obtention d'un nouveau numéro de séquence Select seq_projets.nextval from dual 'Exemple d'obtention du numéro de séquence courant Select seq_projets.currval from dualNotes
Code SQL pour OracleExample
'Exemple d'utilisation de numéros de séquences dans Oracle
TO_DATE
Stored Code
TO_DATE('31.12.1999', 'dd.mm.yyyy')Notes
Code SQL pour OracleExample
Permet de s'assurer du stockage correct des dates quelque soient les "Language Settings"