Hikaricp: Unable cast HikariProxyPreparedStatement to SQLServerPreparedStatement

Created on 30 Nov 2017  路  3Comments  路  Source: brettwooldridge/HikariCP

Environment

HikariCP version: 2.7.1
JDK version     : 1.8.0_111
Database        : MSSQL
Driver version  : 6.2.2

I`d like to use TVP table valued params

`SQLServerDataTable dt = new SQLServerDataTable();
dt.addColumnMetadata("Field1" , Types.INTEGER);
dt.addColumnMetadata("Field2" , Types.INTEGER);
dt.addRow(1,1);

SQLServerPreparedStatement stmt = (SQLServerPreparedStatement) getConnection().prepareStatement(sql);
stmt.setStructured(1, "dbo.CustomTPV", dt);
stmt.execute();
`
But actually i got exception

java.lang.ClassCastException: com.zaxxer.hikari.pool.HikariProxyPreparedStatement cannot be cast to com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement

Most helpful comment

I assume you figured it out... unwrap().

All 3 comments

I assume you figured it out... unwrap().

For those having the same issue, as state by @brettwooldridge you can use unwrap:

SQLServerPreparedStatement sqlServerStatement = preparedStatement.unwrap(SQLServerPreparedStatement.class)

@brettwooldridge / @laduguer , can you please provide full example? I tried the below, but couldn't get it to work

 try (Connection conn = hkds.getConnection();
                 //HikariProxyCallableStatement stmt3 = (HikariProxyCallableStatement) conn.prepareCall(PrepStmt)
                 //SQLServerCallableStatement sqlServerStatement = PrepStmt.
                   //      preparedStatement.unwrap(SQLServerPreparedStatement.class)
                 SQLServerCallableStatement stmt3 = (SQLServerCallableStatement) conn.prepareCall(PrepStmt);
                 //HikariProxyCallableStatement sss = (HikariProxyCallableStatement) stmt3.unwrap(SQLServerCallableStatement.class);
                ) {
                stmt3.registerOutParameter(1,Types.INTEGER);
                stmt3.setObject(2,(SQLServerDataTable) parameters[0].getValue());
                //stmt3.setObject("dbo.Integers",(SQLServerDataTable) parameters[0].getValue(),2);
                //stmt3.setStructured(2,"dbo.Integers",(SQLServerDataTable) parameters[0].getValue());
                stmt3.setInt(3,Integer.parseInt(parameters[1].getValue().toString()));
                stmt3.registerOutParameter(4,Types.INTEGER);
                ResultSet rs1 = stmt3.executeQuery();
            }

Forgive my ignorance, I am a DB developer, but learning to work around Java/Jdbc just little bit ago.

Environment:

      <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
            <version>3.4.5</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>mssql-jdbc</artifactId>
            <version>8.4.0.jre8</version>
        </dependency>

E1 : Formatted the code block, added versions

Was this page helpful?
0 / 5 - 0 ratings