异常:java.sql.SQLException: General error

时间:2022-11-22 22:53:36
代码如下:
package com.raymond.servlet;


import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;
import com.raymond.util.*;
import java.sql.*;
import jxl.format.UnderlineStyle;
import jxl.write.WritableFont;
import jxl.write.WritableCellFormat;
import jxl.Workbook;


public class CompanyNum_Exp extends HttpServlet {
private static final String CONTENT_TYPE = "text/html; charset=GBK";

//Initialize global variables
public void init() throws ServletException {
}

//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType(CONTENT_TYPE);
String ctxpath = request.getContextPath();
// HttpSession session = request.getSession();

String sTableName = RayTools.safeTrim(request.getParameter("tablename"));
String sHost = RayTools.safeTrim(request.getParameter("host"));
String sPort = RayTools.safeTrim(request.getParameter("port"));
String sDbname = RayTools.safeTrim(request.getParameter("dbname"));
String sFiled = RayTools.safeTrim(request.getParameter("filed"));
String sFilename = RayTools.safeTrim(request.getParameter("filename"));
String sUrl = "jdbc:odbc:Driver={SQL Server};Server=" + sHost + ";Database=" + sDbname;
String strSql = "select " + sFiled + " from " + sTableName;
//先对传入的字符串(查询条件)进行操作
String[] sColumn = sFiled.split(",");
String sMainFiled = sColumn[0];
int iColumnCount = sColumn.length;
//for (int j=0;j<iColumnCount;j++){

//}
String filename = null;
String sOutPutFile = null;
FileOutputStream fos = null;
jxl.write.WritableWorkbook wwb = null;
jxl.write.WritableSheet ws = null;

int iCount = 0;
Connection conn = null;
Statement stm = null;
ResultSet rs = null;
CallableStatement cstm = null;
//conn = getConnection(sUrl);


try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver").newInstance();

conn = DriverManager.getConnection(sUrl,
   "root",
   "123456");
System.out.println("Connection Successful!");

}
catch (Exception ex) {
System.out.println("Connection Faile!");
ex.printStackTrace();
}

int iPerNumber = 500;
try {

stm = conn.createStatement();
rs = stm.executeQuery("select count(1) from " + sTableName);
while (rs.next()) {
iCount = rs.getInt(1);
break;
}
if (rs != null) {
rs.close();
rs = null;
}
if (stm != null) {
stm.close();
stm = null;
}

int iTotalFileCount = iCount / iPerNumber + (iCount % iPerNumber > 0 ? 1 : 0);
for (int i = 1; i <= iTotalFileCount; i++) {

try {
WritableFont headerFont = new WritableFont(WritableFont.ARIAL, 10, WritableFont.BOLD, false
  , UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.BLACK);
WritableCellFormat headerFormat = new WritableCellFormat(headerFont);
if (i < 10) {
sOutPutFile = sFilename + "00" + i;
}
if (i < 100 && i >= 10) {
sOutPutFile = sFilename + "0" + i;
}
if (i < 1000 && i >= 100) {
sOutPutFile = sFilename + i;
}

Random a = new Random();

filename = "c:\\temp\\" + sOutPutFile + ".xls";
fos = new FileOutputStream(filename);
wwb = Workbook.createWorkbook(fos);
ws = wwb.createSheet("企业名录", 1);
int row = 0;
for (int j = 0; j < iColumnCount; j++) {
ws.addCell(new jxl.write.Label(j, 0, sColumn[j], headerFormat));
}
cstm = conn.prepareCall("{call P_GetPageData(?,?,?,?,?, ?,?,?)}");
cstm.setString(1, sTableName);
cstm.setString(2, sFiled);
cstm.setString(3, sMainFiled);
cstm.setInt(4, iPerNumber);

cstm.setInt(5, i);
cstm.setInt(6, 0);
cstm.setInt(7, 0);
cstm.setString(8, "");
rs = cstm.executeQuery();

while (rs.next()) {

row++;
for (int k = 1; k <= iColumnCount; k++) {
String tt = rs.getString(k);
ws.addCell(new jxl.write.Label(k - 1, row, RayTools.ShowString(tt, 150, "")));
}

}
wwb.write();
if (rs != null) {
rs.close();
rs = null;
}
if (cstm != null) {
cstm.close();
cstm = null;
}

if (wwb != null) {
wwb.close();
}
if (fos != null) {
fos.close();
}

}
catch (Exception e) {
e.printStackTrace();
}

} //end for

if (conn != null) {
conn.close();
conn = null;
System.out.println("close conn>>>>>>>>>>>>>>>>");
}

}

catch (Exception e) {
e.printStackTrace();
}
finally {

System.out.println("end__________________________");
}

}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}

//Clean up resources
public void destroy() {
}
}

出现的问题:当次2次执行存储过程P_GetPageData的时候,出现错误提示:java.sql.SQLException: General error

提示出现在代码
rs = cstm.executeQuery();
的位置。

请问:应该怎么修改代码?谢谢。

17 个解决方案

#1


该回复于2015-05-26 11:00:25被管理员删除

#2


出现的问题:当次2次执行存储过程P_GetPageData的时候,出现错误提示:java.sql.SQLException: General error 

1 把错误完整贴上来看看!

2 你第一执行后面可以把statement关闭,重新获得statement,只要连接不换就行。

#3


斑竹厉害  这么长的代码  而且没JAVA格式你也看得下去。。。

#4



       1. 异常如下:
        java.sql.SQLException: General error

at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6987)

at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)

at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3150)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:214)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeQuery(JdbcOdbcPreparedStatement.java:89)

at com.raymond.servlet.CompanyNum_Exp.doGet(CompanyNum_Exp.java:127)

at com.raymond.servlet.CompanyNum_Exp.doPost(CompanyNum_Exp.java:189)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at com.raymond.util.NullUserFilter.doFilter(NullUserFilter.java:91)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)

at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)

at java.lang.Thread.run(Thread.java:534)

      2.我执行第1次存储过程结束后,把cstm,rs都关闭了的,循环后重新获取的。


#5


无语,看来你测试看看把connection也关掉看看吧。

异常里的这个错误太少见了,我啥都开不出来。

哈哈!也许你去看看SQL的日志? 不过我不会看!

#6


应该不是SQL的问题吧?我把传入参数换到SQL里面执行,可以成功获取数据的。

#7


Sql日志有这个提示:
使用 'xpstar.dll' 版本 '2000.80.2039' 来执行扩展存储过程 'sp_MSgetversion'。
我去查查看什么原因先。

#8


引用 5 楼 java2000_net 的回复:
看来你测试看看把connection也关掉看看吧。

我把connection关掉,每次调用的时候再新建连接,也是一样的错误。

#9


SQL Server 拿桥连?为什么不拿 JDBC 驱动连?

#10


引用 9 楼 sagezk 的回复:
SQL Server 拿桥连?为什么不拿 JDBC 驱动连?

桥连不行吗?

#11


连接没有关闭?

#12


学习学习啊

#13


引用 10 楼 dsk22657 的回复:
引用 9 楼 sagezk 的回复:
SQL Server 拿桥连?为什么不拿 JDBC 驱动连?

桥连不行吗?


桥连当然可以,但首选 JDBC 驱动连。

#14


引用 11 楼 M_song 的回复:
连接没有关闭?


连接是循环完了,最后才关闭的。

#15


引用 12 楼 dsn21 的回复:
路过,帮顶...

#16


这种General Error最心烦,也不知道什么玩意

在此提供一种情况: 当往数据库中添加相同主键的记录时会报这个异常。因为主键是不能重复的。

也许正规做法应该在插入新记录前判断数据库中是否已经存在与欲插入的记录主键相同的记录。

#17


在执行之前,你先查看一下
ctms的内容是什么吧。
我以前遇到过厂家的驱动程序出现了不兼容情况,用 ?的占位符号来创建statement,
之后的填充无效。

#1


该回复于2015-05-26 11:00:25被管理员删除

#2


出现的问题:当次2次执行存储过程P_GetPageData的时候,出现错误提示:java.sql.SQLException: General error 

1 把错误完整贴上来看看!

2 你第一执行后面可以把statement关闭,重新获得statement,只要连接不换就行。

#3


斑竹厉害  这么长的代码  而且没JAVA格式你也看得下去。。。

#4



       1. 异常如下:
        java.sql.SQLException: General error

at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6987)

at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)

at sun.jdbc.odbc.JdbcOdbc.SQLExecute(JdbcOdbc.java:3150)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(JdbcOdbcPreparedStatement.java:214)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeQuery(JdbcOdbcPreparedStatement.java:89)

at com.raymond.servlet.CompanyNum_Exp.doGet(CompanyNum_Exp.java:127)

at com.raymond.servlet.CompanyNum_Exp.doPost(CompanyNum_Exp.java:189)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at com.raymond.util.NullUserFilter.doFilter(NullUserFilter.java:91)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)

at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)

at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)

at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)

at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)

at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)

at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)

at java.lang.Thread.run(Thread.java:534)

      2.我执行第1次存储过程结束后,把cstm,rs都关闭了的,循环后重新获取的。


#5


无语,看来你测试看看把connection也关掉看看吧。

异常里的这个错误太少见了,我啥都开不出来。

哈哈!也许你去看看SQL的日志? 不过我不会看!

#6


应该不是SQL的问题吧?我把传入参数换到SQL里面执行,可以成功获取数据的。

#7


Sql日志有这个提示:
使用 'xpstar.dll' 版本 '2000.80.2039' 来执行扩展存储过程 'sp_MSgetversion'。
我去查查看什么原因先。

#8


引用 5 楼 java2000_net 的回复:
看来你测试看看把connection也关掉看看吧。

我把connection关掉,每次调用的时候再新建连接,也是一样的错误。

#9


SQL Server 拿桥连?为什么不拿 JDBC 驱动连?

#10


引用 9 楼 sagezk 的回复:
SQL Server 拿桥连?为什么不拿 JDBC 驱动连?

桥连不行吗?

#11


连接没有关闭?

#12


学习学习啊

#13


引用 10 楼 dsk22657 的回复:
引用 9 楼 sagezk 的回复:
SQL Server 拿桥连?为什么不拿 JDBC 驱动连?

桥连不行吗?


桥连当然可以,但首选 JDBC 驱动连。

#14


引用 11 楼 M_song 的回复:
连接没有关闭?


连接是循环完了,最后才关闭的。

#15


引用 12 楼 dsn21 的回复:
路过,帮顶...

#16


这种General Error最心烦,也不知道什么玩意

在此提供一种情况: 当往数据库中添加相同主键的记录时会报这个异常。因为主键是不能重复的。

也许正规做法应该在插入新记录前判断数据库中是否已经存在与欲插入的记录主键相同的记录。

#17


在执行之前,你先查看一下
ctms的内容是什么吧。
我以前遇到过厂家的驱动程序出现了不兼容情况,用 ?的占位符号来创建statement,
之后的填充无效。