2010-05-13 22 views
8

Giả sử tôi có một JDBC ResultSet, và tôi gọi phương thức getLong() hoặc gethort().Trong JDBC ResultSet, điều gì sẽ xảy ra khi getLong() hoặc getShort() được gọi trên cột kết quả int?

Đối với loại SQL nào sau đây {SMALLINT, INT, BIGINT} tôi nên nhận được lâu, và loại nào tôi nên gặp lỗi?

Nói cách khác, nếu tôi có INT và tôi muốn có SMALLINT (viết tắt), tôi có nhận được nó hay tôi sẽ gặp lỗi? Tương tự, nếu tôi có INT và muốn BIGINT (một thời gian dài), tôi có nhận được nó hay tôi sẽ gặp lỗi?

Javadocs (liệt kê bên dưới) không nói gì cả.

công dài getLong (int columnIndex) ném SQLException

Retrieves the value of the designated column in the current row 

của đối tượng ResultSet này như một lâu trong ngôn ngữ lập trình Java.

Parameters: 
    columnIndex - the first column is 1, the second is 2, ... 
Returns: 
    the column value; if the value is SQL NULL, the value returned is 0 
Throws: 
    SQLException - if a database access error occurs 

Trả lời

9

Từ phần Retrieving Values from Result Sets của các hướng dẫn Java:

JDBC cho phép rất nhiều vĩ độ như xa như mà getXXX phương pháp bạn có thể sử dụng để lấy các loại SQL khác nhau. Ví dụ, phương thức getInt có thể được sử dụng để lấy bất kỳ kiểu số hoặc kiểu ký tự nào. Dữ liệu mà nó truy xuất sẽ được chuyển thành một int; tức là, nếu kiểu SQL là VARCHAR, thì JDBC sẽ cố phân tích một số nguyên ra khỏi VARCHAR. Tuy nhiên, phương thức getInt được khuyến khích chỉ truy xuất các kiểu SQL INTEGER và nó không thể được sử dụng cho các kiểu SQL BINARY, VARBINARY, LONGVARBINARY, DATE, TIME hoặc TIMESTAMP.

Tôi hiểu rằng điều đó có nghĩa là dữ liệu sẽ bị ép buộc. Nó sẽ làm việc tốt nếu nó là một upcast, nhưng tôi mong đợi tiềm năng mất chính xác (tự nhiên) nếu, ví dụ, bạn đang đọc một giá trị LONG sử dụng getInt(). Tôi mong đợi một ngoại lệ được ném nếu bạn cố đọc văn bản bằng cách sử dụng getInt().

+1

Tuyệt vời ... Tôi đang viết một trình bao bọc cho ResultSet của JDBC và hy vọng có một cách giải thích rõ ràng về các kiểu int không phụ thuộc vào việc triển khai thực hiện. Cảm ơn bạn đã tìm thấy điều này! – Uri

+1

Bạn có thể gọi DataBaseMetaData.supportsConvert (int fromType, int toType) để xem liệu một triển khai cụ thể có hỗ trợ một chuyển đổi nhất định hay không. – Yishai

2

Nó sẽ bỏ nó vào một dài và nó nên được tốt.

Bạn sẽ gặp lỗi nếu bạn đang cố gắng tồn tại lâu từ chuỗi có chứa "Bob" hoặc một số trường khác không thể dễ dàng chuyển đổi thành thời lượng dài.

+1

Đó là những gì tôi tự hỏi và liệu điều này có phụ thuộc vào việc triển khai hay không. Tôi cảm thấy tài liệu không rõ ràng về điều này. Trong trường hợp đó là một null, tôi biết tôi sẽ nhận được 0.Nhưng có vẻ như tôi thậm chí sẽ không nhận được cảnh báo thời gian chạy trong trường hợp này. – Uri

+0

Nó rất có thể là rất phụ thuộc thực hiện. Điều đó có nghĩa là bạn sẽ cần phải thử nghiệm nó với một số DB. Nhưng, sự thật lạnh là nhiều ứng dụng, thậm chí sử dụng SQL "di động" là DB cụ thể, do đó, nó thường không phải là một vấn đề lớn. Rõ ràng, "nó phụ thuộc". –

1

Thông số kỹ thuật không nói gì về hành vi này. Điều này sẽ hoàn toàn phụ thuộc vào việc thực hiện các trình điều khiển.

Với Trình kết nối MySQL, bạn gần như có thể nhận được bất kỳ thứ gì trông giống như số miễn là nó ở định dạng số hợp lệ và nằm trong phạm vi dài. Null/False cũng được trả về như 0.

1

Đây là phụ thuộc triển khai. Thông số kỹ thuật cho biết việc triển khai ResultSet có thể hỗ trợ chuyển đổi như vậy và bạn có thể kiểm tra bằng cách gọi DataBaseMetaData.supportsConvert(int fromType, int toType) (Mục 15.2.3.1 của thông số triển khai 4.0).

Tốt nhất là không dựa vào hành vi mà đúng hơn là kiểm tra ResultSetMetaData cho đúng loại.

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