2012-09-21 13 views
16

Sto imparando Java e ho bisogno di eseguire semplicemente qualcosa di semplice per recuperare alcuni dati da MSSQL tramite JDBC. L'esempio nel mio libro non funziona (ma è diversi anni) e questo esempio di seguito da MS non funziona neanche per me:JDBC: esempio di connessione MSSql semplice non funzionante

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

Ecco il mio codice:

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()); 
     } 
    } 
} 

Quando eseguo il codice, non ottengo alcun eccezioni generate .. ottengo solo questo nella finestra di output:

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

sto utilizzando NetBeans 7.2. Per favore, qualcuno mi dia un esempio funzionante.

EDIT:

Tra l'altro, per la stringa di connessione, dove si vede la \\SQLExpress, ho fatto provare a rimuovere questo e utilizzando instanceName=SQLExpress invece .. ma che non ha avuto alcun effetto neanche.

EDIT 2:

OK, ho scaricato il driver JDBC più recente per MSSQL da MS e fatto riferimento i 2 file JAR in là. Ora sto ricevendo questo output:

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) 

Progress .. almeno possiamo vedere che sta tentando di connettersi ora, qualcuno mi può illuminare per l'errore precedente però?

EDIT 3:

2 ulteriori problemi risolti .. uno è abilitare SQL Server Browser e il secondo stava permettendo TCP/IP per SQL Server. Grazie @Vikdor Ora sto ottenendo questo errore:

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) 

ho controllato Windows Firewall e ha aggiunto una regola in entrata per consentire che la porta, ma sto ancora ricevendo l'errore precedente. Qualche idea?

EDIT 4:

provato la soluzione in questo link: http://www.coderanch.com/t/306316/JDBC/databases/SQLServerException-TCP-IP-connection-host

Non più ottenere errore nel EDIT 3. Ora ottenere un altro ...

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) 

Ottenere molto stanco di questo ora .. perché Java, perché ?? Seriamente ... Sono contento di lavorare principalmente con .NET. Beh, quando ho trovato la soluzione, mi post qui per fare in modo che possa aiutare gli altri prima di andare pazza come sto per ...

EDIT 5:

Questo ha aiutato: java connecting to MicrosoftSQLServer 2005

Ho inserito il percorso della directory nella variabile di ambiente PATH.Non ha funzionato, quindi ho anche inserito lo sqljdbc_auth.dll nella mia cartella JDK C:\Program Files\Java\jdk1.7.0_04\bin. Risolto.

risposta

25

OK, quindi ecco cosa ha risolto i miei problemi:

  1. Scarica ultima versione del driver JDBC MSSQL da qui: http://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx

  2. di riferimento i 2 file JAR nel mio progetto: sqljdbc.jar e sqljdbc4.jar (Non sono ancora sicuro se entrambi i requisiti siano obbligatori o solo uno ..)

  3. Assicurarsi che il servizio di Windows SQL Server Browser è in esecuzione

  4. Aprire SQL Server Configuration Manager e andare a Protocolli per SQLEXPRESS sotto di rete di SQL Server Configuration. Fare clic con il tasto destro su TCP/IP e selezionare Proprietà. Set Abilitato = SÌ.

  5. Già che ci sei, clicca sul indirizzi IP scheda e trovare la sezione IP Tutti. Impostare Porta TCP al 1433.

  6. Aggiungere sqljdbc_auth.dll al Variabile di ambiente PATH. Nel mio caso: D: \ Java \ sqljdbc_4.0 \ ita \ auth \ x64

  7. Copiare il sqljdbc_auth.dll al JDK directory. Nel mio caso: C: \ Program Files \ Java \ jdk1.7.0_04 \ bin

Spero che questo aiuta qualcuno.

+4

sqljdbc.jar us usato in Java 1.5, sqljdbc4.jar richiede JDK6 + –

1

Può essere sciocco, ma controlla che la tabella Prodotti non sia vuota. È l'unica ragione per cui non ottengo eccezioni e non stampo nulla nella console.

+0

Hehe, grazie Hernan ma non è il caso. Si prega di vedere la mia modifica sopra – Matt

4

È possibile controllare i passaggi da me elencati qui: Error:The TCP/IP connection to the host has failed. java.net.ConnectException: Connection refused: connect e verificare se l'istanza SQLExpress è configurata correttamente, quindi modificare l'URL JDBC per specificare separatamente il nome dell'istanza. L'esempio è per l'autenticazione basata su password, ma funziona con la proprietà integratedSecurity=true;.

+0

Grazie, che ha aiutato, ma ho un nuovo errore. Si prega di consultare la mia modifica sopra. – Matt

2

Cause:

  1. protocollo (TCP/IP) non è abilitato
  2. Port non è corretta
  3. mancante del sqljdbc_auth.dll
3

Grazie infine che sta funzionando. Se mostra di seguito un messaggio di errore,

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 

Si prega di abilitare SQL Server Browser da,

Inizio>Pannello di controllo>Sistemi & Sicurezza>Strumenti di amministrazione>Servizi

Seleziona SQL Server Browser Fare clic con il tasto destro e selezionare proprietà.

Impostare il tipo di avvio su Automatico. Cliccare su Apply >Fare clic su Start> cliccare sul Ok

assicurano il vostro indirizzo IPAll TCP è - !

+0

Funzionante .. Grazie .. !!! – Coder

1

nome e più istanze di SQL Server

Se è necessario connettersi da uni * a un'istanza denominata, si prega di prestare particolare attenzione quando si sta costruendo il JDBC connection URL

Se sia un portNumber e vengono utilizzati instanceName, il portNumber avrà la precedenza e l'instanceName verrà ignorato.

Ciò significa anche che se si desidera utilizzare i nomi di istanza non è possibile modificare il numero di porta.

In qualsiasi di queste linee parametro myinstancename verrà ignorata:

  • jdbc: sqlserver: // db-devmyinstancename; databaseName = mydbname; portNumber = 1433
  • jdbc: sqlserver:// db-dev; databaseName = dbname; instanceName = myinstancename; portNumber = 1433
  • jdbc: sqlserver: // db-dev \ myinstancename: 1433; databaseName = mydbname
  • jdbc: sqlserver: // db-dev: 1433 ; databaseName = nomedb; i nstanceName = myinstancename

Quindi, se si desidera utilizzare i nomi di istanza, è necessario rimuovere il numero di porta (provato con jdbc driver sqlserver ver. 3, 4, 4.1)

0

Si prega di abilitare SQL Server Browser da, Start> Pannello di controllo> Sistemi di Sicurezza &> Strumenti di amministrazione> Servizi Selezionare Browser SQL Server Fare clic destro e selezionare Proprietà.

Impostare il tipo di avvio su Automatico. Fai clic su Applica> fai clic su start> fai clic su Ok

Assicurati che il tuo indirizzo IP IPALL sia - 1433!