gpt4 book ai didi

java - 在 Java 中将数据类型 nvarchar 转换为 datetime2 时出错

转载 作者:行者123 更新时间:2023-11-30 06:26:20 28 4
gpt4 key购买 nike

我正在从 springstoredprocedure.execute 方法调用一个 MSSQL 过程。我尝试将日期参数作为 java.sql.Date 、 java.sql.Timestamp 和纯字符串传递,但对于所有选项,它都会给出相同的错误“将数据类型 nvarchar 转换为 datetime2 时出错”这是我的过程的语法

  PROCEDURE [sampleProc]
@errorMsg VARCHAR(MAX) OUTPUT
,@startDate DATETIME = NULL
,@endDate DATETIME = NULL
,@par1 VARCHAR(200) = NULL
,@par2 VARCHAR(200) = NULL
,@par3 VARCHAR(200) = NULL

调用它的Java代码:

Map<String, Object> results = super.execute(errMsg,convertJavaDateToSql   (startDate),convertJavaDateToSql(endDate),null,null,null);

而convertJavaDateToSql方法是

 Timestamp convertJavaDateToSql(String date){
Date javaDate = null;
try {
javaDate = dateFormat.parse(date);
logger.info("Parsed Date is "+javaDate );
} catch (ParseException e) {

logger.error("Error Parsing startDate and endDate" );
}

if(javaDate!=null) {
Timestamp sqlDateTime = new Timestamp(javaDate.getTime());
logger.info("sql Date "+sqlDateTime);
return sqlDateTime;
}else
return null;
}

这就是我声明参数的方式

declareParameter(new SqlReturnResultSet("RESULT_LIST",
myDataExtractor));
declareParameter(new SqlOutParameter("errorMsg",Types.VARCHAR));
declareParameter(new SqlParameter("startDate",Types.TIMESTAMP));
declareParameter(new SqlParameter("endDate", Types.TIMESTAMP));
declareParameter(new SqlParameter("par1",Types.VARCHAR));
declareParameter(new SqlParameter("par2", Types.VARCHAR));
declareParameter(new SqlParameter("par3",Types.VARCHAR));

这是错误日志

   org.springframework.dao.DataIntegrityViolationException: CallableStatementCallback; SQL [{call sampleProc(?, ?, ?, ?, ?, ?)}Error converting data type nvarchar to datetime2.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: Error converting data type nvarchar to datetime2.
at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.doTranslate(SQLErrorCodeSQLExceptionTranslator.java:247)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1400)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1063)
at org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1102)
at org.springframework.jdbc.object.StoredProcedure.execute(StoredProcedure.java:122)

我在这个网站上发现了很多具有相同标题的问题,但没有一个对 java 代码有帮助。有人可以帮助我解决这个问题吗?谢谢

最佳答案

我已经解决了这个问题。问题是,storedProcedure.execute 不维护参数顺序,因此它在另一个 nvarchar 字段中设置日期值。我现在在执行方法中传递一个包含字段名称和值的映射,它可以工作。

  Map<String,Object> inParameters = new HashMap<>();
//Its a mandatory field , so passing it as null.
inParameters.put(DAOConstants.ERROR_MSG, null);
inParameters.put(DAOConstants.START_DATE, converJavaToSqlDate(startDate));
inParameters.put(DAOConstants.END_DATE, converJavaToSqlDate(endDate));
inParameters.put(DAOConstants.PARAM1, par1);
inParameters.put(DAOConstants.PARAM2, par2);
inParameters.put(DAOConstants.PARAM3, par3);

Map<String, Object> results = super.execute(inParameters);

关于java - 在 Java 中将数据类型 nvarchar 转换为 datetime2 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47130622/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com