Page 1 sur 1

Tutoriel de connection en C# avec COM (Création d'un RDV)

MessagePublié: 15 Juil 2009 à 10:41
par Dschub
Bonjour,

Depuis quelques jours, je cherchais un moyen de communiquer avec la base Lotus. Mon but était de faire un la synchronisation d'agenda (Lotus et avec un logiciel de notre entreprise). Ne connaissant rien en Lotus, j'ai cherché (malgré les conseils contraires) à ne pas utiliser les web-services, pour éviter d'apprendre le lotus script et tout ce qui va autour, dans le but de gagner du temps.

Je vais donc vous faire un petit récapitulatif pour les personnes que ça pourrai intéresser.

Récupérer des données :
Le moyen que j'ai utilisé ici est le driver ODBC appelé NotesSQL, fourni par IBM. On trouve assez facilement la dernière version sur le site avec les tutoriaux d'installation. La doc s'installe automatiquement lors de l'installation (Sous forme html, dans le répertoire).

Petit conseil : Lors de la configuration du driver ODBC, hésitez pas à remplir les options de connections du driver (login, mdp), comme ça lors de l'établissement de votre connection dans le code C, le connectionString ne contient que le DSN (Datasource Server Name) que vous donnez lors de votre configuration.

L'avantage c'est que pour changer l'user de connection il suffit de reconfigurer le driver ODBC. On peux passer aussi par un fichier XML mais les informations ont l'inconvénient d'être lisible par tout le monde.

un petit exemple de code :
Code : Tout sélectionner
string connectionStringLotus = "DSN=" + lotusDataSourceName + ";";
bddLotus = new System.Data.Odbc.OdbcConnection(connectionStringLotus);


Une fois qu'on a cette connection ouverte, rien de plus facile, il suffit juste d'utiliser le driver ODBC comme tous les autre.

Code : Tout sélectionner
DataSet ds = new DataSet();
string requete = "Ma requete en SQL";
OdbcCommand odbcCommande = new OdbcCommand(requete, bddLotus);
OdbcDataAdapter odbcDataAdapteur = new OdbcDataAdapter(odbcCommande);
odbcDataAdapteur.Fill(ds);

foreach(DataRow row in ds.Tables[0].Rows)
{
       // traitement
}



Un petit détail à savoir : Le driver NotesSQL, considère toutes les form et vue de Lotus comme des tables, donc pour obtenir les informations que l'on souhaite il suffit juste de créer une vue sur la base lotus et interroger. On dirai presque que c'est facile :D

L'insertion des RDV :
Au début je voulais utiliser le driver ODBC aussi, car on peux faire des insertions et updates et autres avec lui. Mais je suis rapidement tombé sur un os. Pour les RDV il y a un champs dans le document Lotus qui s'appelle "from". Comme c'est un mot clé du SQL, la requête ne passe" jamais le stade de la précompilation et donc impossible d'insérer des RDV.

J'ai été obligé d'utiliser le composant COM. Il suffit d'ajouter une référence (Lotus Domino Objects) dans votre projet pour avoir l'espace de nom Domino.

Ensuite, utilisation basique de l'objet COM :
Code : Tout sélectionner
Domino.NotesSession session = new Domino.NotesSession();
session.Initialize(password);
Domino.NotesDatabase db = session.GetDatabase(lotusServeurName, databaseFile, false);

if (!db.IsOpen)
     db.Open();

Domino.NotesDocument rdvLotus = db.CreateDocument();
System.DateTime startDate = new DateTime("A construire");

System.DateTime endDate = new DateTime("A construire");

rdvLotus.ReplaceItemValue("Form", "Appointment");
rdvLotus.ReplaceItemValue("AppointmentType", "0");
rdvLotus.ReplaceItemValue("Subject", rdv.DetailsRDV);
rdvLotus.ReplaceItemValue("StartDateTime", startDate);
rdvLotus.ReplaceItemValue("EndDateTime", endDate);
rdvLotus.ReplaceItemValue("StartDate", startDate);
rdvLotus.ReplaceItemValue("StartTime", startDate);
rdvLotus.ReplaceItemValue("EndTime", endDate);
rdvLotus.ReplaceItemValue("Location", rdv.LieuRendezVous);
rdvLotus.ReplaceItemValue("MeetingType", "1");
rdvLotus.ReplaceItemValue("Body", "Ceci est le contenu du rdv");
rdvLotus.ReplaceItemValue("CalendarDateTime", startDate);
rdvLotus.ReplaceItemValue("Chair", session.CommonUserName);
rdvLotus.ReplaceItemValue("AltChair", session.CommonUserName);
rdvLotus.ReplaceItemValue("From", session.CommonUserName);
 rdvLotus.ReplaceItemValue("Principal", session.CommonUserName);

if (rdvLotus.ComputeWithForm(true, false))
{
      rdvLotus.Save(true, false, true);
}


Voilà, si vous avez d'autres informations, hésitez pas à les poster ça servira toujours.

Cordialement