【问题标题】:Error when I set parameters to PreparedStatement将参数设置为 PreparedStatement 时出错
【发布时间】:2016-05-23 12:37:38
【问题描述】:

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

【问题讨论】:

标签: java prepared-statement mssql-jdbc


【解决方案1】:

一旦更正了数据格式,您就必须更改代码。

要执行一个过程,您需要使用CallableStatement,而不是PreparedStatement

如果您有字符串格式的日期,请先使用 SimpleDateFormat 将其转换为 Java 中的日期。

而不是简单地将其设置为 callableStatement 上的日期。

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

myCallableStatement.setDate(1, date);

【讨论】:

  • 为什么 String 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
【解决方案2】:

您的startDateString 类型。所以将其转换为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 执行程序。

【讨论】:

    猜你喜欢
    • 2012-11-21
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2012-07-14
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多