2013-02-14 31 views
7

拋出異常,我使用這段代碼的一些數據插入到數據庫:預處理語句只有當沒有調試

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

如果我使用調試器和單步執行一行的時間,一切順利。如果我不使用它,只是運行應用程序,我得到這個異常:

[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) 

我正在使用Windows 7 64位。 我去了管理工具,數據源(ODBC),我成功地測試了它。

+0

既然是'de Niro'一個整數? – 2013-02-14 16:33:05

+3

真正的問題是:「爲什麼這個代碼在調試模式下工作?」... – Aubin 2013-02-14 16:34:48

+3

De Niro的De Niro,他可以是他喜歡的任何東西 – lifetimes 2013-02-14 16:41:47

回答

0

最好的解決辦法是停止使用sun包中的這個類(Why Developers Should Not Write Programs That Call 'sun' Packages)。此驅動程序也很舊,它是一種在ODBC調用中轉換JDBC調用的類型1驅動程序。

現在幾乎所有的數據庫供應商都實現了4型驅動程序。該驅動程序實現將JDBC調用直接轉換爲供應商特定的數據庫協議。

同樣,根據documentation這座橋將在JDK8被刪除所以它的壞主意,如果你想有一個便攜式/適應性解決方案中使用它。

+1

感謝您的建議。我從microsoft.com安裝了sqljdbc4.jar,但我正在努力使其工作。我會就這個新問題提出另一個問題。再次感謝。 – 2013-02-15 17:52:50

0

更換st.setInt(2, "de Niro");st.setString(2, "de Niro");

+0

這是一個問題,但根據堆棧跟蹤,'DriverManager.getConnection()'上已經出現錯誤' – 2013-02-14 16:34:33

+0

在SQL語句準備期間發生該問題。它只是在調用堆棧中向上傳播。 – 2013-02-14 16:38:11

+0

@Kata錯誤之前報表編制,裏面'的DriverManager.getConnection()',堆棧跟蹤是很清楚的發生。 – 2013-02-14 16:55:56

0

關於所提供的代碼片段只是幾個點。

  1. st.setInt(2,「de Niro」);
    這裏您將「string」設置爲查詢的第二個參數,但是您已經使用了setInt()方法,並且這是不正確的。

  2. 是什麼與您的操作系統有關。我的意思是你使用64位寡婦操作系統和32位連接器。但我不確定。

檢查此鏈接。 "[Microsoft][ODBC Driver Manager] Invalid string or buffer length" error