2012-09-21 29 views
16

Tôi đang học Java và chỉ cần chạy một cái gì đó đơn giản để lấy một số dữ liệu từ MSSQL thông qua JDBC. Ví dụ trong cuốn sách của tôi không hoạt động (nhưng nó là một vài tuổi) và ví dụ dưới đây từ MS không làm việc cho tôi một trong hai:JDBC: Ví dụ kết nối MSSql đơn giản không hoạt động

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

Dưới đây là mã của tôi:

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

Khi tôi chạy mã, tôi không nhận được bất kỳ ngoại lệ ném .. Tôi chỉ nhận được điều này trong cửa sổ đầu ra:

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

Tôi đang sử dụng NetBeans 7.2. Xin vui lòng ai đó cho tôi một ví dụ làm việc.

EDIT:

Bằng cách này, cho chuỗi kết nối, nơi bạn nhìn thấy các \\SQLExpress, tôi đã cố gắng loại bỏ điều đó và sử dụng instanceName=SQLExpress thay .. nhưng điều đó không có bất kỳ tác dụng một trong hai.

EDIT 2:

OK, tôi đã tải về trình điều khiển JDBC mới nhất cho MSSQL từ MS và tham chiếu 2 tập tin JAR trong đó. Bây giờ tôi nhận được kết quả này:

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) 

Tiến trình .. ít nhất chúng ta có thể thấy nó đang cố gắng kết nối ngay bây giờ, ai đó có thể khai sáng cho tôi về lỗi trên?

EDIT 3:

thêm 2 vấn đề cố định .. ai cho phép SQL Server Browser và lần thứ hai được phép giao thức TCP/IP cho SQL Server. Cảm ơn @Vikdor Bây giờ tôi nhận được lỗi này:

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) 

Tôi đã kiểm tra các cửa sổ tường lửa và thêm một rule gửi đến để cho phép cổng đó, nhưng tôi vẫn nhận được lỗi trên. Bất kỳ ý tưởng?

EDIT 4:

Cố gắng giải pháp trong liên kết này: http://www.coderanch.com/t/306316/JDBC/databases/SQLServerException-TCP-IP-connection-host

Không còn bị lỗi trong EDIT 3. Bây giờ nhận được một ...

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) 

Bắt rất mệt mỏi của điều này bây giờ .. tại sao Java, tại sao ?? Nghiêm túc ... Tôi vui vì tôi làm việc chủ yếu với .NET. Vâng, khi tôi tìm ra giải pháp, tôi sẽ đăng nó ở đây để đảm bảo nó có thể giúp người khác trước khi họ đi điên như tôi sắp ...

EDIT 5:

này giúp: java connecting to MicrosoftSQLServer 2005

Tôi đặt đường dẫn thư mục vào biến môi trường PATH của tôi.Không hoạt động, vì vậy tôi cũng đặt sqljdbc_auth.dll vào thư mục JDK C:\Program Files\Java\jdk1.7.0_04\bin của mình. Giải quyết.

Trả lời

25

OK, vì vậy đây là những gì giải quyết vấn đề của tôi:

  1. Tải mới nhất điều khiển MSSQL JDBC từ đây: http://msdn.microsoft.com/en-us/sqlserver/aa937724.aspx

  2. Tham chiếu 2 tập tin JAR trong dự án của tôi: sqljdbc.jarsqljdbc4.jar (Tôi chưa chắc chắn liệu cả hai điều trên là bắt buộc hay chỉ một ..)

  3. Hãy chắc chắn rằng SQL Server cửa sổ trình duyệt dịch vụ đang chạy

  4. mở SQL Server Configuration Manager và đi đến giao thức cho SQLExpress dưới SQL Server Cấu hình mạng. Nhấp chuột phải vào TCP/IP và chọn Thuộc tính. Đặt Đã bật = CÓ.

  5. Trong khi bạn đang ở đó, nhấp chuột vào địa chỉ IP tab và tìm đến phần IP Tất cả. Đặt TCP Port đến 1433.

  6. Thêm sqljdbc_auth.dll để PATH của bạn Môi trường Variable. Trong trường hợp của tôi: D: \ Java \ sqljdbc_4.0 \ enu \ auth \ x64

  7. Sao chép sqljdbc_auth.dll để bạn JDK thư mục. Trong trường hợp của tôi: C: \ Program Files \ Java \ jdk1.7.0_04 \ bin

