简体   繁体   English

JDBC存储映射中的转换错误,但查询在Management Studio中工作正常

[英]Conversion error in jdbc store mapping but query works fine in Management Studio

I have this stored procedure: 我有这个存储过程:

USE [MYDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_UPLOAD_MOVTIT_Update]
    ( @IN_ID_RECORD             nvarchar(2)
    , @IN_COD_IST               nvarchar(5)
    , @IN_COD_SOC_GEST          char(5)
    , @IN_COD_PTF               nvarchar(2)
    , @IN_COD_LIN               nvarchar(2)
    , @IN_COD_GEST              nvarchar(5)
    , @IN_DAT_RIF               nvarchar(10)    
    , @IN_DAT_VAL               nvarchar(10)
    , @IN_ID_UPLOAD             nvarchar(2)
    , @IN_COD_CAUS              nvarchar(6)
    , @IN_VAL_COD_TIT           nvarchar(30)
    , @IN_DIV_RIF               nvarchar(3)
    , @IN_IMP                   numeric(25,3)
    , @IN_IMP_RATEO             decimal(18,3)
    , @IN_QTA                   numeric(18,5)
    , @IN_PRZ                   decimal(21, 10) = 0
    , @IN_FX                    decimal(18, 9)
    , @IN_COD_MER               nvarchar(20)
    , @IN_NOTE                  nvarchar(100))

AS      

    DECLARE @@SQL                   nvarchar(max)
        , @@TABLE_NAME              nvarchar(45)
        , @@WHERE                   nvarchar(max)
        , @@DAT_RIF                 smalldatetime   
        , @@DAT_VAL                 smalldatetime

    SET NOCOUNT ON   

    SET @@TABLE_NAME = 'UPLOAD_MOVTIT'
    SET @@TABLE_NAME = @@TABLE_NAME + '_' + @IN_COD_SOC_GEST 

    SET @@WHERE = ' WHERE'

    IF (LTRIM(@IN_ID_RECORD) <> '')
        SET @@WHERE = @@WHERE + ' AND ID_RECORD = '+@IN_ID_RECORD

    IF (LTRIM(@IN_COD_IST) <> '')       
        SET @@WHERE = @@WHERE + ' AND COD_IST = @IN_COD_IST'

    IF (LTRIM(@IN_COD_SOC_GEST) <> '')
        SET @@WHERE = @@WHERE + ' AND COD_SOC_GEST = @IN_COD_SOC_GEST'  

    --IF (LTRIM(@IN_COD_PTF) <> '')
    --  SET @@WHERE = @@WHERE + ' AND COD_PTF = @IN_COD_PTF'    

    --IF (LTRIM(@IN_COD_LIN) <> '')     
    --  SET @@WHERE = @@WHERE + ' AND COD_LIN = @IN_COD_LIN'

    --IF (LTRIM(@IN_COD_GEST) <> '')        
    --  SET @@WHERE = @@WHERE + ' AND COD_GEST = @IN_COD_GEST'  

    IF (LTRIM(@IN_DAT_RIF) <> '')
        SET @@DAT_RIF = CONVERT(SMALLDATETIME, LTRIM(@IN_DAT_RIF), 103) 

    IF (LTRIM(@IN_DAT_VAL) <> '')
        SET @@DAT_VAL = CONVERT(SMALLDATETIME, LTRIM(@IN_DAT_VAL), 103) 

    IF (LTRIM(@IN_ID_UPLOAD) <> '')
        SET @@WHERE = @@WHERE + ' AND ID_UPLOAD = '+@IN_ID_UPLOAD   

    IF (@@WHERE <> ' WHERE')        
        SET @@WHERE = REPLACE(@@WHERE, ' WHERE AND', ' WHERE')
    ELSE
        SET @@WHERE = ''

    BEGIN
        SET @@SQL = 'UPDATE ' + @@TABLE_NAME 
            + ' SET COD_PTF = @IN_COD_PTF
                , COD_LIN = @IN_COD_LIN
                , COD_GEST = @IN_COD_GEST
                , DAT_RIF = @@DAT_RIF 
                , DAT_VAL = @@DAT_VAL
                , COD_CAUS = @IN_COD_CAUS
                , VAL_COD_TIT = @IN_VAL_COD_TIT
                , DIV_RIF = @IN_DIV_RIF
                , IMP = @IN_IMP
                , IMP_RATEO = @IN_IMP_RATEO
                , QTA = @IN_QTA
                , PRZ = @IN_PRZ
                , FX = @IN_FX
                , COD_MER = @IN_COD_MER
                , NOTE = @IN_NOTE
                , DAT_ULT_MOD = CURRENT_TIMESTAMP ' + @@WHERE 

    END

    PRINT @@sql

    EXEC sp_executesql @@SQL
                        , N'@IN_ID_RECORD nvarchar(2), @IN_COD_IST  nvarchar(5), @IN_COD_SOC_GEST char(5), @IN_COD_PTF nvarchar(2), @IN_COD_LIN nvarchar(2), @IN_COD_GEST nvarchar(5), @IN_DAT_RIF nvarchar(10), @IN_DAT_VAL nvarchar(10), @IN_COD_CAUS nvarchar(6), @IN_VAL_COD_TIT nvarchar(30), @IN_DIV_RIF  nvarchar(3), @IN_ID_UPLOAD nvarchar(2), @IN_IMP numeric(25,3), @IN_IMP_RATEO decimal(18,3), @IN_QTA numeric(18,5), @IN_PRZ  decimal(21, 10), @IN_FX decimal(18, 9), @IN_COD_MER nvarchar(20), @IN_NOTE nvarchar(100), @@DAT_RIF smalldatetime, @@DAT_VAL smalldatetime'
                        , @IN_ID_RECORD, @IN_COD_IST, @IN_COD_SOC_GEST, @IN_COD_PTF, @IN_COD_LIN, @IN_COD_GEST, @IN_DAT_RIF, @IN_DAT_VAL, @IN_COD_CAUS, @IN_VAL_COD_TIT, @IN_DIV_RIF, @IN_ID_UPLOAD, @IN_IMP, @IN_IMP_RATEO, @IN_QTA, @IN_PRZ, @IN_FX, @IN_COD_MER, @IN_NOTE,@@DAT_RIF, @@DAT_VAL


