Zugriff vom Dominoserver auf einen MS SQL-Server

  • der treiber ist richtig - ich lade immer die setup.exe herunter, die installiert lokal alle dateien und dann habe ich auch gleich die jar-archive vorliegen. ich denke, du müßtest die tar-datei entpacken, da sind die jars bestimmt drin. aktuell ist aber glaube ich schon sp4.


    im designer-programmierfenster gibt es unten links einen punkt "projekt bearbeiten". hier kannst du deinem projekt zusätzliche archive hinzufügen. wenn das geschehen ist, muß die zusätzlich über import java.blabla.*; die richtigen klassen einbinden.


    ich sehe mal zu, dass ich morgen den code poste, dann bin ich auf der arbeit und habe meine sourcen. schönen vatertag noch :D

  • so funktioniert es bei mir.


    eintrag in der notes.ini vom Domino:
    JavaUserClasses=G:\JDK1.3\lib\mssqlserver.jar;G:\JDK1.3\lib\msutil.jar;G:\JDK1.3\lib\msbase.jar
    kann man natürlich auch in der notes.ini vom client eintragen, dann sollte das einbinden der jars über 'projekt bearbeiten' entfallen. - nicht als letzten eintrag -


    und dann die connection zu mssql. ich habe den code von unnötigem balast befreit (einiges ist glaube ich immernoch überflüssig) um nur die connection herzustellen. ich hoffe, dass ich nichts wichtiges gelöscht habe. der eigentlich agent tut noch mehr und ich war bisher zu faul, die connection in eine eigene klasse auszugliedern. wichtig ist das 'deregister' am ende, sonst läuft die irgendwann der drivermanager über, bzw. kriegst du ein problem wenn mehrere apps den gleichen jdbc treiber benutzen.


    import lotus.domino.*;
    import java.sql.*;
    import com.microsoft.jdbc.sqlserver.*;
    import java.io.*;
    import java.util.*;


    public class JavaAgent extends AgentBase {


    public void NotesMain() {
    try {
    Connection con = null;
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();
    Database db = agentContext.getCurrentDatabase();
    Document doc = agentContext.getDocumentContext();
    PrintWriter pw = getAgentOutput();


    Driver drv = (Driver)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
    Properties p = new Properties();
    p.put( "user", "USERNAME" );
    p.put( "password", "PASSWORD" );
    con = drv.connect("jdbc:microsoft:sqlserver://SERVERIP:1433;databasename=DBNAME", p);


    if(!con.isClosed())
    System.out.println("Datenbanktverbindung zum SQLServer über TCP/IP hergestellt ...");
    Statement stmt = con.createStatement();
    String s = "SELECT WHATEVER";

    ResultSet rs = stmt.executeQuery(s);

    // was immer mit den Daten getan werden soll

    rs.close();
    stmt.close();
    con.close();

    System.out.println("Datenbankverbindung abgebaut ...");

    DriverManager.deregisterDriver(drv);

    } //END Try

    catch(Exception e)
    {
    e.printStackTrace();
    } //END Catch
    } // END NotesMain
    } // END Agent

  • Hi, schönen Dank für den Code.


    Ich habe den jetzt mal ein wenig geändert (mit ein paar Ausgaben versehen), damit ich dem Problem auf die Schliche kommen kann.
    Der Agent sieht so aus (ich habe die jar's dem Projekt hinzugefügt)


    import lotus.domino.*;
    import java.sql.*;
    import com.microsoft.jdbc.sqlserver.*;
    import java.io.*;
    import java.util.*;


    public class JavaAgent extends AgentBase {


    public void NotesMain() {


    try {
    System.out.println("Import recordsets from ms SQL ...");
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();


    // (Fügen Sie Ihren Code hier ein)
    Connection con = null;
    Database db = agentContext.getCurrentDatabase();
    Document doc = agentContext.getDocumentContext();
    System.out.println("load driver ...");

    Driver drv = (Driver)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
    Properties p = new Properties();
    System.out.println("set properties ...");

    p.put( "user", "sa" );
    p.put( "password", "????" );

    System.out.println("connecting ...");


    con = drv.connect("jdbc:microsoft:sqlserver://192.168.0.195:1433;databasename=PersonalDB", p);


    if(!con.isClosed())
    System.out.println("Datenbanktverbindung zum SQLServer über TCP/IP hergestellt ...");
    Statement stmt = con.createStatement();
    String s = "SELECT * FROM Personen";


    ResultSet rs = stmt.executeQuery(s);


    // was immer mit den Daten getan werden soll


    rs.close();
    stmt.close();
    con.close();


    System.out.println("Datenbankverbindung abgebaut ...");


    DriverManager.deregisterDriver(drv);
    } catch(Exception e) {
    System.out.println("Error ...");
    e.printStackTrace();
    }
    }
    }


    Wenn ich den Agent nun periodisch laufen lasse, kommt das:


    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') printing: Import recordsets from ms SQL ...
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') printing: load driver ...
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') printing: set properties ...
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') printing: connecting ...
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') printing: Error ...
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at com.microsoft.jdbc.sqlserver.tds.TDSConnection.<init>(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at JavaAgent.NotesMain(JavaAgent.java:31)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at lotus.domino.AgentBase.runNotes(Unknown Source)
    06.05.2005 20:09:10 AMgr: Agent ('Import-MS-SQL-JDBC' in 'Test.nsf') error message: at lotus.domino.NotesThread.run(NotesThread.java:215)


    Will heissen, dass er bis zu dem Punkt, wo er die Verbindung aufbaut kommt, aber dann abschmiert. Das Kennwort ist aber definitiv richtig, denn via Excel komme ich bspws. an die SQL Daten.


    Irgendwie werde ich das Gefühl nicht los, als wenn es eventuell an meinem unsupporteten Debian Linux liegen könnte.


    Nur wie kann ich den Agent denn vom Client debuggen?
    Kann ich den nicht irgendwie von Hand starten und am Client die Ergebnisse sehen?


    Sorry, dass ich so dumm frage, aber jeder fängt mal an. :)


    cu


    Jörg

  • also ich habe mir nochmal den ganzen thread durchgelesen, weil ich nicht so ganz glauben konnte, dass du einen MSSQL Datenbankserver unter Debian betreibst und nun bin ich nicht gerade schlauer...da ist mal von MySQL die rede und mal von MSSQL. Der Treiber funktioniert natürlich nur bei einem MSSQL Server und ich habe es auch noch nie mit Linux probiert - evtl. kann es auch am setup des MSSQL Servers liegen, da kann man auch noch so einiges einstellen, kenne ich mich aber nicht richtig mit aus, da ich kein DBAdmin bin. Wenn du einen MySQL Datenbankserver verwendest, solltest du auch den Treiber für MySQL verwenden - das wäre dann der MySQL Connector/J (gibt es direkt unter mysql.com). ich würde erstmal telnet oder nmap auf port 1433 machen, ob der MSSQL Server dort erreichbar ist. .... und dumme fragen gibt es bekanntlich nicht. ;)

  • okay, dann fange ich mal von vorne an:


    Mein Server A ist ein Debian Linux Server mit einem Domino 6.5.4. Dann gibts den Server B, der unter Windows 2000 läuft und einen MS SQL-Server 2000 hat.
    Nun will ich von einer Notes DB auf Server A Daten des SQL Servers auf Server B abholen.


    Da ich dachte, dass es eventuell an dem Debian Linux liegen könnte, darum habe ich halt mal auf Server B einen Dominoserver installiert und die Datenbank repliziert.
    Aber bei beiden Servern entsteht die angegebene Meldung.


    Vergiss den MySQL Server, dass war mal ein Test für zwischendurch.


    Also eigentlich ganz einfach was ich will. Und was Du schon beschrieben hast, scheint genau das zu sein, was ich will. Aber es funktioniert nicht. =:(


    nmap zeigt den Port 1433 an und ein telnet geht auch.

  • // jtds-1.0.3.jar in den Agent importieren
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;


    import lotus.domino.AgentBase;
    import lotus.domino.AgentContext;
    import lotus.domino.Database;
    import lotus.domino.DateTime;
    import lotus.domino.Document;
    import lotus.domino.DocumentCollection;
    import lotus.domino.Session;

    public class JavaAgent extends AgentBase {
    private Connection conn = null;
    Statement stmt = null;
    Document doc = null;

    public void NotesMain() {
    try {
    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();


    Database db = agentContext.getCurrentDatabase();
    final String server = "192.168.100.80:1433";
    final String sqldb = "KHK";
    final String usr = "sa";
    final String pwd = "xx";
    String connStr = "jdbc:jtds:sqlserver://" + server + "/" + sqldb;
    Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
    conn = DriverManager.getConnection(connStr, usr, pwd);
    stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
    ......


    stmt.close();
    conn.close();
    }
    catch(Exception e) {e.printStackTrace(); }
    } // main

  • Der Connect-String sollte zum Test eigentlich erstmal so aussehen:
    ... .getConnection ("jdbc:microsoft:sqlserver://serveradresse:1433",
    "user", "pass" );


    Wenn das geht dann kann man eine bestimmte DB ergänzen, das sähe dann so aus:
    ... .getConnection ("jdbc:microsoft:sqlserver://serveradresse:1433;databaseName=MeineDB", "user", "pass" );


    zu beachten:


    - Groß- & Kleinschreibung ist bei Java immer wichtig!
    - SQL Server 2000 authentication mode darf NICHT auf Windows authentication eingestellt sein sondern auf Mixed Mode!

  • Hi,


    so ganz leuchtet mir die Sache nu wirklich nicht mehr ein.


    Hier tauchen ja auf einmal neue Aspekte auf.
    Beim Thread #28 kommt auf einmal ein Treiber "net.sourceforge.jtds.jdbc.Driver" auf. Nun gut, das kann ich ja akzeptieren, dass die M$-Klamotten nichts taugen.


    Nur leider läuft die Sache bei mir immer noch nicht. Ich habe mir die jtd-1.0.3.jar gezogen und dem Projekt hinzugefügt. Die Imports habe ich auch angepasst und der Code sieht so aus:


    Session session = getSession();
    AgentContext agentContext = session.getAgentContext();

    Connection con = null;
    Statement s = null;
    // Variante 1
    System.out.println("connStr = ......");
    String connStr = "jdbc:jtds:sqlserver://192.168.0.195/";
    System.out.println("Class.forName ..........");
    Class.forName("net.sourceforge.jtds.jdbc.Driver").newInstance();
    System.out.println("con = DriverManager..........");
    con = DriverManager.getConnection(connStr, "sa", "xx");
    System.out.println("s = con.create ..........");
    s = con.createStatement();


    Die letzte Ausgabe, die ich auf der Serverkonsole sehe ist "Class.forName ........."
    Danach kommen folgende Meldungen:


    java.lang.ExceptionInInitializerError:
    java.lang.SecurityException: java.specification.version
    at lotus.notes.AgentSecurityManager.checkPropertyAccess(AgentSecurityManager.java:551)
    at java.lang.System.getProperty(System.java:601)
    at net.sourceforge.jtds.jdbc.Driver.<clinit>(Driver.java:60)
    at java.lang.Class.forName1(Native Method)
    at java.lang.Class.forName(Class.java:142)
    at JavaAgent.NotesMain(JavaAgent.java:35)
    at lotus.domino.AgentBase.runNotes(Unknown Source)
    at lotus.domino.NotesThread.run(NotesThread.java:218)


    Dann wollte ich mal den Tip von CarstenH (Thread #29) ausprobieren und habe den M$-Treiber wieder ins Spiel gebracht:


    System.out.println("connecting ...");
    Driver drv = (Driver)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
    con = drv.connect("jdbc:microsoft:sqlserver://192.168.0.195:1433", "sa", "xx");


    Nur das kann er schon nicht kompileren, denn in der letzten Zeit stimmt die Anzahl der Parameter nicht.


    Und wenn ich aus dem connect("....") ein


    con = drv.GetConnection("jdbc:microsoft:sqlserver://192.168.0.195:1433", "sa", "password");


    mache, sagt er mit, dass es diese Methode nicht gibt.


    Also flott wieder das gebaut:


    System.out.println("connecting ...");
    Driver drv = (Driver)Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
    Properties p = new Properties();
    System.out.println("set properties ...");
    p.put( "user", "sa" );
    p.put( "password", "xx" );
    con = drv.connect("jdbc:microsoft:sqlserver://192.168.0.195:1433", p);


    und die Fehlermeldungen kommen:


    java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Error establishing socket.
    at com.microsoft.jdbc.base.BaseExceptions.createException(Unknown Source)
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)
    at com.microsoft.jdbc.sqlserver.tds.TDSConnection.<init>(Unknown Source)
    at com.microsoft.jdbc.sqlserver.SQLServerImplConnection.open(Unknown Source)
    at com.microsoft.jdbc.base.BaseConnection.getNewImplConnection(Unknown Source)
    at com.microsoft.jdbc.base.BaseConnection.open(Unknown Source)
    at com.microsoft.jdbc.base.BaseDriver.connect(Unknown Source)
    at JavaAgent.NotesMain(JavaAgent.java:48)
    at lotus.domino.AgentBase.runNotes(Unknown Source)
    at lotus.domino.NotesThread.run(NotesThread.java:218)


    Also so langsam bin ich am verzweifeln.
    Groß- und Kleinschreibung habe ich auch beachtet und der SQL läuft auch im Mixed Mode.

  • Mhh - das mit der falschen Parameterzahl ist seltsam. Aber Ok - mal ein paar Fragen:


    Socket Error zeugt ja von einer netztechnischen Problematik (kann aber auch heißen: Zugriff verweigert).


    Hast du das oben erwähnte SP3a aufgespielt? In mehreren Foren wird das als Lösung genannt.


    Kontrolliert ob IP/Port wirklich offen sind und ohne Firewallblockade auf der SQL Maschine?


    Hast du mal von einer anderen Maschine manuell z.B. via ODBC ein Connect versucht (und hinbekommen)?

  • Hi,


    SP3a ist aufgespielt. Der läuft nun als Version 8.00.760 (SP3) ?!?! Gedownloaded habe ich allerdings SP3a.


    IP und Port sind offen. Ich habe mal von meinem normalen PC mit Excel eine neue Verbindung zum 192.168.0.195 via ODBC hergestellt und Daten mit dem sa-Account in Excel importiert.


    Das sieht also alles gut aus, halt nur der Agent nicht.