Tôi hy vọng điều này sẽ giúp một ai đó.

+4

sqljdbc.jar chúng tôi sử dụng trong Java 1.5, sqljdbc4.jar yêu cầu JDK6 + –

1

Có thể ngớ ngẩn nhưng hãy kiểm tra xem bảng Sản phẩm của bạn có trống không. Là lý do duy nhất tôi thấy không nhận được bất kỳ trường hợp ngoại lệ và không in bất cứ điều gì trong giao diện điều khiển.

+0

Hehe, cảm ơn Hernan nhưng không phải vậy. Vui lòng xem chỉnh sửa của tôi ở trên – Matt

4

Bạn có thể muốn kiểm tra các bước tôi liệt kê ở đây: Error:The TCP/IP connection to the host has failed. java.net.ConnectException: Connection refused: connect và xem liệu cá thể SQLExpress được cấu hình đúng chưa, sau đó sửa đổi URL JDBC của bạn để chỉ định tên cá thể riêng biệt. Ví dụ có để xác thực dựa trên mật khẩu, nhưng hoạt động với thuộc tính integratedSecurity=true; của bạn.

+0

Cảm ơn, điều đó đã giúp, nhưng tôi có một lỗi mới. Vui lòng xem chỉnh sửa của tôi ở trên. – Matt

2

Nguyên nhân:

  1. giao thức (TCP/IP) không được kích hoạt
  2. Port là không chính xác
  3. thiếu của sqljdbc_auth.dll
3

Nhờ Cuối cùng nó làm việc. Nếu nó hiển thị bên dưới thông điệp như lỗi,

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 

Vui lòng kích hoạt Sql Server Browser bằng,

Bắt đầu>Control Panel>Systems & an>công cụ hành chính>Dịch vụ

Chọn Trình duyệt SQL Server Nhấp chuột phải và chọn thuộc tính.

Đặt loại bắt đầu là Tự động. Bấm vào Áp dụng>nhấp chuột vào start> click vào Ok

Chắc chắn IPALL TCP của bạn Địa chỉ là - !

+0

Hoạt động của nó .. Cảm ơn .. !!! – Coder

1

Đặt tên và Nhiều SQL Server Instances

Nếu bạn cần kết nối từ uni * để một trường hợp được đặt tên, hãy chú ý đặc biệt khi bạn đang xây dựng các JDBC connection URL

Nếu cả hai một PortNumber và instanceName được sử dụng, portNumber sẽ được ưu tiên và instanceName sẽ bị bỏ qua.

Điều này cũng có nghĩa là nếu muốn sử dụng Tên cá thể, bạn không thể thay đổi số cổng.

Trong bất kỳ những dòng tham số myinstancename sẽ bị bỏ qua:

  • 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 = dbname; i nstanceName = myinstancename

Vì vậy, nếu bạn muốn sử dụng tên mẫu thì số cổng phải được xóa (đã thử với jdbc sqlserver drivers ver. 3, 4, 4.1)

0

Vui lòng kích hoạt Sql Server Browser bằng, Start> Control Panel> Hệ thống & Bảo mật> Administrative tools> Dịch vụ Chọn SQL Server Browser Nhấp chuột phải và chọn Properties.

Đặt loại bắt đầu là Tự động. Nhấp vào Áp dụng> nhấp vào bắt đầu> nhấp vào Ok

Đảm bảo Địa chỉ TCP IPALL của bạn là - 1433!

Các vấn đề liên quan