web-dev-qa-db-fra.com

JDBC: exemple de connexion simple MSSql ne fonctionne pas

J'apprends Java et j'ai juste besoin d'exécuter quelque chose de simple pour récupérer des données de MSSQL via JDBC. L'exemple de mon livre ne fonctionne pas (mais il a plusieurs années) et l'exemple ci-dessous de MS ne fonctionne pas non plus pour moi:

http://msdn.Microsoft.com/en-us/library/ms378956(v=sql.90).aspx

Voici mon code:

package javasql;
import Java.sql.*;
import Java.util.*;

public class Program {

    private static String url = "jdbc:sqlserver://localhost\\SQLExpress;database=Northwind;integratedSecurity=true;";
    //private static String userName = "sa";
    //private static String password = "myPassword";

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        RunDemo();
    }

    public static void RunDemo() {
        try {
            Class.forName("com.Microsoft.sqlserver.jdbc.SQLServerDriver");
            Connection connection = DriverManager.getConnection(url);

            Statement statement = connection.createStatement();
            ResultSet results = statement.executeQuery("SELECT ProductName, Price FROM Products ORDER BY ProductName");

            while(results.next()) {
                System.out.println("Product Name: " + results.getNString("ProductName") + " Price: $" + results.getFloat("UnitPrice"));
            }

        } catch (ClassNotFoundException | SQLException ex) {
            System.out.println(ex.getMessage());
        }
    }
}

Lorsque j'exécute le code, aucune exception n'est émise. Je l'obtiens simplement dans la fenêtre de sortie:

run:
com.Microsoft.sqlserver.jdbc.SQLServerDriver
BUILD SUCCESSFUL (total time: 0 seconds)

J'utilise NetBeans 7.2. S'il vous plaît, quelqu'un me donne un exemple de travail.

MODIFIER:

À propos, pour la chaîne de connexion, où vous voyez le \\SQLExpress, j'ai essayé de le supprimer et d'utiliser instanceName=SQLExpress à la place .. mais cela n'a aucun effet non plus.

EDIT 2:

OK, j’ai téléchargé le dernier pilote JDBC pour MSSQL à partir de MS et y ai référé les 2 fichiers JAR. Maintenant, je reçois cette sortie:

run:
The connection to the Host localhost, named instance SQLExpress failed. 

Error: "Java.net.SocketTimeoutException: Receive timed out". 

Verify the server and instance names and check that no firewall is blocking UDP traffic to port 1434.  
For SQL Server 2005 or later, verify that the SQL Server Browser Service is running on the Host.
BUILD SUCCESSFUL (total time: 15 seconds)

Progrès .. au moins, nous pouvons voir que nous essayons de nous connecter maintenant, quelqu'un peut-il m'éclairer quant à l'erreur ci-dessus?

EDIT 3:

Deux autres problèmes ont été résolus. Le premier est d'activer le navigateur SQL Server et le second, d'activer TCP/IP pour SQL Server. Merci @Vikdor Maintenant, je reçois cette erreur:

run:
The TCP/IP connection to the Host localhost, port 1433 has failed. Error: "Connection refused: connect. Verify the connection properties. Make sure that an instance of SQL Server is running on the Host and accepting TCP/IP connections at the port. Make sure that TCP connections to the port are not blocked by a firewall.".
BUILD SUCCESSFUL (total time: 15 seconds)

J'ai vérifié le pare-feu Windows et ajouté une règle entrante pour autoriser ce port, mais je reçois toujours l'erreur ci-dessus. Des idées?

EDIT 4:

J'ai essayé la solution dans ce lien: http://www.coderanch.com/t/306316/JDBC/databases/SQLServerException-TCP-IP-connection-Host

Ne plus obtenir d'erreur dans EDIT 3. Maintenant, obtenir un autre ...

run:
Sep 21, 2012 11:33:16 AM com.Microsoft.sqlserver.jdbc.AuthenticationJNI <clinit>
WARNING: Failed to load the sqljdbc_auth.dll cause : no sqljdbc_auth in Java.library.path
This driver is not configured for integrated authentication. ClientConnectionId:577f359e-4774-45f3-96fb-588785911817
BUILD SUCCESSFUL (total time: 14 seconds)

En avoir marre de ça maintenant .. pourquoi Java, pourquoi ?? Sérieusement ... Je suis heureux de travailler principalement avec .NET. Eh bien, quand je trouverai la solution, je la posterai ici pour m'assurer qu'elle peut aider les autres avant qu'ils ne deviennent fous, comme je suis sur le point de le faire ...

EDIT 5:

Cela a aidé: Java à se connecter à MicrosoftSQLServer 2005

Je mets le chemin du répertoire dans ma variable d’environnement PATH. Cela n'a pas fonctionné, alors j'ai aussi placé le sqljdbc_auth.dll dans mon dossier JDK C:\Program Files\Java\jdk1.7.0_04\bin. Résolu.

