2012-09-21 21 views
16

Estoy aprendiendo Java y necesito ejecutar algo simple para recuperar algunos datos de MSSQL a través de JDBC. El ejemplo en mi libro no funciona (pero es varios años) y por debajo de este ejemplo de MS no funciona para mí tampoco:JDBC: Ejemplo simple de conexión MSSql no funciona

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

Aquí está mi código:

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

Cuando ejecuto el código, no lo entiendo excepciones emitidas .. acabo de recibir esto en la ventana de salida:

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

estoy usando NetBeans 7.2. Por favor, alguien dame un ejemplo de trabajo.

EDIT:

Por cierto, para la cadena de conexión, donde se ve la \\SQLExpress, yo intente quitar eso y usando instanceName=SQLExpress lugar .. pero eso no tiene ningún efecto, ya sea.

EDIT 2:

OK, he descargado la última versión del controlador JDBC para MSSQL desde MS y se hace referencia a los 2 archivos JAR en ese país. Ahora estoy recibiendo esta salida:

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) 

Progreso .. Por lo menos podemos ver que está intentando conectarse ahora, puede que alguien me ilumine en cuanto al error por encima de embargo?

Datos 3:

2 más problemas fijos .. uno es permitir a SQL Server Browser y la segunda fue la habilitación de TCP/IP para SQL Server. Gracias @Vikdor Ahora estoy recibiendo este error:

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) 

he comprobado ventanas cortafuegos y ha añadido una regla de entrada para permitir que el puerto, pero todavía estoy consiguiendo el error anterior. ¿Algunas ideas?

EDITAR 4:

Probamos la solución en este enlace: http://www.coderanch.com/t/306316/JDBC/databases/SQLServerException-TCP-IP-connection-host

Ya no consiguiendo error en EDITAR 3. Ahora conseguir otro ...

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) 

Conseguir muy cansado de esto ahora ... ¿por qué Java, por qué? En serio ... Estoy contento de trabajar principalmente con .NET. Bueno, cuando encuentro la solución, voy a publicar aquí para asegurarse de que puede ayudar a los demás antes de que se vuelven locos como yo estoy a punto de ...

EDITAR 5:

Esto ayudó: java connecting to MicrosoftSQLServer 2005

Pongo la ruta del directorio en la variable de entorno PATH.No funcionó, así que también coloqué el sqljdbc_auth.dll en mi carpeta JDK C:\Program Files\Java\jdk1.7.0_04\bin. Resuelto

Respuesta

25

bien, así que esto es lo que resuelve mis problemas:

  1. Descargar última versión del controlador JDBC MSSQL desde aquí: http://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx

  2. Referenciado los 2 archivos JAR en mi proyecto: sqljdbc.jar y sqljdbc4.jar (Todavía no estoy seguro de si se requieren las dos anteriores o solo una) ..

  3. Asegúrese de que el servicio de las ventanas de navegador de SQL Server se está ejecutando

  4. Administrador de configuración de SQL Server Abrir y vaya a Protocolos para SQLEXPRESS bajo Configuración de red de SQL Server. Haga clic derecho en TCP/IP y elija Propiedades. Establecer Habilitado = SÍ.

  5. Mientras esté allí, haga clic en direcciones IP pestaña y encontrar la sección de IP Todo. Establecer puerto TCP a 1433.

  6. Añadir sqljdbc_auth.dll a su PATH variable de entorno. En mi caso: D: \ Java \ sqljdbc_4.0 \ esp \ auth \ x64

  7. Copiar el sqljdbc_auth.dll a su directorio JDK. En mi caso: C: \ Archivos de programa \ Java \ jdk1.7.0_04 \ bin

espero que esto ayude a alguien.

+4

sqljdbc.jar us usamos en Java 1.5, sqljdbc4.jar requiere JDK6 + –

1

Puede ser una tontería, pero verifique que su tabla de Productos no esté vacía. Es la única razón por la que veo para no obtener ninguna excepción y no imprimir nada en la consola.

+0

Hehe, gracias Hernan pero ese no es el caso. Ver mi edición anterior – Matt

4

Es posible que desee comprobar los pasos que figuran aquí: Error:The TCP/IP connection to the host has failed. java.net.ConnectException: Connection refused: connect y vea si la instancia de SQLExpress está configurada correctamente, luego modifique su URL de JDBC para especificar el nombre de la instancia por separado. El ejemplo existe para la autenticación basada en contraseña, pero funciona con su propiedad integratedSecurity=true;.

+0

Gracias, eso ayudó, pero tengo un nuevo error. Por favor, mira mi edición de arriba. – Matt

2

Causas:

  1. protocolo (TCP/IP) no está habilitada
  2. puerto es incorrecta
  3. falta de sqljdbc_auth.dll
3

Gracias último que está funcionando. Si se muestra a continuación el mensaje como un error,

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 

Por favor, active Explorador de SQL Server,

Start>Panel de control>Sistemas & Seguridad>herramientas administrativas>Servicios

Seleccionar SQL Server Browser Haga clic derecho y seleccione propiedades.

Establecer el tipo de inicio como automático. Haga clic en Aplicar >Haga clic en Inicio> haga clic en Ok

asegurarse de que su dirección es IPAll TCP - !

+0

Funciona ... ¡¡Gracias .. !!! – Coder

1

con nombre y múltiples instancias de SQL Server

Si necesita conectar desde uni * a una instancia con nombre, por favor prestar especial atención cuando se está construyendo el JDBC connection URL

Si tanto un portNumber y instanceName se usa, el portNumber tendrá prioridad y el instanceName se ignorará.

Esto también significa que si desea utilizar nombres de instancia no puede cambiar el número de puerto.

En cualquiera de estas líneas se ignorará el parámetro myinstancename:

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

Así que si desea utilizar los nombres de instancia el número de puerto debe ser removido (intentó con los controladores JDBC sqlserver ver. 3, 4, 4.1)

0

Por favor, activa Explorador de SQL Server por, Inicio> Panel de control> Sistemas de Seguridad &> Herramientas administrativas> Servicios Seleccione Explorador de SQL Server, haga clic derecho y seleccione Propiedades.

Establecer el tipo de inicio como automático. Haga clic en Aplicar> haga clic en Inicio> haga clic en Aceptar

Asegúrese de que su dirección TCP IPALL es - 1433!