2010-11-22 34 views
14
  1. Theo tài liệu java của PreparedStatement.setNull: "Lưu ý: Bạn phải chỉ định loại SQL của tham số". Lý do mà phương thức yêu cầu loại SQL của cột là gì?Tại sao PreparedStatement.setNull yêu cầu sqlType?

  2. Tôi nhận thấy rằng việc chuyển java.sql.Types.VARCHAR cũng hoạt động cho các cột không phải là varchar. Có những tình huống trong đó VARCHAR sẽ không phù hợp (một số loại cột nhất định hoặc một số nhà cung cấp DB nhất định) không?

Cảm ơn.

Trả lời

10

Theo các tài liệu java của PreparedStatement.setNull: "Lưu ý: Bạn phải ghi rõ của tham số kiểu SQL ". Lý do mà phương thức yêu cầu loại SQL của cột là gì?

Để có khả năng tương thích tối đa; theo đặc điểm kỹ thuật, có một số cơ sở dữ liệu không cho phép NULL không được phân loại được gửi đến nguồn dữ liệu cơ bản.

Tôi nhận thấy rằng việc chuyển số java.sql.Types.VARCHAR cũng hoạt động cho các cột không phải là varchar. Có các trường hợp trong đó VARCHAR không phù hợp với (một số loại cột nhất định hoặc một số nhà cung cấp DB nhất định) không?

Tôi không nghĩ rằng loại hành vi đó thực sự là một phần của đặc điểm kỹ thuật hoặc nếu có, thì tôi chắc chắn có một số loại ép buộc ngầm đang diễn ra ở đó. Trong mọi trường hợp, dựa vào loại hành vi như vậy có thể phá vỡ khi thay đổi kho dữ liệu cơ bản không được khuyến khích. Tại sao không chỉ định đúng loại?

+0

1. Tôi vẫn không hiểu tại sao tôi phải khai báo loại. Theo như tôi biết lệnh UPDATE với SET MY_COLUMN = NULL sẽ làm việc trên tất cả các loại cột vậy tại sao nó không đủ? – MosheElisha

+0

2. Tôi có một phương thức nhận chuỗi SQL và một Bộ sưu tập và gọi PreparedStatement.setObject/setNull cho từng đối tượng. Nếu tôi muốn rằng loại chính xác sẽ được chuyển đến setNull Tôi cần phải chuyển loại của từng đối tượng và tạo ra một ugly nếu. Nếu trình điều khiển cơ sở dữ liệu có thể xử lý setObject, theo ý kiến ​​của tôi, nó sẽ xử lý setNull và kiểm tra nội bộ là tốt. – MosheElisha

+1

@user: Về 1; như tôi đã đề cập, JDBC là một nỗ lực để chuẩn hóa sự tương tác với một cơ sở dữ liệu, nhưng mọi việc triển khai cơ sở dữ liệu đều có cách làm riêng của nó. Ví dụ: tôi đã nghe nói rằng Oracle phàn nàn nếu một loại thích hợp không được cung cấp khi thiết lập NULL. Do đó JDBC yêu cầu bạn chỉ định kiểu, cho dù việc triển khai JDBC cơ bản có chuyển nó vào cơ sở dữ liệu hay không là một thứ khác. Nó không thể được giúp đỡ nếu một giao thức cơ sở dữ liệu cụ thể dây quyết định rằng các loại được thông qua khi thiết lập giá trị NULL vì vậy không có điểm trong lý luận với điều đó. –

7

Trình điều khiển JDBC dường như đang di chuyển ra khỏi setNull. Xem Add support for setObject(<arg>, null).

danh sách của tôi về cơ sở dữ liệu hỗ trợ hành vi hợp lý hơn là:

  1. Oracle
  2. MySQL
  3. Sybase
  4. MS SQL Server
  5. HSQL

danh sách của tôi về cơ sở dữ liệu KHÔNG hỗ trợ hành vi logic này là:

  1. Derby Queries with guarded null Parameter fail
  2. PostgreSQL Cannot pass null in Parameter in Query for ISNULLSuggested solution
+0

Điều cần biết. Cảm ơn! – MosheElisha

1

Khi nói đến Oracle nó sẽ rất khôn ngoan khi sử dụng varchar2 đối với kiểu dữ liệu khác. Điều này có thể đánh lừa trình tối ưu hóa và bạn có thể nhận được kế hoạch thực hiện không tốt. Ví dụ lọc trên cột ngày sử dụng kiểu dữ liệu dấu thời gian trong liên kết của bạn, Oracle có thể đọc tất cả các hàng của bạn chuyển đổi tất cả các ngày thành dấu thời gian, sau đó lọc ra các hàng mong muốn. Nếu bạn có một chỉ mục trên cột ngày của bạn, nó thậm chí có thể tồi tệ hơn (nếu oracle đã chọn để sử dụng nó) - làm đơn đọc trên khối oracle của bạn.

--Lasse

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