2012-09-25 35 views
5

Tôi đang sử dụng trình điều khiển jtds JDBC và khi tôi gọi ResultSet.getNString(index); tôi nhận được ngoại lệ sau đây:jTDS JDBC driver: getNString() throws lỗi

run: 
Exception in thread "main" java.lang.AbstractMethodError: net.sourceforge.jtds.jdbc.JtdsResultSet.getNString(I)Ljava/lang/String; 
    at javasql.ProductsController.PrePopulate(ProductsController.java:51) 
    at javasql.ProductsController.<init>(ProductsController.java:37) 
    at javasql.Program.main(Program.java:25) 
Java Result: 1 
BUILD SUCCESSFUL (total time: 6 seconds) 

Khi tôi sử dụng getString(index) nó hoạt động tốt .. nó chỉ với getNString() rằng tôi đang gặp sự cố và cột trong bảng MSSQL của tôi được định nghĩa là NVarChar. Vì vậy, những gì cho? Không jtDS không hỗ trợ getNString()? Có thể nó có cả hai số VarCharNVarChar thông qua cùng chức năng getString() không?

EDIT:

vấn đề unicode liên quan .. Tôi có thể thấy rằng cố gắng sử dụng Unicode không làm việc cho chèn một trong hai. cột của tôi được định nghĩa là nvarchar(255) nhưng các tuyên bố INSERT sau không làm việc:

private final String INSERT_FORMAT = "INSERT INTO Products (Name, Price, QuantityInStock) VALUES (N'%s', %s, %s)"; 

    public void Insert(Product p) { 
      products.add(p); 
      try { 
       statement.addBatch(String.format(INSERT_FORMAT, p.getName(), p.getPrice(), p.getQuantityInStock())); 
      } catch (SQLException ex) { 
       System.out.println(ex.getMessage()); 
      } 
     } 

public void SaveChanges() { 
     try { 
      statement.executeBatch(); 
     } catch (SQLException ex) { 
      System.out.println(ex.getMessage()); 
     } 
     RefreshData(); 
    } 

Các ký tự unicode mà tôi đầu vào hiển thị như dấu chấm hỏi trong cơ sở dữ liệu. Điều này thường xảy ra khi bạn quên thêm N vào tham số đã cho trong câu lệnh chèn .. nhưng tại đây bạn có thể thấy rằng tôi đã chỉ định rõ ràng nó. Danh sách tính năng của JtDS có nghĩa là nó hỗ trợ NVARCHAR, NTEXT, vv .. nhưng hiện tại tôi chỉ gặp vấn đề. Tôi đang làm gì sai?

EDIT 2

Issue 1 đã được giải quyết .. Tôi chèn một số ký tự Trung Quốc trực tiếp vào cơ sở dữ liệu thông qua SSMS và khi tôi sử dụng getString(index), nó làm việc tốt. Vì vậy, có vẻ như jTDS sử dụng getString cho tất cả các loại văn bản mà tôi đoán. Lạ sau đó nó không ném một loại ngoại lệ không được hỗ trợ cho hàm getNString(index).

Vì vậy, bây giờ chúng tôi đã để lại sự cố về cách chèn dữ liệu unicode vào cột NVARCHAR. Chắc chắn một người nào đó ở đây đã có kinh nghiệm với điều này?

EDIT 3

tôi đã thay đổi mã của tôi để sử dụng một tuyên bố chuẩn bị trong mỗi phương pháp thay vì cố gắng sử dụng một lô và sử dụng setInt, setString, vv phương pháp. Tuy nhiên, tôi vẫn còn có những vấn đề tương tự ... nếu tôi sử dụng setString() cho unicode, nó chèn ??? vào db của tôi. Nếu tôi sử dụng setNString() sau đó tôi nhận được cùng một lỗi mà tôi nhận được ở đầu bài viết này khi tôi đang làm getNString ... Đây là điên ... làm thế nào có thể trình điều khiển này trở nên phổ biến nếu nó không thực sự hỗ trợ unicode ?? Tôi đang thiếu gì ở đây? Các trang web không nói rằng nó hỗ trợ NVARCHAR, vv .. vì vậy những gì điên unintuitive điều là nó mà tôi cần phải làm để thực hiện công việc này?

+0

Tôi hy vọng [ ở đây] (http://stackoverflow.com/questions/10965589/unicode-data-type-in-sql) đã có một số đã cố gắng liên quan đến vấn đề của bạn – gks

+0

@Stranger ... không phải vấn đề của tôi .. và không thực sự liên quan. Trong chủ đề đó, OP không biết bất cứ điều gì về các cột NVARCHAR, vv Tôi biết nó rất tốt và trong thực tế, sử dụng một cột NVARCHAR. Tôi rất exprienced với SQL và đã được viết các ứng dụng dựa trên SQL trong nhiều năm .. vấn đề tôi đang có là với trình điều khiển jTDS .. nó dường như không hoạt động, ít nhất không phải là cách mong đợi. – Matt

Trả lời

5

getNString đã được thêm bằng Java 1.6/JDBC 4.0. Có vẻ như tài xế của bạn quá già.

+0

Đừng giả sử như vậy. Trong thực tế, tôi có phiên bản mới nhất (1.2.6) tại đây: http://sourceforge.net/projects/jtds/files/jtds/ – Matt

+0

Hơn nữa, bạn rõ ràng là không đọc toàn bộ bài đăng. Có vẻ như getString() hoạt động tốt cho Unicode và vấn đề chính mà tôi hiện có là trong thực tế chèn dữ liệu unicode bởi trình điều khiển này. – Matt

+0

Nếu bạn đọc ghi chú phát hành của phiên bản 1.2.6 (hoặc trang chủ), bạn sẽ thấy "Đó là một triển khai hoàn chỉnh ** JDBC 3.0 **, nó vượt qua ** J2EE 1.3 ** chứng nhận". Nếu sau đó bạn nhìn vào nguồn của 'net.sourceforge.jtds.jdbc.JtdsResultSet' bạn sẽ thấy rằng trong khi' getNString' được thực thi, mã chỉ bao gồm '// TODO Phương thức tạo tự động stub' và' ném mới AbstractMethodError(); '. Tôi đã đọc toàn bộ bài đăng, nhưng sau đó ba chỉnh sửa đã được thực hiện. –

1

Loại khóa chính của bạn là gì? Tôi đã có chính xác cùng một vấn đề như bạn được mô tả, đó là: Tôi có thể truy xuất dữ liệu được lưu trữ dưới dạng NVARCHAR bằng phương thức getString() cổ điển nhưng các bản cập nhật sẽ không hoạt động, ngay cả khi đặt tùy chọn sendStringParametersAsUnicode thành true ... cho đến khi tôi thay đổi khóa chính từ NVARCHAR trở lại VARCHAR. Bây giờ nó hoạt động cho tôi. Các bản cập nhật không thực sự tạo ra bất kỳ lỗi nào, nó chỉ xuất hiện khóa chính không thể tìm thấy và do đó không có gì xảy ra ... Tuy nhiên, tôi đã hy vọng có thể sử dụng bộ nhớ unicode cho một số trường mà không cần cài đặt sendStringParametersAsUnicodetrue, nhưng tôi theo ấn tượng rằng nó là không thể, trừ khi có thể bằng cách gõ các cột có liên quan dưới dạng byte [] thay vì NVARCHAR và đặt chúng bằng phương thức setBytes() (như được đề xuất here/)

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