gpt4 book ai didi

java - 我收到 ClassCastException : WrappedPreparedStatementJDK8 cannot be cast to SQLServerPreparedStatement

转载 作者:行者123 更新时间:2023-12-01 17:59:40 28 4
gpt4 key购买 nike

我的环境:面向企业 Java 开发人员的 Eclipse IDE,版本:2019-09 R (4.13.0)

服务器:WildFly 13.0.0.Final

我正在尝试将数据批量上传到 Sql Server,下面的代码在具有相同版本的 WildFly 服务器中完美运行,但在具有 java.lang.ClassCastException: org.jboss 的相同 Wildfly 服务器的客户端服务器计算机中失败。 jca.adapters.jdbc.jdk8.WrappedPreparedStatementJDK8 无法在以下语句中转换为 com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement:

SQLServerPreparedStatement pStmt = (SQLServerPreparedStatement) con.prepareStatement(execStoredProc);

完整代码如下:

import com.microsoft.sqlserver.jdbc.SQLServerDataTable;
import com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement;

import java.sql.*;
import java.util.ArrayList;

public class DatabaseExtended extends Database {
public DatabaseExtended(String assetDisposition, String assetDisposition_ds) {
super(assetDisposition, assetDisposition_ds);
// TODO Auto-generated constructor stub
}

public Object executeEstimateStructured(int iClientID, SQLServerDataTable sourceDataTable) {
//boolean rs = false;
ArrayList<String[]> lst = new ArrayList<String[]>();
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = DriverManager.getConnection(super.connectionUrl);
Statement stmt = con.createStatement();
String execStoredProc = "EXEC UploadEstimate ?,?";
SQLServerPreparedStatement pStmt = (SQLServerPreparedStatement) con.prepareStatement(execStoredProc);//<--Exception here
pStmt.setInt(1, iClientID);
pStmt.setStructured(2, "dbo.UT_Estimate", sourceDataTable);
ResultSet rs = pStmt.executeQuery();
int columnCount = rs.getMetaData().getColumnCount();

while (rs.next()) {

int i = 1;
String[] cols = new String[columnCount];
while (i <= columnCount) {
cols[i - 1] = rs.getString(i++);
}
lst.add(cols);
}
con.close();
}
catch (SQLException e) {
e.printStackTrace();
}
return lst;
}
}

在谷歌搜索这个异常时,我发现了这个 link其中讨论了将 jboss-deployment-struction.xml 文件与提到的依赖项一起放置在 WEB-INF 文件夹中。下面是我的 jboss-deployment-struct.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<jboss-deployment-structure>
<deployment>
<dependencies>
<module name="org.jboss.ironjacamar.jdbcadapters" slot="main"/>
<module name="com.microsoft.sqlserver" slot="main"/>
</dependencies>
</deployment>
</jboss-deployment-structure>

我在构建路径和部署结构中引用了 mssql-jdbc-7.4.1.jre8.jar 文件,以便将依赖项添加到 web-inf/lib 文件夹下。

现在,将此 jboss-deployment-struct.xml 文件放入 web-inf 文件夹并部署 war 文件后,出现以下异常。我不确定我的 jboss-deployment-struct.xml 是否正确以及它是否放置在正确的文件夹中。你能帮忙吗?

ERROR [io.undertow.request] (default task-5) UT005023: Exception handling request to /AD/control/UploadEstimates: java.lang.IllegalAccessError: tried to access class com.microsoft.sqlserver.jdbc.Util from class com.microsoft.sqlserver.jdbc.SQLServerDataTable
at com.microsoft.sqlserver.jdbc.SQLServerDataTable.addColumnMetadata(SQLServerDataTable.java:83)
at com.MyClient.AD.util.UploadEstimateUT.start(UploadEstimateUT.java:66)
at com.MyClient.AD.util.UploadEstimates.doPost(UploadEstimates.java:107)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514)
at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1514)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:360)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)
at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1378)
at java.lang.Thread.run(Thread.java:748)
<小时/>

2020 年 3 月 16 日更新

这是我使用批处理语句更新的代码:

    public String executeInboundEstimateBatchedStoredProc(int iClientID, SQLServerDataTable sourceDataTable) {
String message="";
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
Connection con = super.getConnection();
String execStoredProc = "EXEC UploadEstimate ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?";

PreparedStatement pStmt = con.prepareStatement(execStoredProc);

Iterator<Entry<Integer, Object[]>> itr1 = sourceDataTable.getIterator();
while (itr1.hasNext()) {
Object[] lst= itr1.next().getValue();
int numColumns = lst.length;
pStmt.setInt(1, iClientID);
for (int i = 0; i < numColumns; i++) {
pStmt.setString(i+2, lst[i].toString());
}
// add single insert query
pStmt.addBatch();
}

// Execute batch
int[] counts = pStmt.executeBatch();

if (pStmt != null) {
pStmt.close();
}
if (con != null) {
con.close();
}
}
// Handle any errors that may have occurred.
catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
message=e.getMessage();
}
return message;
}

最佳答案

您永远不必检查连接对象的准备语句的返回类型。依赖于平台的底层驱动程序可以提供自己的预准备语句 INTERFACE 的实现,这不是用户关心的。你应该只使用接口(interface)提供的公共(public)方法,而不是进一步挖掘。在你的情况下,你没有错误,只需将你的语句转换为通用类型。 ReadyStatement pStm=con.prepareStatememt(execStoredProc) 如果您处理的过程是我从您的 execStoredProc 中假设的,则使用 con.prepareCall() 并存储在 Callable Statement 类型中

关于java - 我收到 ClassCastException : WrappedPreparedStatementJDK8 cannot be cast to SQLServerPreparedStatement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60658912/

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