web-dev-qa-db-fra.com

Comment faire fonctionner Java avec SQL Server?

Je sais que c'est une question fondamentale, mais je n'arrive pas à trouver de réponse et je m'excuse, si cette question est beaucoup trop stupide, mais c'est parti:

Je suis censé travailler avec SQL Server (pas de problème jusqu'à présent) et avec Java (j'adore Java, donc pas de problème ici non plus), mais maintenant: que dois-je faire pour faire la combinaison J'ai obtenu: JRE 1.6 et sqljdbc4.jar ... Avant de mettre sqljdbc4.jar dans mon chemin de classe, j'avais sqljdbc.jar et avec un test- programme j'ai eu cette exception:

21.08.2009 09:26:59 com.Microsoft.sqlserver.jdbc.SQLServerConnection <init>
SCHWERWIEGEND: Die Java-Laufzeitumgebung (Java Runtime Environment, JRE), Version 1.6,
wird von diesem Treiber nicht unterstützt. Verwenden Sie die Klassenbibliothek 
'sqljdbc4.jar', die Unterstützung für JDBC 4.0 bietet.
Java.lang.UnsupportedOperationException: Die Java-Laufzeitumgebung (Java Runtime 
Environment, JRE), Version 1.6, wird von diesem Treiber nicht unterstützt. Verwenden 
Sie die Klassenbibliothek 'sqljdbc4.jar', die Unterstützung für JDBC 4.0 bietet.
    at com.Microsoft.sqlserver.jdbc.SQLServerConnection.<init>(SQLServerConnection.Java:223)
    at com.Microsoft.sqlserver.jdbc.SQLServerDriver.connect(SQLServerDriver.Java:840)
    at Java.sql.DriverManager.getConnection(Unknown Source)
    at Java.sql.DriverManager.getConnection(Unknown Source)
    at msSqlTest.DB.dbConnect(DB.Java:13)
    at msSqlTest.TestConnection.main(TestConnection.Java:7)

Désolé pour l'allemand ... Cela signifie essentiellement que je devrais utiliser sqljdbc4.jar, car le JRE que j'utilise n'est pas pris en charge par le pilote. J'ai donc mis sqljdbc4.jar dans mon chemin de classe, mais cela n'a pas fonctionné, donc je suis un peu perdu, ce que je pouvais faire.

