java.sql.SQLException:[Microsoft] [ODBC Microsoft Access>驱动程序]参数太少。预期1

时间:2012-06-29 00:38:07

标签: java jsp

我正在调用来自InserStudent.jsp的表单的AddStudent.jsp文件 从我想要在数据库中插入数据。

我的数据库表的结构如下:

ID|Name|RollNumber|PhoneNumber|StudyProgram|Status

以下是InserStudent.jsp

的代码
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@ page import="java.sql.*" %>
<!DOCTYPE html>
<html>   
<body>

    <%
     String nam=request.getParameter("stuname");  
     String roll=request.getParameter("sturoll");  
     String phone=request.getParameter("stuphone");  
     String prog=request.getParameter("stuprogram");  
     String stats=request.getParameter("stustatus");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url =  "jdbc:odbc:stdProjectDataDSN";
Connection c = DriverManager.getConnection(url);
Statement statement = c.createStatement() ;
String sql = "insert into students (ID, NAME, RollNumber, PhoneNumber, StudyProgram, Status )";
sql += "values ( '"+ nam +"','"+ nam +"','"+ roll +"','"+ phone +"','"+ prog +"',"+ stats +" )";
statement.execute ( sql );
c.close();
response.sendRedirect("ManageAllStudent.jsp");
    %>
 </body>
</html>

这会导致以下异常:

  

HTTP状态500

     

输入例外报告

     

消息

     

description服务器遇到内部错误(),导致无法完成此请求。

     

例外

     

org.apache.jasper.JasperException:在第27行处理JSP页面/web/InserStudent.jsp时发生异常

     

24:声明声明= c.createStatement();
  25:String sql =“插入学生(ID,NAME,RollNumber,PhoneNumber,StudyProgram,Status)”;   26:sql + =“values('”+ nam +“','”+ nam +“','”+ roll +“','”+ phone +“','”+ prog +“',”+统计+“)”;

     

27:statement.execute(sql);
  28:c.close();   29:   30:response.sendRedirect(“ManageAllStudent.jsp”);

     

堆栈跟踪:   org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:521)   org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:412)   org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)   org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)

     

根本原因

     

javax.servlet.ServletException:java.sql.SQLException:[Microsoft] [ODBC Microsoft Access&gt;驱动程序]参数太少。预期1。   注意Apache Tomcat / 6.0.35 logs.javax.servlet.http.HttpServlet.service(HttpServlet.java:717)中提供了根本原因的完整堆栈跟踪

我错过了什么或我做错了什么?在ShowAllStudent.jsp页面中,它显示了我使用相同脚本的数据库中的所有数据。

2 个答案:

答案 0 :(得分:1)

您不应该在JSP中编写Java代码(阅读SO FAQ - How to avoid Java Code in JSP)。您必须添加Servlet才能执行数据库操作。

除此之外,您还必须了解JDBC API的工作原理,并且@BalusC评论说您的代码是sql注入漏洞的受害者。要避免SQL注入,请使用PrepreadStatement(参数化查询)。

Connection cn=null;
PreparedStatement ps=null;

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url =  "jdbc:odbc:stdProjectDataDSN";
Connection c = DriverManager.getConnection(url);

try{
  String sql="insert into students (ID,NAME,RollNumber,PhoneNumber,StudyProgram,Status) 
               Values (?,?,?,?,?,?)";
  ps=cn.prepareStatement(sql);
  ps.setInt(1,10);
  ps.setString(2,nam);
  ...
  ps.executeUpdate()
}catch(SQLException ex){

}finally{
  if(ps!=null){
     try { ps.close(); } catch(Exception ex) {}
  }
  if(cn!=null){
     try { cn.close(); } catch(Exception ex) {}
  }
}

PS:如果列ID是自动生成号,则不要包含在列集中。

 String sql="insert into students (NAME,RollNumber,PhoneNumber,StudyProgram,Status) 
                   Values (?,?,?,?,?)";

答案 1 :(得分:1)

我得到了iam缺少我没有在控制面板中配置我的数据库 - &gt;管理工具......

因此,当我设置它时,它只是工作:)

相关问题