SQL-Anbindung & SSPI

Lautsprecher

Erfahrenes Mitglied
Hallo,
ich benutze momentan folgendes Programm für eine Anbindung an den
MS SQL-Server in unserer Firma.

Code:
import java.io.*;
import java.sql.*;
import net.sourceforge.jtds.util.SSPIJNIClient;

public class DbShow
{
  public static void main( String[] argv )
  {
    String sDbDrv=null, sDbUrl=null, sTable=null, sUsr="", sPwd="";
    if( 3 <= argv.length ) {
      sDbDrv = argv[0];
      sDbUrl = argv[1];
      sTable = argv[2];
      if( 4 <= argv.length )  sUsr = argv[3];
      if( 5 <= argv.length )  sPwd = argv[4];
    } else {
     /* try {
        BufferedReader in = new BufferedReader(
                            new InputStreamReader( System.in ) );*/
        /*System.out.println( "Name des Datenbanktreibers eingeben (z.B. org.gjt.mm.mysql.Driver):" );*/
        sDbDrv = "net.sourceforge.jtds.jdbc.Driver";
      /*  System.out.println( "Url der Datenbank eingeben (z.B. jdbc:mysql://localhost:3306/MeineDb):" );*/
        sDbUrl = "jdbc:jtds:sqlserver://SDEUTTPDISYS1:1433:WU_Daten";
       /* System.out.println( "Name der Tabelle eingeben (z.B. MeineTestTabelle):" );*/
        sTable ="Zeiterfassung";
       /* System.out.println( "Benutzername (z.B. root):" );*/
        sUsr = "";
       /* System.out.println( "Passwort (z.B. mysqlpwd):" );*/
        sPwd = "";
      /*} catch( IOException ex ) {
        System.out.println( ex );
      }*/
    }
    if( null != sDbDrv && 0 < sDbDrv.length() &&
        null != sDbUrl && 0 < sDbUrl.length() &&
        null != sTable && 0 < sTable.length() ) {
      Connection cn = null;
      Statement  st = null;
      ResultSet  rs = null;
      try {
        // Select fitting database driver and connect:
        Class.forName( sDbDrv );
        cn = DriverManager.getConnection( sDbUrl, sUsr, sPwd );
        st = cn.createStatement();
        rs = st.executeQuery( "select * from " + sTable );
        // Get meta data:
        ResultSetMetaData rsmd = rs.getMetaData();
        int i, n = rsmd.getColumnCount();
        // Print table content:
        for( i=0; i<n; i++ )
          System.out.print( "+---------------" );
        System.out.println( "+" );
        for( i=1; i<=n; i++ )    // Attention: first column with 1 instead of 0
          System.out.print( "| " + extendStringTo14( rsmd.getColumnName( i ) ) );
        System.out.println( "|" );
        for( i=0; i<n; i++ )
          System.out.print( "+---------------" );
        System.out.println( "+" );
        while( rs.next() ) {
          for( i=1; i<=n; i++ )  // Attention: first column with 1 instead of 0
            System.out.print( "| " + extendStringTo14( rs.getString( i ) ) );
          System.out.println( "|" );
        }
        for( i=0; i<n; i++ )
          System.out.print( "+---------------" );
        System.out.println( "+" );
      } catch( Exception ex ) {
        System.out.println( ex );
      } finally {
        try { if( null != rs ) rs.close(); } catch( Exception ex ) {}
        try { if( null != st ) st.close(); } catch( Exception ex ) {}
        try { if( null != cn ) cn.close(); } catch( Exception ex ) {}
      }
    }
  }

  // Extend String to length of 14 characters
  private static final String extendStringTo14( String s )
  {
    if( null == s ) s = "";
    final String sFillStrWithWantLen = "              ";
    final int iWantLen = sFillStrWithWantLen.length();
    final int iActLen  = s.length();
    if( iActLen < iWantLen )
      return (s + sFillStrWithWantLen).substring( 0, iWantLen );
    if( iActLen > 2 * iWantLen )
      return s.substring( 0, 2 * iWantLen );
    return s;
  }
}

Fehlermeldunge unter jtds-1.1 JDBC-Driver:
Code:
I/O Error: SSO Failed: Native SSPI library not loaded. Check the java.library.path system property
.

Fehlermeldung unter Microsoft JDBC-Driver:
Code:
 [Microsoft][SQLServer 2000 Driver for JDBC]Unable to connect.  Invalid URL

Folgende Schritte wurden schon durch geführt:
(!) Die jar's jtds-1.1, msutil, msbase, mssqlserver in die jre\lib\ext kopiert.
(Verwende momentan die jre_1_5_0_05.)
(!) Diese jar's in das entsprechende Projekt unter Eclipse mit (Add External Jar's etc.)
kopiert
(!) ntlmauth.dll in das Windows\System32 kopiert und registriert.


Wir sind jetzt bei dem Punkt angelangt, dass wir über die SSPIJNIClient.java Klasse nachdenken, da diese ja die Verbindung zu ntlmauth.dll herstellen soll.
Weiß jemand wie es jetzt weiter geht, bzw. ob man die SSPIJNIClient.java anpassen muss, oder sie noch ins Projekt einbinden muss, oder ob diese nicht relevant ist, da es irgendwann mal automatisch laufen sollte.

Helft mir da Bitte weiter, denn sonst bekommt unser Büro noch einen Schreikrampf.

Danke
Hasta luego,
 
Hallo!

Folgendes funktioniert bei mir...
ntlmauth.dll nach Windows\System32 kopieren.
jtds-1.1.jar in den Classpath aufnehmen.
Im SQL Server in der Server Konfiguration unter Security -> Authetication auf "Windows only" stellen.
In der gewünschten Datenbank (z.Bsp. Northwind) unter Users -> New User den Domänen-Benutzer hinzufügen.

Folgender Code meldet sich nun mit den Daten (Benutzername / Passwort) des angemeldeten Windows-Benutzers am entsprechenden SQL Server an der Datenbank Northwind an.
Code:
  package de.tutorials;
  
  import java.sql.Connection;
  import java.sql.ResultSet;
  import java.sql.ResultSetMetaData;
  import java.sql.Statement;
  
  import net.sourceforge.jtds.jdbcx.JtdsDataSource;
  
  public class MSSQLServerNTLMAuthExample {
  
  	/**
  	 * @param args
  	 */
  	public static void main(String[] args) throws Exception {
  
  		Class.forName("net.sourceforge.jtds.jdbc.Driver");
  		
  		JtdsDataSource ds = new JtdsDataSource();
  		ds.setServerName("localhost");
  		ds.setPortNumber(1433);
  		ds.setDatabaseName("northwind");
  		
  		Connection con = ds.getConnection();
  		
  		
  		Statement stmt = con.createStatement();
  		ResultSet rs = stmt.executeQuery("SELECT * FROM Customers");
  		
  		ResultSetMetaData rsmd = rs.getMetaData();
  		int clmCnt = rsmd.getColumnCount();
  		
  		while(rs.next()){
  			for(int i =1; i<=clmCnt;i++){
 				System.out.print(rs.getString(i));
  				System.out.print(" ");
  			}
  			System.out.println();
  		}
  		
  		stmt.close();
  		rs.close();
  		
  		con.close();
  	}
  }

Das ganze kann man übrigens in der Readme.sso im jtdsxxxxxx.jar nachlesen.

Gruß Tom
 
Zurück