Dans le cadre de l'un de mes travaux, et après avoir développé un script d'automatisation d'une partie d'une checklist quotidienne d'un de mes clients, je me suis attaqué à la partie encore "manuelle" du processus : L'intégration des données issues de ce script dans une base de données Access. En effet, le service informatique de ce client suit et analyse les données issues de ces checklists quotidiennes, et la question est : pourquoi prendre du temps chaque matin a insérer des données déjà extraites et disponibles dans un script?!
Après un certain nombre de recherches, et de nombreux tests, j'ai pu automatiser ce processus et faire gagner encore de précieuses minutes et s'économiser d'efforts inutiles ainsi que de risques d'erreurs humaines.
Nous aurons besoin de plusieurs choses pour pouvoir nous connecter à une base ACCESS. Tout d'abord, le moteur de base Access doit être installé sur l'ordinateur. Il s'agit ni plus ni moins que d'un logiciel permettant d’accéder aux données des bases de données. Si vous n'avez pas cela, vous pourrez le trouver en cliquant ici.
Si vous avez déjà Office, vous avez de grandes chances d'avoir ce moteur pré-installé. Une fois ceci fait, vous aurez besoin de deux objets pour pouvoir insérer des données, et de plusieurs variables.
La première sera l'objet représentant notre base. Pour ce faire, nous créons un nouvel objet com de type ADODB.Connection
$ado = New-Object -ComObject ADODB.Connection
Nous demandons ensuite à cet objet d'ouvrir la base, en lui fournissant un provider (qui lui indiquera avec quoi l'ouvrir, ne cherchez pas à ouvrir du Mysql avec du Access), ainsi que le chemin de la base. Attention, le provider n'est pas le même pour une base Access inférieure à 2007. Le provider est Microsoft.Jet.OLEDB.4.0.
$ado.open("Provider = Microsoft.ACE.OLEDB.12.0;Data Source=\\serveur\basearticles.accdb")
Le deuxième objet quand à lui sera un objet d'enregistrement de base de donnée. C'est cet objet qui fera l'intégration de nouvelles valeurs dans la BDD précédemment ouverte.
$recordset = New-object -ComObject ADODB.Recordset
Cet objet nécessite d'avoir une requête, une base, un type de curseur et un type de verrou. Ces quatre informations lui permettront de se déplacer dans la base, mais également de choisir la façon dont il protégera les données en cours d'une écriture simultanée éventuelle. Les curseurs permettent de se déplacer dans la base ainsi que d'extraire les données recherchées lors d'une requête. Il en existe plusieurs types, chacun utilisable dans le script en appelant leur code entre parenthèses :
Dans notre exemple, et au vu du type de base nécessaire, nous utiliserons un curseur de type "statique". Les différentes informations sur les types de curseur sont disponibles sur le site de Microsoft.
$curseur = 3
Les verrous quand à eux, précisent la façon utilisée par le moteur de base pour empêcher l’écriture simultanée et la corruption de données. Il en existe 5 (enfin, 4), appelables aussi via leur code entre parenthèses :
Chacun de ces verrous ont leur mode de fonctionnement propre, par exemple, le mode optimiste, comme son nom l'indique, suppose le mieux. Personne ne se sert des enregistrements, et il tente de les écrire , et vérifie ensuite leur écriture correcte. Je vous invite à chercher par vous même les nuances entre chaque. Comme cette base n'est utilisée qu'à ces fins et n'est pas en écriture à l'heure ou le script se lance, je choisis donc le mode "Optimistic" (valeur 3).
$verrou = 3
Nous avons également enregistré notre requête :
$query = "Select * from [Nom table]"
Et de la nous pouvons donc ouvrir la base pour pouvoir y insérer des enregistrements :
$recordset.open($query,$ado,$openstatic,$lockoptimistic)
Nous signalons l'ajout d'un nouvel enregistrement :
$recordset.Addnew()
Puis nous ajoutons aux champs de la table les valeurs souhaitées :
$recordset.fields.item("Date") = "19/06/2014"
$recordset.fields.item("Rédacteur") = "Nicolas Lang"
$recordset.fields.item("Article") = "Insérer des données dans Access depuis Powershell"
Et lorsque cela est terminé, nous lançons la mise à jour de la base avec l'enregistrement ainsi crée.
$recordset.update()
Pour que les utilisateurs puissent ensuite travailler sur la base, n'oubliez pas de libérer les ressources pour retirer les verrous.
$recordset.close()
$ado.close()
Voila! Plus qu'a aller regarder dans votre base, et tout y est! Une des pratiques intéressantes pour l'ajout de données dans une base est l'utilisation de tables de hachages. Les tables de hachage permettent d'avoir un champ clé unique, et d'y attribuer une valeur. Cela est très pratique pour lancer en batch toute une série de modifications. Ainsi, l'ajout des données présentées au dessus peuvent également se faire ainsi.
$champs = @{
"Date" = "19/06/2014";
"Rédacteur" = "Nicolas Lang";
"Article" = "Insérer des données dans Access depuis Powershell"
}
foreach ($champ in $champs.keys)
{
$recordset.fields.item($champ) = $($champs.$champ)
}