2016-02-12 53 views
0

我有MSSQL的程序:錯誤,當我設置參數的PreparedStatement

my_proc 

我從Java

String sql = "exec my_proc '2016-01-01','2016-01-20','2016-01-01'"; 
stmt = connection.prepareStatement(sql); 
rs = stmt.executeQuery(); 

獲取數據,並得到所有數據正常!

,但如果我用

String msisdn, String startDate, String endDate 

String sql = "exec my_proc ?,?,?"; 
     stmt = connection.prepareStatement(sql); 
     stmt.setString(1, msisdn); 
     stmt.setString(2, startDate); 
     stmt.setString(3, endDate); 
     rs = stmt.executeQuery(); 

我得到錯誤:

com.microsoft.sqlserver.jdbc.SQLServerException: Error converting data type varchar to datetime. 

在程序我有變量:

@Startdtin datetime, 
@Enddtin datetime, 
@msisdnin varchar(18) 

我試圖使用

stmt.setTimestamp(2, startDate); //startDate - convert to Timestamp 

stmt.setDate(2, startDate); //startDate - convert to Date (sql and util) 

它沒有幫助。如何正確地傳遞日期到PreparedStatement

+1

將數據類型varchar轉換爲datetime時可能出現重複。當我試着stmt.executeQuery()](http://stackoverflow.com/questions/35358772/error-converting-data-type-varchar-to-datetime-when-i-tried-stmt-executequery) – JonK

+1

這是否' startDate'的類型是'String'? – Satya

+0

這個問題更正確。 old deleted – user5620472

回答

0

您的startDate類型爲String。因此將其轉換爲Date類型。

java.util.Date myDate = new java.util.Date(startDate); 
java.sql.Date sqlDate = new java.sql.Date(myDate.getTime()); 

------------------------------- 
stmt.setDate(5, sqlDate); 

使用CallableStatement執行程序。

0

一旦更正了數據的格式,您必須更改代碼。

要執行程序,您需要使用CallableStatement而不是PreparedStatement

如果你的日期是字符串格式,首先使用SimpleDateFormat將它轉換爲java中的日期。

只需在callableStatement上將其設置爲Date即可。

String dateString = ...; 
Date date = ...; 

myCallableStatement.setDate(1, date); 
+0

why String sql =「exec my_proc'2016-01-01','2016-01-20','2016-01-01'」; stmt = connection.prepareStatement(sql); rs = stmt.executeQuery();工作正常嗎? – user5620472

+0

它取決於數據庫的類型和過程的類型。程序可以接受輸入和輸出的參數(通常在呼叫中命名爲IN或OUT)。如果你的過程沒有使用參數來輸出,它也應該與PreparedStatement一起工作,否則不可能得到結果。 Generaly是在執行過程時使用CallableStatement並僅在執行標準查詢時使用PreparedStatement的最佳實踐 –