Hallo,
ich hab da ein winziges Problem. Ok, eigentlich ein großes ^^
Ich will/muss/darf eine Lotus Notes Datenbank mit Hilfe eines C#-Programms auslesen/beschreiben.
Nun frage ich mich, womit ich das mache 🙂
Habe mir bisher 3 möglichkeiten überlegt, von denen ich nicht weiss, ob sie realisierbar sind (was solche Zugriffe angeht, hab ich kaum ahnung)
Bei OLEDB hab ich mal gar keine Ahnung, ob die Jet-Engine z.B. das hergibt (planlos halt ^^)
Bei ODBC habe ich nun dank IBM-ID NotesSQL 3.02j runtergeladen, aber da fehlt mir der "Connection-String" ^^
Bei LDO kann ich zwar Daten wie Datenbankname etc. auslesen, aber komme nicht an die Felder ran 🙂
Am liebsten wäre mir eine Möglichkeit wo ich einfach den Server angebe, und dann mit SQL-Querries einfach drüber laufe, und von mir aus die Daten aus der Notes-DB in nem DataSet speichere.
Hoffe auf hilfe 🙂
moin
hast du schonmal unsere echt geniale Erfindung benutzt
http://www.mycsharp.de/wbb2/search.php
mfg
ach, wie ich solche antworten liebe... ja, ich habe die mega geile suchfunktion genutzt... nur hilft sie mir nicht weiter... falls ich deiner meinung nach zu blöd dafür bin (so klingt der post), dann erleuchte mich! falls nicht: ruhe!
EDIT: Sorry, ich reagiere auf diese "google doch einfach" posts äusserst alergisch...
Ich suche seid 2 Wochen im Inet, um eine Verbindung zwischen C# und Notes herzustellen... wie oben zu lesen hatte ich eine möglichkeit, aber diese COM-Schnittstelle ist nirgends dokumentiert, daher suche ich nach anderen Möglichkeiten... habe auch hier im Forum gesucht, habe auch Posts gefunden (odbc + c#) aber immer nur für access Datenbanken... das ist auch kein Problem, das hab ich schon gemacht, aber Notes ist nun mal, zumindest nach meiner Auffassung was völlig anderes...
Original von Mora
ach, wie ich solche antworten liebe... ja, ich habe die mega geile suchfunktion genutzt... nur hilft sie mir nicht weiter... falls ich deiner meinung nach zu blöd dafür bin (so klingt der post), dann erleuchte mich! falls nicht: ruhe!
Hmm. einfach "Notes" eingeben. Der zweite Link hätte dich u.a. zur einer Einführung von IBM für die Nutzung der COM-API geführt:
http://www.redbooks.ibm.com/abstracts/sg245670.html?Open
Ich denke, wenn du eine vollständige Doku und Anleitung für das Notes-Objektmodell erwartest, dann wirst du kaum im Netz fündig. Gibt aber ne Menge Literatur zu kaufen und natürlich auch viele Schulungen. Hinter Lotus Notes steht eine ganze Industrie und "Notes-Programmierer" ist ja quasi nen Ausbildungsberuf. Wenn man da so einfach ohne große Vorkenntnisse in der Lage wäre die API zu nutzen, dass wäre das ja alles dahin. 😉
Notes-Profis kommen mit der COM-API vermutlich problemlos zurecht....
gut, nun bin ich halt kein "Notes-Profi", also keine ahnung von der COM-API... daher überlege ich halt, ob ich nicht lieber odbc oder oledb nehme... aber k.A. ob das überhaupt geht, darum frag ich hier ja nach...
Das Problem ist doch, dass Lotus Notes ein recht komplexes Modell seiner Daten hat (wer mit Lotus nur mal gearbeitet fragt sich, warum ein E-Mail-Programm zu ungeheuer kompliziert sein muss 🙂 - muss es,weil es eben eigentlich gar keine E-Mail-Programm ist, wird nur dazu benutzt).
Ein Verständnis dieses Modells ist die Vorraussetzung um überhaupt mit Lotus auf interner Ebene arbeiten zu können. Notes hat ein abstraktes Modell um Daten in Dokumenten und "Datenbanken" (was nicht etwas SQL-Datenbank meint) abzulegen. Schau dir mal die Basis-Objekthierarchien von in dem von mir genannten PDF an. Da wirst du nichtmal das Wort E-Mail oder Memo finden.....
Natürlich kannst du jetzt versuchen auf den Notes-Tabellen rumzumachen, aber ich möchte behaupten, dass dies noch weitaus komplexer ist, als mit der COM-Api.
Ich will dich nicht entmutigen, aber "mal eben" ein paar Daten aus Notes auszulesen -egal mit welcher Technologie - ist vermutlich ohne einige Vorkenntnisse ein hoffnungsloses Unterfangen.
ich hab 5 1/2 monate zeit ^^ und es gibt kein ERD zur Datenbank... und kein Material ausser inet... sagen wir mal so, entmutigen ist noch leicht untertrieben... ich bin leicht in panik ^^
Original von Mora
ich hab 5 1/2 monate zeit ^^ und es gibt kein ERD zur Datenbank... und kein Material ausser inet... sagen wir mal so, entmutigen ist noch leicht untertrieben... ich bin leicht in panik ^^
Dann würde ich empfehlen, du suchst dir eine Schulung heraus, und machst einen einwöchigen Notes-Crash-Kurs. Danach wirst du Notes verstehen und kannst mit der COM-API arbeiten. Das hat auch den Vorteil, dass du schon den Schulungstypen anbohren kannst. Der wird dir bestimme gute Tipps zur konkreten Umsetzung geben können. Consulting quasi umsonst.
Ich schildere mal genau mein Problem:
Ich habe ein c#-prog
string connectionString = "Driver={Lotus NotesSQL 3.02j (32-bit) ODBC DRIVER (*.nsf)}; Server=server; Database=mail/name.nsf; Uid=vorname nachname; Pwd=passwort";
System.Data.Odbc.OdbcConnection connection = new System.Data.Odbc.OdbcConnection(connectionString);
System.Data.Odbc.OdbcCommand command = new System.Data.Odbc.OdbcCommand();
connection.Open();
command.Connection = connection;
System.Data.Odbc.OdbcDataAdapter adapter = new System.Data.Odbc.OdbcDataAdapter(command);
adapter.SelectCommand.CommandText = "select * from appointment";
System.Data.DataSet dataSet = new DataSet();
adapter.Fill(dataSet);
connection.Close();
wenn ich es starte, läuft es bis zu
connection.Open();
und wirft dann folgende Fehlermeldung aus:
ERROR [IM002] [Microsoft][ODBC Driver Manager] Der Datenquellenname wurde nicht gefunden, und es wurde kein Standardtreiber angegeben
liegt es jetzt an meinem Connection String, der ODBC-Installation oder am Server?
ODBC-Datenquellen müssen explizit in der Systemsteuerung (Verwaltung/ODBC) definiert werden (im Prinziop sagt man: Datenquelle XYZ ist Datenbank sowieso vom Typ Z, nehme diesen Treiber). Suche mal "ODBC" und "Datenquelle", da wird genau beschrieben wie man das macht.
Das Problem ist doch, dass Lotus Notes ein recht komplexes Modell seiner Daten hat (wer mit Lotus nur mal gearbeitet fragt sich, warum ein E-Mail-Programm zu ungeheuer kompliziert sein muss - muss es,weil es eben eigentlich gar keine E-Mail-Programm ist, wird nur dazu benutzt).
in vieler Hinsicht, Microsoft Produkten noch überlegen....
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
Original von svenson
ODBC-Datenquellen müssen explizit in der Systemsteuerung (Verwaltung/ODBC) definiert werden (im Prinziop sagt man: Datenquelle XYZ ist Datenbank sowieso vom Typ Z, nehme diesen Treiber). Suche mal "ODBC" und "Datenquelle", da wird genau beschrieben wie man das macht.
hab ich getan, dummerweise erlaubt es nur ein hinzufügen unter Datei-DSN... System- und Benutzer-DSN geben beim Versuch, die Datenquelle hinzuzufügen eine Fehlermeldung aus. Ist das immer so, oder benutze ich einfach einen falschen odbc-Treiber?
Keine Ahnung, aber hier würde ich das Internet bemühen. Gibt sicher Hilfen zur Anbindung von Notes via ODBC und auch die Einrichtung der Quelle.
Vielleicht findest Du in den Suchresultaten Lotus Domino & ODBC Driver was nützliches.
Grüsse
Daniel
Space Profile
Wer nicht fragt, der nicht gewinnt
Hallo,
ich lese jetzt erst zwei Wochen hier (leider nicht früher entdeckt), aber das ist schon die zweite Notesfrage.
Bei LDO kann ich zwar Daten wie Datenbankname etc. auslesen, aber komme nicht an die Felder ran smile
Du hast also schon ein Sessionobject, eine erfolgreiche Verbindung zur Notesdatenbank in C#.Ja? Rechte und Rollen zum lesen hast Du auch,Ja?
Die Notesdatenbank erlaubt den Zugriff über Com etc.,Ja?
Wenn ja, dann ist das sehr gut und du bist mit deiner Diplomarbeit fast fertig. 😁
Nun folgendes
Kopieren, C#tauglich machen und fertig.
Für den Tiefgang mußt du dich aber mit der Objekthirachie beschäftigen.
Hier zur Vollständigkeit für den Mitleser einige Links die zur Noteswelt führen und immer Beachtung finden sollten:
DominoDesinger:
http://www-10.lotus.com/ldd/notesua.nsf/find/designer
Foren:
http://www-128.ibm.com/developerworks/lotus/community/
Toolkits:
http://www-128.ibm.com/developerworks/lotus/downloads/toolkits.html
Wenn es garnicht geht, dann Bescheid geben und ich werde mir mal nächste Woche den Notesbettel(Version 6) runterladen und es ausprobieren. Wollte ich eh mal wieder machen.
So, nun muß ich aber Schluss machen und mein DataGridView und andere Problem angehen und mich als blutiger C#Anfänger auch durch das Forum wühlen.
Ciao
Hallo,
habe mal ein kleines Beispiel fertig gemacht wie es hier bei mir definitiv über COM bis auf wenige Ausnahmen geht.
Zu den Ausnahmen komme ich gleich zurück.
Hier der Code:
/*
*
* falangkinjau
* Date: 03.11.2006
* Time: 21:44
*
* Kurzes Beispiel zum Auslesen und Schreiben eines Notesdokuments.
* Ich betone Beispiel wegen der hardcodierten Parameter, Prüfen auf null etc.
* Das Beispiel wurde nur lokal getestet.
*
Vorher prüfen: UMGEBUNG; UMGEBUNG; UMGEBUNG siehe hier die wirklich ausreichende Notesdoku auf den Seiten von developerworks von ibm
* 1. ob in der Umgebungsvariable der Path zum Notesverzeichnis gesetzt ist.
* 2. Am NotesClient unter File/Security/UserSecurity gleich auf dem ersten Tab folgenden Checkbox setzen: Do not Prompt for Password...
*
* Meine Testumgebung:
* NotesClient 6.5.4a
* VS2005
* Notesdatenbank mit Template vom Adressbuch
*
* Achtung: Mit SharpDeveloper 2.1b geht es nicht.
*/
using System;
using System.Collections.Generic;
//Lotus Domino
using Domino;
namespace NotesTest
{
class MainClass
{
public static void Main(string[] args)
{
try
{
//Initialisiere die Notessession
NotesSession session = new Domino.NotesSessionClass();
//Passwort des Users, der als letztes am Client war. Der entsprechende Username wird aus der Notes.ini gezogen.
//Die Ini liegt im Notespath
//Es gibt hier noch andere Möglichkeiten, das würde hier aber eindeutig den Rahmen sprengen.
session.Initialize("xxx");
//Datenbank holen, die bearbeitet werden soll. In meinem Beispiel eine Adressendatenbank
NotesDatabase db = session.GetDatabase("", "xxx.nsf", false);
//Das View holen wo die Kontakte sind
NotesView view = db.GetView("Contacts");
//Das erste Dokument reicht uns und ich gehe davon aus das mindestens ein Kontakt vorhanden ist.
NotesDocument doc = view.GetFirstDocument();
//Beispiel ein Dokument auslesen
//Feld LastName ausgeben, wir wissen das es ein String ist
Console.WriteLine(String.Format( "Name:{0}, Vorname:{1}" ,
doc.GetFirstItem("LastName").Text.ToString(),
doc.GetFirstItem("FirstName").Text.ToString()));
//Beispiel Feld ändern, merkt euch aber was vorher drin war!
doc.ReplaceItemValue("LastName", DateTime.Now.Minute.ToString());
doc.ReplaceItemValue("FirstName", DateTime.Now.Second.ToString());
//Kontrollausgabe
Console.WriteLine(String.Format("Name:{0}, Vorname:{1}",
doc.GetFirstItem("LastName").Text.ToString(),
doc.GetFirstItem("FirstName").Text.ToString()));
//LastName und FirstName sind reale Felder die im Formdesigner erstellt wurden sind. So was wie Columns in SQL-DB's
//die Änderung ist nun zu sehen, ABER noch nicht gespeichert !WICHTIG!
//dazu muß noch folgende Funktion aufgerufen werden.
doc.Save(true, false, false);
//Tipp den nicht alle Notesgurus kennen: Im Document kannst du alles ablegen was dir beliebt.
//Es ist während der Session da.
//Muss das Dokument dann doch gespeichert werden, dann beseitigt man zuvor seine Spuren wieder mit Remove.
//Man muss nicht unnötig Formfelder im Designer anlegen.
//Notesdatenbanken sind garnicht so langsam wenn nicht für alles ein Feld angelegt wird die der Entwickler so braucht.
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
}
}
Und nun zu den Ausnahmen:
Ursprünglich wollte ich im Beispiel durch die Items eines Notesdokuments mit foreach laufen und diese ausgeben. Felder sind auch Items.
Mit Lotusscript, Java und VB geht das.
Mit C# wahrscheinlich auch, aber dazu sind meine Kenntnisse in C# noch zu gering.
Beispiel:
...initialisiere
NotesDocument doc = ...;
foreach (NotesItem item in doc.Items)
{
doSomething();
}
Wenn ich über doc.Items gehe zeigt der mir an "object IDocument.Items" und da meckert der Compilier. ?(
doc.Items gibt also ein object zurück. Gut, wenn ich das Object caste oder wie auch immer ich komme nicht an meine geliebten items.
Schrecklich nicht durch eine Schleife laufen zu können. 😭
Ein schönes Wochenende wünscht Euch
falangkinjau
hi
ich musste mal eine LotusNotes Anwendung machen, die Daten aus einer Datenbank ausliest und dann daraus Dokumente erstellt.
Die Anwendung habe ich mit dem LotusNotes Designer glaub ich gemacht (ist schon lange her) war dann so zu sagen eine LotusNotesDatenbank-Anwendung.
Zum auslesen der Datenbank habe ich Java-Agenten benutzt.
Java-Agenten=Kleine selbständige Programme die mit dem Hauptprogramm zusammen arbeiten.
Wenn du interesse hast kann ich dir mal noch ein paar infos schicken.
Sooo... man muss nur lange genug rumbasteln 🙂
ich hab jetzt den Zugriff per NotesSQL(ODBC) hinbekommen. Nur jedesmal, wenn ich versuche, ihm ein Statement zu übergeben (SELECT * FROM ...) bekomme ich eine Fehlermeldung, dass er die Tabelle nicht erkennt (also das hinter dem FROM).
Problem ist also, dass ich nicht weiss, wie Notes seine Daten sortiert. Also was in Notes einer SQL-Tabelle am nächsten kommt. ... Ehrlich gesagt, hab ich keine Ahnung, wie ich das erklären soll ^^
Ich habe es mit
SELECT * FROM $All
versucht. Ergebniss: Fehlermeldung
Nach lesen der Hilfe von NotesSQL habe ich es mit
SELECT $All
versucht. Noch ne schlimmere Fehlermeldung (Syntax error, war aber klar ^^)
Achja, $All ist eine View im Notes Designer ^^
Nun die Frage, hat jemand Erfahrungen damit, und kann mir vielleicht sagen, wie ich über SQL die Notes-"Tabellen" ansprechen kann?
MfG
mora
Namen mit Sonderzeichen müssen bei SQL in eckige Klammern gefasst werden:
SELECT * FROM [$All]
Das hier hilft Dir vielleicht: http://www-12.lotus.com/ldd/doc/domino_notes/7.0.2/rn702.nsf
ok... so langsam nervt das... nun klappt zwar die Übergabe eines Statements, ich kann auch Select und Delete drüber jagen, was er auch brav macht, aber sobald ich ein Insert oder Update mache, bekomme ich folgende witzige Fehlermeldung:
ERROR [HY000] [Lotus][ODBC Lotus Notes]Column is not updatable - $147
Aber ist nicht auch ein Delete ein "update" der datenbank? voll verwirrend ^^
Hier mal der Code, vielleicht mach ich irgendwas grundlegend falsch ^^
// SQL Statements | J = geht, N = geht nicht | zur Benutzung Auskommentierung entfernen
// J //string sqlcommand = "SELECT * FROM Calendar";
// N //string sqlcommand = "INSERT INTO Calendar ($147) VALUES ('test')";
// N //string sqlcommand = "UPDATE Calendar SET $147 = 'test'";
// J //string sqlcommand = "DELETE FROM Calendar";
System.Data.Odbc.OdbcConnection connection = new System.Data.Odbc.OdbcConnection(connectionString);
System.Data.Odbc.OdbcCommand command = new System.Data.Odbc.OdbcCommand(sqlcommand);
connection.Open();
command.Connection = connection;
System.Data.Odbc.OdbcDataAdapter adapter = new System.Data.Odbc.OdbcDataAdapter(command);
System.Data.DataSet dataSet = new DataSet();
adapter.Fill(dataSet);
connection.Close();
dataGridView1.DataSource = dataSet.Tables[0];
Mein Problem ist einfach, dass ich nicht weiss, ob es an den Rechten liegen kann, die ich auf der "Datenbank" habe. Aber warum sollte ich alles und jeden löschen dürfen, aber nicht etwas neues eintragen. vor allem, weil es MEINE Datenbank ist. Da sollte ich die Rechte haben, da ich ja auch aus Notes herraus einen neuen Termin anlegen kann.
Hallo,
beim Durchsuchen dieses Themas habe ich über das Beispiel sehr gefreut, es währe ein super Ansatz zur Lösung meines Problems. Mir geht es auch darum Daten aus einer Notes DB bzw eines *.nsf Files zu lesen. Leider bekomme ich beim kompilieren die Fehlermeldung dass der Namespace "use Domino" unbekannt ist. Hier also meine Frage, woher oder wie kann ich den Namespace Domino nutzen?
Meine Entwicklungsumgebung ist Visual Studio 2005, mit dot.NET 2.0
Es brennt.. ⚠
Schönes Wochenende schon mal
ciao
Hast Du auch die Referenz hinzugefügt, oder hast Du einfach nur using geschrieben? Such in der Com-Tab bei den Referenzen nach Lotus Domino oder notes. Ich weiss nicht mehr genau.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.