Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将参数设置为PreparedStatement时出错_Java_Prepared Statement_Mssql Jdbc - Fatal编程技术网

Java 将参数设置为PreparedStatement时出错

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

我有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


这没有帮助。如何将日期正确地传递到
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
?此问题更为正确。旧的deletedWhat
startDate
?@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);