2013-02-14 31 views
7

tôi sử dụng đoạn mã này để chèn một số dữ liệu vào cơ sở dữ liệu:tuyên bố chuẩn bị chỉ ném ngoại lệ khi không gỡ lỗi

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
Connection con=DriverManager.getConnection("jdbc:odbc:war_odbc"); 
PreparedStatement st = 
    con.prepareStatement(
     "INSERT INTO Actors(FirstName,LastName,Age) VALUES(?,?,?)"); 
st.setString(1, "Robert"); 
st.setString(2, "de Niro"); 
st.setInt(3,45); 
st.executeUpdate();  
con.close(); 

Nếu tôi sử dụng trình gỡ lỗi và bước một dòng tại một thời điểm, mọi thứ đều suôn sẻ. Nếu tôi không sử dụng và chỉ chạy ứng dụng, tôi nhận ngoại lệ này:

[Microsoft][ODBC Driver Manager] Invalid string or buffer length 
    at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcResultSet.getString(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcConnection.buildTypeInfo(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcConnection.initialize(Unknown Source) 
    at sun.jdbc.odbc.JdbcOdbcDriver.connect(Unknown Source) 
    at java.sql.DriverManager.getConnection(Unknown Source) 
    at java.sql.DriverManager.getConnection(Unknown Source) 

Tôi đang sử dụng Windows 7 64 bit. Tôi đã đi đến Công cụ quản trị, Nguồn dữ liệu (ODBC) và tôi đã thử nghiệm thành công nó.

+0

Vì khi nào 'de Niro' là một số nguyên? –

+3

Câu hỏi thực sự là: "Tại sao mã này hoạt động trong chế độ gỡ lỗi?" ... – Aubin

+3

De Niro De Niro, anh ta có thể là bất cứ điều gì anh ta thích – lifetimes

Trả lời

0

Giải pháp tốt nhất là ngừng sử dụng lớp này từ gói sun (Why Developers Should Not Write Programs That Call 'sun' Packages). Ngoài ra trình điều khiển này thực sự cũ, nó là một trình điều khiển loại 1 chuyển đổi các cuộc gọi JDBC trong các cuộc gọi ODBC.

Bây giờ hầu như tất cả các nhà cung cấp DB đã triển khai trình điều khiển loại 4. Việc cài đặt trình điều khiển này chuyển đổi các cuộc gọi JDBC trực tiếp thành giao thức cơ sở dữ liệu của nhà cung cấp cụ thể.

Cũng theo điều này documentation cây cầu này sẽ bị xóa trong JDK8 vì vậy bạn nên sử dụng nó nếu bạn muốn có giải pháp di động/thích ứng.

+1

Cảm ơn lời khuyên của bạn. Tôi đã cài đặt sqljdbc4.jar từ microsoft.com nhưng tôi đang gặp khó khăn khi cố gắng làm cho nó hoạt động. Tôi sẽ hỏi một câu hỏi khác liên quan đến vấn đề mới. Cảm ơn một lần nữa. –

0

Thay st.setInt(2, "de Niro"); với st.setString(2, "de Niro");

+0

Đó là một vấn đề, nhưng theo stacktrace lỗi đã xảy ra trên 'DriverManager.getConnection()' –

+0

Vấn đề xảy ra trong quá trình chuẩn bị câu lệnh SQL. Nó chỉ được truyền lên trên trong ngăn xếp cuộc gọi. –

+0

@Kata Lỗi xảy ra trước khi chuẩn bị tuyên bố, bên trong 'DriverManager.getConnection()', stacktrace là khá rõ ràng. –

0

Chỉ cần vài điểm về đoạn mã được cung cấp.

  1. st.setInt (2, "de Niro");
    Ở đây bạn đang đặt "chuỗi" làm tham số thứ hai của truy vấn nhưng bạn đã sử dụng phương thức setInt() và điều đó không chính xác.

  2. Có liên quan đến hệ điều hành của bạn. tôi có nghĩa là u sử dụng hệ điều hành góa phụ 64-bit và kết nối 32 bit. tôi không chắc chắn về nó mặc dù.

Kiểm tra liên kết này. "[Microsoft][ODBC Driver Manager] Invalid string or buffer length" error

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