【发布时间】:2019-02-20 08:50:11
【问题描述】:
我的环境是 JDK 1.6、Eclipse Indigo、JBoss 4.2.3.GA-jdk6。数据库是 Microsoft SQL Server 2008 R2。我正在使用 jTDS JDBC 驱动程序。
我有一个包含多个 SQL 语句(UPDATE、DELETE 和 INSERT)的字符串。
String sqlString = "update ta_rule_pakt set description = 'Syed Test 1', active_flag = '1' where paktpk = '7' update ta_rule_break_header_paky with (rowlock) set start_time = 14400, end_time = 32364, break_code = 17, break_type = 1 where pakt_ta_rule = '7' and step = 1 delete from ta_rule_break_detail_pakz with (rowlock) where paky_ta_rule_break_header = 2 insert into ta_rule_break_detail_pakz with (rowlock) (pakzpk, paky_ta_rule_break_header, pay_code) values(14,2, 17 ) insert into ta_rule_break_detail_pakz with (rowlock) (pakzpk, paky_ta_rule_break_header, pay_code) values(15,2, 14 )";
我试图执行它:
Connection cx = null;
Statement st = null;
cx = getConnection();
st = cx.createStatement(); // create sql statement
st.addBatch(sqlString);
int a[] = st.executeBatch();
但是int a[] = st.executeBatch(); 正在抛出异常
java.lang.ArrayIndexOutOfBoundsException: 1
虽然 SQL 语句确实正确更新了数据库中的数据。
为什么当 SQL 正确时出现错误?
完整的异常堆栈跟踪是:
2018-09-15 22:45:12,618 错误 [STDERR] java.lang.ArrayIndexOutOfBoundsException:1 2018-09-15 22:45:12,618 错误 [STDERR] 在 net.sourceforge.jtds.jdbc.JtdsStatement.executeBatch(JtdsStatement.java:935) 2018-09-15 22:45:12,619 错误 [STDERR] 在 com.mycompany.ejb.MiscellaneousBean.UpdatePayCategoryBreakPaycode(MiscellaneousBean.java:45517)
2018-09-15 22:45:12,619 错误 [STDERR] 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
2018-09-15 22:45:12,619 错误 [STDERR] 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
2018-09-15 22:45:12,620 错误 [STDERR] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
2018-09-15 22:45:12,620 错误 [STDERR] 在 java.lang.reflect.Method.invoke(Method.java:597)
2018-09-15 22:45:12,620 错误 [STDERR] 在 org.jboss.invocation.Invocation.performCall(Invocation.java:359)
2018-09-15 22:45:12,621 错误 [STDERR] 在 org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.java:237)
2018-09-15 22:45:12,621 错误 [STDERR] 在 org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionInterceptor.java:158)
2018-09-15 22:45:12,621 错误 [STDERR] 在 org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterceptor.java:169)
2018-09-15 22:45:12,621 错误 [STDERR] 在 org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:63)
2018-09-15 22:45:12,621 错误 [STDERR] 在 org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:121)
2018-09-15 22:45:12,622 错误 [STDERR] 在 org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:404)
2018-09-15 22:45:12,622 错误 [STDERR] 在 org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:181)
2018-09-15 22:45:12,622 错误 [STDERR] 在 org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:168)
2018-09-15 22:45:12,622 错误 [STDERR] 在 org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:205)
2018-09-15 22:45:12,622 错误 [STDERR] 在 org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:138)
2018-09-15 22:45:12,622 错误 [STDERR] 在 org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:648)
2018-09-15 22:45:12,623 错误 [STDERR] 在 org.jboss.ejb.Container.invoke(Container.java:960)
2018-09-15 22:45:12,623 错误 [STDERR] 在 sun.reflect.GeneratedMethodAccessor103.invoke(未知来源)
2018-09-15 22:45:12,623 错误 [STDERR] 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
2018-09-15 22:45:12,623 错误 [STDERR] 在 java.lang.reflect.Method.invoke(Method.java:597)
2018-09-15 22:45:12,623 错误 [STDERR] 在 org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
2018-09-15 22:45:12,623 错误 [STDERR] 在 org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
2018-09-15 22:45:12,624 错误 [STDERR] 在 org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
2018-09-15 22:45:12,624 错误 [STDERR] 在 org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
2018-09-15 22:45:12,624 错误 [STDERR] 在 org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
2018-09-15 22:45:12,624 错误 [STDERR] 在 org.jboss.invocation.local.LocalInvoker$MBeanServerAction.invoke(LocalInvoker.java:169)
2018-09-15 22:45:12,624 错误 [STDERR] 在 org.jboss.invocation.local.LocalInvoker.invoke(LocalInvoker.java:118)
2018-09-15 22:45:12,624 错误 [STDERR] 在 org.jboss.invocation.InvokerInterceptor.invokeLocal(InvokerInterceptor.java:209)
2018-09-15 22:45:12,624 错误 [STDERR] 在 org.jboss.invocation.InvokerInterceptor.invoke(InvokerInterceptor.java:195)
2018-09-15 22:45:12,625 错误 [STDERR] 在 org.jboss.proxy.TransactionInterceptor.invoke(TransactionInterceptor.java:61)
2018-09-15 22:45:12,625 错误 [STDERR] 在 org.jboss.proxy.SecurityInterceptor.invoke(SecurityInterceptor.java:70)
2018-09-15 22:45:12,625 错误 [STDERR] 在 org.jboss.proxy.ejb.StatelessSessionInterceptor.invoke(StatelessSessionInterceptor.java:112)
2018-09-15 22:45:12,625 错误 [STDERR] 在 org.jboss.proxy.ClientContainer.invoke(ClientContainer.java:100)
2018-09-15 22:45:12,625 错误 [STDERR] 在 $Proxy148.UpdatePayCategoryBreakPaycode(未知来源)
2018-09-15 22:45:12,625 错误 [STDERR] 在 org.apache.jsp.TARules_005fPayCategoryBreakPaycodeSelectionUpdate_jsp._jspService(TARules_005fPayCategoryBreakPaycodeSelectionUpdate_jsp.java:195)
2018-09-15 22:45:12,626 错误 [STDERR] 在 org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
2018-09-15 22:45:12,626 错误 [STDERR] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
2018-09-15 22:45:12,626 错误 [STDERR] 在 org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:370)
2018-09-15 22:45:12,626 错误 [STDERR] 在 org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:336)
2018-09-15 22:45:12,626 错误 [STDERR] 在 org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)
2018-09-15 22:45:12,626 错误 [STDERR] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
2018-09-15 22:45:12,627 错误 [STDERR] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
2018-09-15 22:45:12,627 错误 [STDERR] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
2018-09-15 22:45:12,627 错误 [STDERR] 在 org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:83)
2018-09-15 22:45:12,627 错误 [STDERR] 在 org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:85)
2018-09-15 22:45:12,627 错误 [STDERR] 在 org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2018-09-15 22:45:12,627 错误 [STDERR] 在 org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:64)
2018-09-15 22:45:12,627 错误 [STDERR] 在 org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2018-09-15 22:45:12,627 错误 [STDERR] 在 org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:44)
2018-09-15 22:45:12,628 错误 [STDERR] 在 org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2018-09-15 22:45:12,628 错误 [STDERR] 在 org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:206)
2018-09-15 22:45:12,628 错误 [STDERR] 在 org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
2018-09-15 22:45:12,628 错误 [STDERR] 在 org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:388)
2018-09-15 22:45:12,628 错误 [STDERR] 在 org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
2018-09-15 22:45:12,628 错误 [STDERR] 在 org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:60)
2018-09-15 22:45:12,628 错误 [STDERR] 在 org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2018-09-15 22:45:12,628 错误 [STDERR] 在 org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:58)
2018-09-15 22:45:12,629 错误 [STDERR] 在 org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2018-09-15 22:45:12,629 错误 [STDERR] 在 org.jboss.seam.debug.hot.HotDeployFilter.doFilter(HotDeployFilter.java:68)
2018-09-15 22:45:12,629 错误 [STDERR] 在 org.jboss.seam.servlet.SeamFilter$FilterChainImpl.doFilter(SeamFilter.java:69)
2018-09-15 22:45:12,629 错误 [STDERR] 在 org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
2018-09-15 22:45:12,629 错误 [STDERR] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
2018-09-15 22:45:12,629 错误 [STDERR] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
2018-09-15 22:45:12,629 错误 [STDERR] 在 com.mycompany.base.filter.BaseFilter.doFilter(BaseFilter.java:81)
2018-09-15 22:45:12,629 错误 [STDERR] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
2018-09-15 22:45:12,630 错误 [STDERR] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
2018-09-15 22:45:12,630 错误 [STDERR] 在 org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96)
2018-09-15 22:45:12,630 错误 [STDERR] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
2018-09-15 22:45:12,630 错误 [STDERR] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
2018-09-15 22:45:12,630 错误 [STDERR] 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230)
2018-09-15 22:45:12,630 错误 [STDERR] 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
2018-09-15 22:45:12,630 错误 [STDERR] 在 org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182)
2018-09-15 22:45:12,630 错误 [STDERR] 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:432)
2018-09-15 22:45:12,631 错误 [STDERR] 在 org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84)
2018-09-15 22:45:12,631 错误 [STDERR] 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
2018-09-15 22:45:12,631 错误 [STDERR] 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
2018-09-15 22:45:12,631 错误 [STDERR] 在 org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157)
2018-09-15 22:45:12,631 错误 [STDERR] 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
2018-09-15 22:45:12,631 错误 [STDERR] 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262)
2018-09-15 22:45:12,632 错误 [STDERR] 在 org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
2018-09-15 22:45:12,632 错误 [STDERR] 在 org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
2018-09-15 22:45:12,632 错误 [STDERR] 在 org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446)
2018-09-15 22:45:12,632 错误 [STDERR] 在 java.lang.Thread.run(Thread.java:662)
com.mycompany 只是我在上面 stracktrace 中的代码
【问题讨论】:
-
请发布完整的异常堆栈跟踪。而且您尝试执行多个语句的方式不正确。您需要将语句单独添加到批处理中,而不是作为一个长字符串。
-
我现在已经发布了完整的异常堆栈跟踪。我的方法是接收这个包含多个 SQL 语句的字符串,所以我没有选择将每个语句单独添加到批处理中。
-
而不是
addBatch(sqlString)和executeBatch()你试过只使用executeUpdate(sqlString)...吗? -
@GordThompson 仔细查看该字符串,它包含多个空格(或制表符)分隔的语句。
-
@MarkRotteveel - 是的,我明白了,但是一些 JDBC 驱动程序确实放宽了“每个
Statement规则一个语句”并允许Statement执行匿名代码块。在发表我的评论之前,我用 jTDS 尝试过 (executeUpdate),它对我来说效果很好(但后来addBatch和executeBatch对我来说也很好)。
标签: java sql-server jdbc indexoutofboundsexception jtds