Ошибка при установке параметров в PreparedStatement

У меня есть процедура MSSQL:

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)

Не помогло. Как перейти дату на PreparedStatementcorrectly`?


person user5620472    schedule 12.02.2016    source источник
comment
Это startDate типа String?   -  person SatyaTNV    schedule 12.02.2016
comment
Этот вопрос более правильный. старый удален   -  person user5620472    schedule 12.02.2016
comment
Что такое startDate?   -  person khelwood    schedule 12.02.2016
comment
@Satya yes startDate - строка с датой, например '2016-01-01'   -  person user5620472    schedule 12.02.2016
comment
возможный дубликат stackoverflow.com/questions/1135746 /   -  person DwB    schedule 12.02.2016
comment
@ DwB в каком месте у меня вопрос дубликат?   -  person user5620472    schedule 12.02.2016


Ответы (2)


Ваш 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 для выполнения процедур.

person SatyaTNV    schedule 12.02.2016

После того, как вы откорректировали формат ваших данных, вы должны изменить код.

Чтобы выполнить процедуру, вам нужно использовать CallableStatement, а не PreparedStatement.

Если у вас есть дата в строковом формате, сначала преобразуйте ее в Date в java с помощью SimpleDateFormat.

Затем просто установите его как Date в callableStatement.

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

myCallableStatement.setDate(1, date);
person Davide Lorenzo MARINO    schedule 12.02.2016
comment
почему String sql = exec my_proc '2016-01-01', '2016-01-20', '2016-01-01'; stmt = connection.prepareStatement (sql); rs = stmt.executeQuery (); нормально работать? - person user5620472; 12.02.2016
comment
Это зависит от типа базы данных и типа процедуры. Процедуры могут принимать параметры как для ввода, так и для вывода (обычно параметры, называемые в вызовах как IN или OUT). Если ваша процедура не использует параметры для вывода, она также должна работать с PreparedStatement, иначе получить результаты будет невозможно. В общем случае рекомендуется использовать CallableStatement при выполнении процедур и использовать PreparedStatement только при выполнении стандартных запросов. - person Davide Lorenzo MARINO; 12.02.2016