【问题标题】:Get error when execute a string which includes multiple SQL statements but data is updated执行包含多个 SQL 语句但数据已更新的字符串时出错
【发布时间】: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),它对我来说效果很好(但后来 addBatchexecuteBatch 对我来说也很好)。

标签: java sql-server jdbc indexoutofboundsexception jtds


【解决方案1】:

您是否尝试将调用分解为多个语句以尝试隔离哪个命令引发异常?此外,您没有用分号分隔每个语句也很奇怪。

    cx = getConnection();
    st = cx.createStatement();   // create sql statement
    String stmt1 = "update ta_rule_pakt set description = 'Syed Test 1', active_flag = '1' where paktpk = '7'";
    String stmt2 = "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";
    String stmt3 = "delete from ta_rule_break_detail_pakz with (rowlock) where paky_ta_rule_break_header = 2";
    String stmt4 = "insert into ta_rule_break_detail_pakz with (rowlock) (pakzpk, paky_ta_rule_break_header, pay_code)  values(14,2, 17 )";
    String stmt5 = "insert into ta_rule_break_detail_pakz with (rowlock) (pakzpk, paky_ta_rule_break_header, pay_code)  values(15,2, 14 )";
    st.execute(stmt1);
    st.execute(stmt2);
    st.execute(stmt3);
    st.execute(stmt4);
    st.execute(stmt5);

【讨论】:

  • 我的方法是接收这个包含多个 SQL 语句的字符串,所以我没有选择将每个语句单独添加到批处理中或用分号分隔每个语句。
  • @SyedRizwanHussain JDBC API 要求您单独添加它们。因此,如果您一次性收到它们,那么您需要在将它们添加到批处理之前正确拆分它们。
  • 这很奇怪。您应该确定向您发送字符串的组件是否可以用换行符或其他方式将其拆分,以便您可以将其作为单独的命令发送。
  • 将巨大的字符串分解成多个语句,并在批处理中单独添加它们,executeBatch() 起作用了。
猜你喜欢
  • 2019-08-24
  • 1970-01-01
  • 2020-07-23
  • 2013-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多