18
Matt

OK, voici ce qui a résolu mes problèmes:

  1. Téléchargez le dernier pilote MSSQL JDBC à partir d’ici: http://msdn.Microsoft.com/en-us/sqlserver/aa937724.aspx

  2. A référencé les 2 fichiers JAR de mon projet: sqljdbc.jar et sqljdbc4.jar (je ne sais pas encore si les deux éléments ci-dessus sont requis ou si un seul ..)

  3. Assurez-vous que le service Windows du navigateur SQL Server est en cours d'exécution

  4. Ouvrez le Gestionnaire de configuration SQL Server et accédez à Protocols for SQLEXPRESS sous Configuration du réseau SQL Server. Cliquez avec le bouton droit sur TCP/IP et choisissez Propriétés. Définissez Enabled = YES.

  5. Pendant que vous y êtes, cliquez sur l'onglet Adresses IP et recherchez la section IP All. Définissez TCP Port sur 1433.

  6. Ajoutez sqljdbc_auth.dll à votre variable d’environnement PATH. Dans mon cas: D:\Java\sqljdbc_4.0\enu\auth\x64

  7. Copiez le fichier sqljdbc_auth.dll dans votre répertoire JDK. Dans mon cas: C:\Program Files\Java\jdk1.7.0_04\bin

J'espère que ça aidera quelqu'un.

29
Matt

Merci Enfin, ça marche . Si le message ci-dessous apparaît comme une erreur,

 Verify the server and instance names and check that no firewall is blocking
 UDP traffic to port 1434. For SQL Server 2005 or later,
 verify that the SQL Server Browser Service is running on the Host

S'il vous plaît activer Sql Server Browser par,

Démarrer > Panneau de configuration > Systèmes et sécurité > Outils d'administration > Services

Sélectionnez Navigateur SQL Server Cliquez avec le bouton droit de la souris et sélectionnez propriétés .

Définissez le type de démarrage sur Automatique ... Cliquez sur Appliquer > cliquez sur Démarrer > cliquez sur Ok

Assurez-vous que votre adresse IPALL TCP est - 1433 !

5
Cnf271

Vous voudrez peut-être vérifier les étapes que j'ai énumérées ici: Erreur: la connexion TCP/IP à l'hôte a échoué. Java.net.ConnectException: Connexion refusée: connectez et voyez si l'instance SQLExpress est configurée correctement, puis modifiez votre URL JDBC pour spécifier le nom de l'instance séparément. L'exemple présenté concerne l'authentification par mot de passe, mais fonctionne avec votre propriété integratedSecurity=true;.

4
Vikdor

Causes: 

  1. protocole (TCP/IP) n'est pas activé 
  2. Le port est incorrect
  3. manquant de sqljdbc_auth.dll
2
user3029620

Instances nommées et multiples SQL Server

Si vous avez besoin de vous connecter de uni * à une instance nommée, veuillez porter une attention particulière à la construction de l'URL de connexion JDBC

Si un numéro de port et un nom d'instance sont utilisés, le numéro de port sera prioritaire et le nom d'instance sera ignoré.

Cela signifie également que si vous souhaitez utiliser les noms d'instance, vous ne pouvez pas modifier le numéro de port.

Dans l'une ou l'autre de ces lignes, le paramètre myinstancename sera ignoré:

  • jdbc: sqlserver: // db-devmyinstancename; databaseName = mondbname; numéro_port = 1433
  • jdbc: sqlserver: // db-dev; databaseName = nom_bdd; nomInstance = nom_instance; numéro_port = 1433
  • jdbc: sqlserver: // db-dev\myinstancename: 1433; databaseName = mydbname
  • jdbc: sqlserver: // db-dev: 1433; nom_base_données = nom_bdd; nom_instance = nom_instance

Donc, si vous voulez utiliser des noms d'instance, le numéro de port doit être supprimé (essayé avec les pilotes jdbc sqlserver versions 3, 4, 4.1)

2
freedev

C'est peut-être idiot, mais vérifiez que votre table Products n'est pas vide. C’est la seule raison pour laquelle je ne vois aucune exception ni aucune impression dans la console.

1
Hernan Velasquez

Dans mon cas: Je n’ajoutais pas le numéro de port dans la chaîne de l’URL

String url = "jdbc:sqlserver://ABC\\SQLEXPRESS;databaseName=xyz;portNumber=1433"

ça a résolu mon problème

0
uniqueSolutions

Veuillez activer Sql Server Browser par, Démarrer> Panneau de configuration> Systèmes et sécurité> Outils d’administration> ServicesSélectionnez SQL Server Browser Cliquez avec le bouton droit de la souris et sélectionnez Propriétés.

Définissez le type de démarrage sur Automatique. Cliquez sur Appliquer> cliquez sur Démarrer> cliquez sur OK

Assurez-vous que votre adresse IPALL TCP est - 1433!

0
praveen g