2017-11-06 5 views
0

Ich rufe eine MSSQL-Prozedur von spring storedprocedure.execute aus. Ich habe versucht, date Parameter wie java.sql.Date, java.sql.Timestamp und reine Zeichenfolge übergeben, aber mit allen Optionen gibt es den gleichen Fehler "Fehler beim Konvertieren von Datentyp nvarchar nach datetime2" Hier ist die Syntax von meinem procFehler beim Konvertieren des Datentyps nvarchar nach datetime2 in Java

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-Code, der es nennen:

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

und convertJavaDateToSql Methode

ist
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; 
     } 

und das ist, wie ich Parameter deklarieren

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)); 

Hier ist das Fehlerprotokoll

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) 

ich viel Frage auf dieser Seite mit dem gleichen Titel, aber keiner half mit Java code.Could jemand bitte helfen Sie mir zu diesem Thema gefunden. Danke

+0

Bitte fügen Sie die Fehlerprotokolle bei –

Antwort

0

Ich habe das Problem gelöst. Problem war, dass storedProcedure.execute die Parameterreihenfolge nicht so verwaltet, dass es in einem anderen nvarchar-Feld einen Datumswert festlegte. Ich übergebe jetzt eine Karte mit Feldname und Wert in der Methode execute und es funktioniert.

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); 
Verwandte Themen