Java 将参数设置为PreparedStatement时出错
我有MSSQL程序:Java 将参数设置为PreparedStatement时出错,java,prepared-statement,mssql-jdbc,Java,Prepared Statement,Mssql Jdbc,我有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 = "ex
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
及
这没有帮助。如何将日期正确地传递到
PreparedStatement
?您的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
执行过程。一旦更正了数据格式,就必须更改代码
要执行过程,需要使用CallableStatement
,而不是PreparedStatement
如果您有字符串格式的日期,首先使用SimpleDataFormat将其转换为java格式的日期
而不是在callableStatement上将其设置为Date
String dateString = ...;
Date date = ...;
myCallableStatement.setDate(1, date);
此
startDate
类型是否为String
?此问题更为正确。旧的deletedWhatstartDate
?@Satya yes startDate是字符串wjth date,例如'2016-01-01'为什么字符串sql=“exec my_proc'2016-01-01','2016-01-20','2016-01-01';stmt=connection.prepareStatement(sql);rs=stmt.executeQuery();工作正常?这取决于数据库类型和过程类型。过程可以接受输入和输出的参数(通常在调用中命名为in或OUT的参数)。如果您的过程不使用输出参数,那么它也应该与PreparedStatement一起工作,否则无法获取结果。一般来说,最佳做法是在执行过程时使用CallableStatement,而仅在执行标准查询时使用PreparedStatement
String dateString = ...;
Date date = ...;
myCallableStatement.setDate(1, date);