2009-09-11 5 views
0

J'ai créé un programme il y a un certain temps en utilisant C# qui effectue une certaine automatisation pour un programme complètement différent, mais j'ai trouvé que j'avais besoin d'accéder aux données d'une base de données Lotus Notes. Le seul problème est, je ne peux sembler comprendre comment ouvrir la base de données par le nom du serveur (en utilisant session.GetDatabase()) ... Je ne peux pas comprendre comment l'ouvrir par Replica ID. Est-ce que quelqu'un sait comment j'irais à ce sujet? (Je ne veux pas que mon programme va à chaque fois que les changements de serveur.)Ouvrir la base de données Lotus Notes par l'ID de réplique en C#

public static string[] GetLotusNotesHelpTickets() 
{ 
    NotesSession session = new NotesSession(); 
    session.Initialize(Password); 
    // 85256B45:000EE057 = NTNOTES1A Server Replica ID 
    NotesDatabase database = session.GetDatabase("NTNOTES1A", "is/gs/gshd.nsf", false); 
    string SearchFormula = string.Concat("Form = \"Call Ticket\"" 
            , " & GroupAssignedTo = \"Business Systems\"" 
            , " & CallStatus = \"Open\""); 
    NotesDocumentCollection collection = database.Search(SearchFormula, null, 0); 
    NotesDocument document = collection.GetFirstDocument(); 
    string[] ticketList = new string[collection.Count]; 

    for (int i = 0; i < collection.Count; ++i) 
    { 
     ticketList[i] = ((object[])(document.GetItemValue("TicketNumber")))[0].ToString(); 
     document = collection.GetNextDocument(document); 
    } 

    document = null; 
    collection = null; 
    database = null; 
    session = null; 

    return ticketList; 
} 

Ce code fonctionne très bien, mais si le serveur changé de NTNOTES1A, alors rien ne va plus travailler.

Répondre

2

vous aurez besoin d'utiliser la méthode notesDbDirectory.OpenDatabaseByReplicaID ($). Pour obtenir le NotesDbDirectory, vous pouvez utiliser la méthode getDbDirectory de la session

Set notesDbDirectory = notesSession.GetDbDirectory(serverName$) 

, vous pouvez utiliser le code ci-dessous pour obtenir une base de données par ReplicaID.

public static string[] GetLotusNotesHelpTickets() 
{ 
    NotesSession session = new NotesSession(); 
    session.Initialize(Password); 

    Set notesDBDirectory = session.GetDbDirectory("NTNOTES1A") 
    // 85256B45:000EE057 = NTNOTES1A Server Replica ID 
    NotesDatabase database = notesDBDirectory.OpenDatabaseByReplicaID("85256B45:000EE057") 
    string SearchFormula = string.Concat("Form = \"Call Ticket\"" 
            , " & GroupAssignedTo = \"Business Systems\"" 
            , " & CallStatus = \"Open\""); 
    NotesDocumentCollection collection = database.Search(SearchFormula, null, 0); 
    NotesDocument document = collection.GetFirstDocument(); 
    string[] ticketList = new string[collection.Count]; 

    for (int i = 0; i < collection.Count; ++i) 
    { 
     ticketList[i] = ((object[])(document.GetItemValue("TicketNumber")))[0].ToString(); 
     document = collection.GetNextDocument(document); 
    } 

    document = null; 
    collection = null; 
    database = null; 
    session = null; 

    return ticketList; 
} 

Malheureusement, cela ne résout que la moitié de votre problème. Je sais que vous préférerez simplement demander à Notes d'extraire la base de données avec un ID de réplica particulier du serveur le plus proche du client, exactement comme le fait le client Notes lorsque vous cliquez sur un lien de base de données ou un signet. Cependant, il existe (ou semble être) aucun moyen de le faire en utilisant les API Notes. Ma suggestion est soit de parcourir une liste codée en dur de serveurs potentiels par nom, et de vérifier si la base de données est trouvée (la méthode OpenDatabaseByReplicaID renvoie ERR_SYS_FILE_NOT_FOUND (erreur 0FA3) si la base de données est introuvable). Si ce n'est pas une bonne option, peut-être vous pouvez facilement exposer le nom du serveur dans un menu d'administration de votre application afin qu'il puisse être changé facilement si le nom du serveur change à un moment donné.

+0

si triste ... Je ne peux pas croire qu'ils auraient pas ajouté dans cette petite fonctionnalité. Je suppose que si j'allais faire une boucle sur les noms de serveurs, l'ID de réplique sera probablement inutile. Merci pour la réponse ... On dirait que je devrais faire la liste des noms de serveurs quand même. Soupir - Pourquoi les notes ne peuvent-elles jamais être faciles? – Sivvy

1

base de données de jeu = new NotesDatabase (« ») appel database.OpenByReplicaID (« IDRep »)

+0

Je suppose que c'est LotusScript. J'écris ceci en C#, et le "database.OpenByReplicaID (" repid ")" ne fonctionnera pas, parce que ce n'est pas une fonction surchargée, et nécessite 2 paramètres ... L'un étant le serveur. – Sivvy

+0

Le nom de serveur est requis en C# ?? Ce genre de défait l'objectif d'utiliser l'ID de réplique à tous. Et bien. Dans ce cas, il semble que vous soyez revenu à l'utilisation d'un document de configuration (ou équivalent) pour spécifier le serveur préféré. Peut-être que vous pourriez tenter une connexion au serveur préféré, et en tant que sauvegarde si cela ne fonctionne pas, obtenez une liste de tous les serveurs du domaine à partir de names.nsf (ou du même document de configuration) et faites-y une boucle. –

+0

Oui ... Sûrement stupide qu'ils auraient même l'option d'ouvrir par replicaID, mais pas de raison de l'utiliser ... Encore une autre raison pour Notes de m'agacer. – Sivvy

Questions connexes