JDBC: простой пример подключения MSSql не работает - программирование

JDBC: простой пример подключения MSSql не работает

Я изучаю Java и должен просто запускать что-то простое для извлечения некоторых данных из MSSQL через JDBC. Пример в моей книге не работает (но ему несколько лет), и этот пример ниже из MS тоже не работает для меня:

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

Здесь мой код:

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

Когда я запускаю код, я не получаю никаких исключений. Я просто получаю это в окне вывода:

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

Я использую NetBeans 7.2. Пожалуйста, дайте мне рабочий пример.

EDIT:

Кстати, для строки подключения, где вы видите \\SQLExpress, я попытался удалить это и использовать instanceName=SQLExpress вместо этого.. но это тоже не имело никакого эффекта.

ИЗМЕНИТЬ 2:

ОК, я загрузил последний JDBC-драйвер для MSSQL из MS и указал на 2 файла JAR. Теперь я получаю этот вывод:

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)

Прогресс.. По крайней мере, мы можем видеть, что он пытается подключиться сейчас, может кто-нибудь просветить меня по поводу вышеупомянутой ошибки?

ИЗМЕНИТЬ 3:

исправлено еще 2 проблемы.. один из них включает браузер SQL Server, а второй - включение TCP/IP для SQL Server. Спасибо @Vikdor Теперь я получаю эту ошибку:

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)

Я проверил брандмауэр окон и добавил входящее правило, чтобы разрешить этот порт, но я все еще получаю вышеуказанную ошибку. Любые идеи?

РЕДАКТИРОВАТЬ 4:

Пробовал решение по этой ссылке: http://www.coderanch.com/t/306316/JDBC/databases/SQLServerException-TCP-IP-connection-host

Больше не возникает ошибка в EDIT 3. Теперь получаем другую...

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)

Очень устал от этого сейчас.. почему Java, почему??? Серьезно... Я рад, что работаю в основном с .NET. Ну, когда я найду решение, я отправлю его здесь, чтобы убедиться, что он может помочь другим, прежде чем они сойдут с ума, поскольку я собираюсь...

РЕДАКТИРОВАТЬ 5:

Это помогло: java подключение к MicrosoftSQLServer 2005

Я помещаю путь каталога в переменную среды PATH. Не работает, поэтому я также поместил sqljdbc_auth.dll в папку JDK C:\Program Files\Java\jdk1.7.0_04\bin. Решаемые.

4b9b3361

Ответ 1

ОК, так вот что решило мои проблемы:

  • Загрузите последний драйвер MSSQL JDBC отсюда: http://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx

  • Ссылка на 2 файла JAR в моем проекте: sqljdbc.jar и sqljdbc4.jar (я еще не уверен, что оба из них необходимы или только один.)

  • Убедитесь, что служба Windows Server Browser работает

  • Откройте диспетчер конфигурации SQL Server и перейдите в Протоколы для SQLEXPRESS в разделе Конфигурация сети SQL Server. Щелкните правой кнопкой мыши TCP/IP и выберите "Свойства". Установите Включено= YES.

  • Пока вы находитесь, нажмите вкладку IP-адреса и найдите раздел IP All. Установите Порт TCP на 1433.

  • Добавьте sqljdbc_auth.dll к переменной PATH Environment. В моем случае: D:\Java\sqljdbc_4.0\enu\auth\x64

  • Скопируйте sqljdbc_auth.dll в каталог JDK. В моем случае: C:\Program Files\Java\jdk1.7.0_04\bin

Я надеюсь, что это поможет кому-то.

Ответ 2

Возможно, вы захотите проверить приведенные здесь шаги: Ошибка: соединение TCP/IP с хостом не удалось. java.net.ConnectException: Соединение отклонено: подключитесь и проверьте, правильно ли настроен экземпляр SQLExpress, а затем измените URL-адрес JDBC, чтобы указать имя экземпляра отдельно. Например, для аутентификации на основе пароля, но работает со своим свойством integratedSecurity=true;.

Ответ 3

Спасибо, наконец, он работает. Если это сообщение отображается ниже как ошибка,

 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

Включите Sql Server Browser,

Начать > Панель управления > Системы и безопасность > Административные средства > Услуги >

Выберите Браузер SQL Server. Щелкните правой кнопкой мыши и выберите свойства.

Установите тип запуска как автоматический. Нажмите Применить > нажмите кнопку "Пуск" > нажмите ОК

Убедитесь, что ваш IPALL-адрес TCP - 1433!

Ответ 4

Причины:

  • протокол (TCP/IP) не включен.
  • Порт неверен
  • отсутствует sqljdbc_auth.dll

Ответ 5

Это может быть глупо, но проверьте, что таблица Products не пуста. Единственная причина, по которой я вижу отсутствие каких-либо исключений и отсутствие печати на консоли.

Ответ 6

Именованные и множественные экземпляры SQL Server

Если вам нужно подключиться из uni * к именованному экземпляру, обратите особое внимание при создании URL-адреса JDBC-соединения

Если используются как portNumber, так и имя экземпляра, номер порта будет иметь приоритет, а имя экземпляра будет проигнорировано.

Это также означает, что если вы хотите использовать имена экземпляров, вы не можете изменить номер порта.

В любой из этих строк параметр myinstancename будет проигнорирован:

  • JDBC: SQLServer://дб-devmyinstancename; Databasename = mydbname; номер_порта = 1433
  • JDBC: SQLServer://дб-DEV; Databasename = имя_бд; имя_экземпляр = myinstancename; номер_порт = 1433
  • JDBC: SQLServer://дб-DEV\myinstancename: 1433; Databasename = mydbname
  • JDBC: SQLServer://дб-Dev: 1433; Databasename = имя_бд; имя_экземпляр = myinstancename

Итак, если вы хотите использовать имена экземпляров, номер порта должен быть удален (проверен с драйверами jdbc sqlserver версии 3, 4, 4.1)

Ответ 7

Включите Sql Server Browser, Пуск > Панель управления > Системы и безопасность > Административные инструменты > Услуги Выберите браузер SQL Server Щелкните правой кнопкой мыши и выберите свойства.

Установите тип запуска как автоматический. Нажмите "Применить" > нажмите "Пуск" > нажмите "ОК"

Убедитесь, что ваш IPALL-адрес TCP - 1433!