Peut-être que quelqu'un pourrait dire que je devrais être à l'abri des idiots :(

Oh ouais, voici l'application de test que j'utilise:

import Java.sql.*;

public class TestConnection{
    public static void main(String[] args){
        // Neue DB und los geht's :)
        DB db = new DB();
        db.dbConnect("jdbc:sqlserver://localhost:1433/muff", "user", "pw" );
    }
}

class DB{
    public void dbConnect(  String db_connect_string, 
                            String db_userid, 
                            String db_password){
        try{
        Class.forName( "com.Microsoft.sqlserver.jdbc.SQLServerDriver" );
            Connection conn = DriverManager.getConnection(
                            db_connect_string, 
                        db_userid, 
                        db_password);
            System.out.println( "connected" );
        }
        catch( Exception e ){
            e.printStackTrace();
        }
    }
};
32
doro

Avez-vous essayé le pilote jtds pour SQLServer?

28
oxbow_lakes

Ne placez pas à la fois l'ancien sqljdbc.jar et le nouveau sqljdbc4.jar dans votre chemin de classe - cela rendra (plus ou moins) imprévisible quelles classes sont utilisées, si ces deux JAR contiennent des classes avec les mêmes noms qualifiés.

Vous avez dit que vous avez mis sqljdbc4.jar dans votre chemin de classe - avez-vous supprimé l'ancien sqljdbc.jar du chemin de classe? Vous avez dit "ça n'a pas marché", qu'est-ce que cela signifie exactement? Êtes-vous sûr de ne pas avoir quelque part l'ancien JAR dans votre chemin de classe (peut-être pas explicitement)?

8
Jesper

Peut-être un peu tard, mais l'utilisation de pilotes différents est exagéré pour un cas d'erreur utilisateur:

db.dbConnect("jdbc:sqlserver://localhost:1433/muff", "user", "pw" );

devrait être l'un de ces éléments:

db.dbConnect("jdbc:sqlserver://localhost\muff", "user", "pw" );

(en utilisant un canal nommé) ou:

db.dbConnect("jdbc:sqlserver://localhost:1433", "user", "pw" );

en utilisant directement le numéro de port; vous pouvez laisser de côté 1433 car c'est le port par défaut, laissant:

db.dbConnect("jdbc:sqlserver://localhost", "user", "pw" );
2
Bart de Kort

Pour quiconque google toujours cela, allez dans\blackboard\config\Tomcat\conf et dans wrapper.conf mettez une ligne supplémentaire dans wrapper.Java.classpath pointant vers sqljdbc4.jar, puis mettez également à jour wrapper.conf.bb

Redémarrez ensuite les services de tableau noir et Tomcat et cela devrait fonctionner

Cela ne fonctionnera pas en définissant simplement votre Java classpath, vous devez le configurer dans les fichiers de configuration du tableau noir pour pointer vers votre fichier jar avec la bibliothèque jdbc

2
Andrew McDonald

Le pilote que vous utilisez est le pilote MS SQL Server 2008 (sqljdbc4.jar). Comme indiqué dans la page MSDN, cela nécessite Java 6+ pour fonctionner.

http://msdn.Microsoft.com/en-us/library/ms378526.aspx

la bibliothèque de classes sqljdbc4.jar nécessite un Java Runtime Environment (JRE) de la version 6.0 ou ultérieure.

Je suggère d'utiliser le pilote 2005 dans lequel je crois que se trouve (sqljdbc.jar) ou comme Oxbow_Lakes le dit, essayez le pilote jTDS ( http://jtds.sourceforge.net/ ).

2
pjp

J'ai eu le même problème avec un client de mon entreprise, le problème était que le pilote sqljdbc4.jar, essaye une conversion de caractère entre la base de données et le pilote. Chaque fois qu'il a fait une requête à la base de données, maintenant vous pouvez imaginer 650 connexions simultanément, cela a fait mon système très très lentement, pour éviter cette situation, j'ajoute à la chaîne de connexion le paramètre suivant:

 SendStringParametersAsUnicode=false, then te connection must be something like url="jdbc:sqlserver://IP:PORT;DatabaseName=DBNAME;SendStringParametersAsUnicode=false"

Après cela, le système est très très rapide, car les utilisateurs sont très satisfaits du changement, j'espère que ma contribution sera la même.

1
Jorge Sanchez

Effectivement. Le fait est que la version 2008 R2 est très délicate. Le pilote JTD semble fonctionner dans certains cas. Dans un certain serveur, le jTDS a bien fonctionné pour une instance 2008 R2. Dans un autre serveur, cependant, j'ai dû utiliser le pilote JBDC de Microsoft sqljdbc4.jar. Mais alors, cela ne fonctionnerait qu'après avoir défini l'environnement JRE sur 1.6 (ou supérieur).

J'ai utilisé 1.5 pour l'autre serveur, j'ai donc perdu beaucoup de temps à ce sujet.

Problème délicat.

0
Pedro Guimrães

Si vous utilisez sqljdbc4.jar, utilisez le code suivant

ResultSet objResultSet = objPreparedStatement.getResultSet();
if (objResultSet == null) {
  boolean bResult = false;
  while (!bResult){
    if (objPreparedStatement.getMoreResults()){
      objResultSet = objPreparedStatement.getResultSet();
      bResult = true;
    }
  } 
}
objCachedRowSet = new CachedRowSetImpl();
objCachedRowSet.populate(objResultSet);
if (CommonUtility.isValidObject(objResultSet)) objResultSet.close();
objResultSet = null;
0
anandan