RETURN @@ERROR

And I've mapped it as follows: 我将其映射如下:

public class UploadMovTitUpdateStoredProcedure extends StoredProcedure {

    private static final String SPROC_NAME = "sp_UPLOAD_MOVTIT_Update";

    public UploadMovTitUpdateStoredProcedure(JdbcTemplate jdbcTemplate) {
        super(jdbcTemplate, SPROC_NAME);    


        declareParameter(new SqlReturnResultSet("result", new RowMapper<UploadMovTitSave>() {

            @Override
            public UploadMovTitSave mapRow(ResultSet rs, int rowNum) throws SQLException {
                UploadMovTitSave movTit = new UploadMovTitSave();

                return movTit;
            }
        }));

            declareParameter(new SqlParameter("IN_ID_RECORD", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_COD_IST", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_COD_SOC_GEST", Types.CHAR));
            declareParameter(new SqlParameter("IN_ID_UPLOAD", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_COD_PTF", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_COD_LIN", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_COD_GEST", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_DAT_RIF", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_DAT_VAL", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_COD_CAUS", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_VAL_COD_TIT", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_DIV_RIF", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_IMP", Types.NUMERIC));
            declareParameter(new SqlParameter("IN_IMP_RATEO", Types.DECIMAL));
            declareParameter(new SqlParameter("IN_QTA", Types.NUMERIC));
            declareParameter(new SqlParameter("IN_PRZ", Types.DECIMAL));
            declareParameter(new SqlParameter("IN_FX", Types.DECIMAL));
            declareParameter(new SqlParameter("IN_COD_MER", Types.VARCHAR));
            declareParameter(new SqlParameter("IN_NOTE", Types.VARCHAR));

            compile();

    }

}

The "dao" that calls the stored procedure is as follows: 调用存储过程的“ dao”如下:

public UploadMovTitSave updateMovTitDetail(UploadMovTitSave entity) {
        UploadMovTitUpdateStoredProcedure sproc = new UploadMovTitUpdateStoredProcedure(jdbcTemplate);
        HashMap<String, Serializable> params = new HashMap<String, Serializable>();
        DecimalFormatSymbols symbols = new DecimalFormatSymbols();
        symbols.setGroupingSeparator('.');
        symbols.setDecimalSeparator(',');
        String pattern = "#,##0.0#";
        DecimalFormat decimalFormat = new DecimalFormat(pattern, symbols);
        decimalFormat.setParseBigDecimal(true);
        try {
        params.put("IN_ID_RECORD", entity.getIdRecord());
        params.put("IN_COD_IST", (entity.getCodIst()!=null ? entity.getCodIst() : EMPTY_STRING));
        params.put("IN_COD_SOC_GEST", (entity.getCodSocGest()!=null ? entity.getCodSocGest() : EMPTY_STRING));
        params.put("IN_COD_PTF", (entity.getCodPtf()!=null ? entity.getCodPtf() : EMPTY_STRING));
        params.put("IN_COD_LIN", (entity.getCodLin()!=null ? entity.getCodLin() : EMPTY_STRING));
        params.put("IN_COD_GEST", (entity.getCodGest()!=null ? entity.getCodGest() : EMPTY_STRING));
        params.put("IN_DAT_RIF", (entity.getDatRif()!=null ? entity.getDatRif().trim() : EMPTY_STRING));
        params.put("IN_DAT_VAL", (entity.getDatVal()!=null ? entity.getDatVal().trim() : EMPTY_STRING));
        params.put("IN_ID_UPLOAD", entity.getIdUpload());
        params.put("IN_COD_CAUS", (entity.getCodCaus()!=null ? entity.getCodCaus() : EMPTY_STRING));
        params.put("IN_VAL_COD_TIT", (entity.getValCodTit()!=null ? entity.getValCodTit() : EMPTY_STRING));
        params.put("IN_DIV_RIF", (entity.getDivRif()!=null ? entity.getDivRif() : EMPTY_STRING));
        params.put("IN_IMP", (BigDecimal) decimalFormat.parse((String)entity.getImp()));
        params.put("IN_IMP_RATEO", (BigDecimal) decimalFormat.parse((String)entity.getImpRateo()));
        params.put("IN_QTA", (BigDecimal) decimalFormat.parse((String)entity.getQta()));
        params.put("IN_PRZ", (BigDecimal) decimalFormat.parse((String)entity.getPrz()));
        params.put("IN_FX", (BigDecimal) decimalFormat.parse((String)entity.getFx()));
        params.put("IN_COD_MER", (entity.getCodMer()!=null ? entity.getCodMer() : EMPTY_STRING));
        params.put("IN_NOTE", (entity.getNote()!=null ? entity.getNote() : EMPTY_STRING));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            log.error("Couldn't parse BigDecimals", e);
        }
        log.error("updateMovTitDetail - parametri input : " + params.toString());
        Map<String, Object> results = new HashMap<String, Object>();
        try{
            results = sproc.execute(params);
        }catch(DataIntegrityViolationException ex){
            log.error(ex.getMessage());
            log.error(ex.getStackTrace().toString());
        }


        UploadMovTitSave movTit = (UploadMovTitSave) results.get("result");


        return movTit;
    }

When I run the stored procedure from SQL Server Management Studio with the same parameters passed from the front end the stored procedure returns 0, so no errors. 当我使用前端传递的相同参数从SQL Server Management Studio运行存储过程时,该存储过程返回0,因此没有错误。

Example of this execution: 执行示例:

USE [mydb]
GO

DECLARE @return_value int

EXEC    @return_value = [dbo].[sp_UPLOAD_MOVTIT_Update]
        @IN_ID_RECORD = N'44',
        @IN_COD_IST = N'0',
        @IN_COD_SOC_GEST = N'90000',
        @IN_COD_PTF = N'20',
        @IN_COD_LIN = N'22',
        @IN_COD_GEST = N'00222',
        @IN_DAT_RIF = N'14/06/2017',
        @IN_DAT_VAL = N'18/04/2017',
        @IN_ID_UPLOAD = N'37',
        @IN_COD_CAUS = N'S',
        @IN_VAL_COD_TIT = N'IE00B1W4R501',
        @IN_DIV_RIF = N'USD',
        @IN_IMP = 1022924.19,
        @IN_IMP_RATEO = 0.00,
        @IN_QTA = 66000.00,
        @IN_PRZ = 15.50,
        @IN_FX = 1.07,
        @IN_COD_MER = N' ',
        @IN_NOTE = N' '

SELECT  'Return Value' = @return_value

GO

But when I run it from the software, I get a dataintegrytiviolationexception with this message: 但是,当我从软件运行它时,我收到一条带有以下消息的dataintegrytiviolationexception

CallableStatementCallback; SQL [{call sp_UPLOAD_MOVTIT_Update(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}]; Conversion failed when converting character string to smalldatetime data type.; nested exception is java.sql.SQLException: Conversion failed when converting character string to smalldatetime data type.

I've found there's one parameter switched IN_COD_GEST is printed out instead of IN_DAT_RIF when i print the parameter in the stored procedure.. 我发现在存储过程中打印参数时,会打印出一个已切换的参数IN_COD_GEST而不是IN_DAT_RIF。

问题在于参数的声明顺序,参数的声明顺序与它们在参数列表中的放置顺序相同

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 使用 JDBC 的不明确列,但查询在数据库中工作正常 - Ambiguous column using JDBC but query works fine in database JDBC显示语法错误,但查询在HeidiSQL中运行良好 - JDBC shows syntax error but the query runs just fine in HeidiSQL 查询在SQLDeveloper中有效,但在JDBC中无效 - Query works in SQLDeveloper but not in JDBC 为什么Microsoft SQL Server 2012查询需要几分钟而不是JDBC 4.0,而在Management Studio中需要几分钟? - Why does Microsoft SQL Server 2012 query take minutes over JDBC 4.0 but second(s) in Management Studio? mySQL查询提供了Java中的语法错误,但在mySQL工作台中工作正常 - mySQL query gives syntax error in java, but works fine in mySQL workbench 连接错误 jdbc postgreSQL Android Studio - 解析失败:Ljava/lang/management/ManagementFactory; - Error of connection jdbc postgreSQL Android Studio - Failed resolution of: Ljava/lang/management/ManagementFactory; 为什么在SQL Server 2005 Management Studio中可用的更新查询不能在Java中用作预准备查询? - Why does my update query that works in SQL Server 2005 Management Studio not work as a Prepared Query in Java? 将Spring jdbc中使用的查询转换为db2 - conversion of query used in Spring jdbc to db2 JDBC类型的无方言映射:1111(本机查询) - No Dialect mapping for JDBC type: 1111 (Native Query) JDBC MySQL查询错误? - JDBC MySQL query error?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM