严重异常问题??
请问这个是什么异常啊??
javax.servlet.ServletException: com.microsoft.jdbc.sqlserver.SQLServerConnection.prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:825)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:758)
    org.apache.jsp.post_jsp._jspService(post_jsp.java:118)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
root cause java.lang.AbstractMethodError: com.microsoft.jdbc.sqlserver.SQLServerConnection.prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;
    org.apache.jsp.post_jsp._jspService(post_jsp.java:63)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)如果把PreparedStatement ps=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS)改为PreparedStatement ps=conn.prepareStatement(sql)就运行正常,但我需要这样写PreparedStatement ps=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS),请问怎么解决异常问题?
代码1:(post.jsp)
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page import="java.sql.*"%><%
    request.setCharacterEncoding("GB2312");
    try
    {
            String action=request.getParameter("action");
            if("post".equals(action))
            {            
                        String title=request.getParameter("title");
                        String cont=request.getParameter("cont");
                        cont=cont.replaceAll("\n","<br>");
                        
                        String DBDRIVER="com.microsoft.jdbc.sqlserver.SQLServerDriver";
                    String DBURL="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Javapet;SelectMethod=cursor";
                        String sql="insert into lunTan(pid,rootid,title,cont,pdate,isleaf) values(0,?,?,?,'2008',0)";
                        Class.forName(DBDRIVER);
                        Connection conn=DriverManager.getConnection(DBURL,"sa","123456");
                        conn.setAutoCommit(false);
                    PreparedStatement ps=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
                    Statement stm=conn.createStatement();
                    
                    ps.setInt(1,-1);
                    ps.setString(2,title);
                    ps.setString(3,cont);
                ps.executeUpdate();
               
                ResultSet rsKey=ps.getGeneratedKeys();
                rsKey.next();
                int Key=rsKey.getInt(1);
                rsKey.close();
                
                stm.executeUpdate("update lunTan set rootid="+Key+"where id="+Key);
                
                conn.commit();
                conn.setAutoCommit(true);
                
                stm.close();
                ps.close();
                conn.close();
                response.sendRedirect("show.jsp");
                }
        }
        catch(Exception e)
        {
                e.printStackTrace();
        }
%>
<html>
    <body>
        <center>
        <form action="post.jsp" method="post">
            <input type="hidden" name="action" value="post">
            <table border=1>
                <tr>
                    <td align="center"><input type="text" name="title" size="81"</td>
                </tr>
                <tr>
                    <td><textArea cols=80 rows=15 name="cont"></textArea></td>
                </tr>
                <tr>
                    <td align="center"><input type="submit" value="提交"></td>
                </tr>
            </table>
        </form>
      </center>
    </body>
</html>
代码2:(show.jsp)
<%@ page contentType="text/html;charset=GB2312"%>
<%@ page import="java.sql.*"%><%    
    String DBDRIVER="com.microsoft.jdbc.sqlserver.SQLServerDriver";
    String DBURL="jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=Javapet";
        Class.forName(DBDRIVER);
        Connection conn=DriverManager.getConnection(DBURL,"sa","123456");
        PreparedStatement ps=conn.prepareStatement("select * from lunTan where pid=0");
    ResultSet rs=ps.executeQuery();   
%>
<html>
    <body>
        <a href="post.jsp">发表新帖</a>
        <table border=1>
<%
              while(rs.next())
              {
%>
            <tr>
              <td><%=rs.getInt("id")%></td>
                <td><%=rs.getString("cont")%></td>
            </tr>
<%              
              }
                rs.close();
        ps.close();
        conn.close();
%>
        </table>
    </body>
</html>

解决方案 »

  1.   

                   PreparedStatement ps=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); 
                        Statement stm=conn.createStatement(); 
    这个位置错拉
      

  2.   

    你执行预编译的时候出错了吧。PreparedStatement ps=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS); 
                        Statement stm=conn.createStatement(); 
    一个是PreparedStatement 下一句Statement,两个连接???下句不要啦。
      

  3.   

    楼主的意思是要在insert时取得自增key值,然后更新rootid让其值等于key值。为什么不直接在数据库设rootid为主key?问题可能出在此处,请在debug模式下走一遍:
                    ResultSet rsKey=ps.getGeneratedKeys(); 
                    rsKey.next(); 
                    int Key=rsKey.getInt(1); 
    抛出的异常是因为类型转换产生的。
    if ( rsKey.next() ) {
        // Retrieve the auto generated key(s).
        int key = rsKey.getInt();
    }
    加个判断。
      

  4.   

    多谢各位了。不过两个statement连起来写是没问题的但是可能是驱动不支持哦。我换了jtds就好了
    搞不清楚是不是这个问题我也不确定但是确实是好用了
      

  5.   

    我都是一个CON只用一个statement的.