0

我正在 从要在数据库中插入数据的位置调用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

类型异常报告

信息

描述 服务器遇到一个内部错误 () 阻止它完成这个请求。

例外

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 > Driver] 参数太少。预期 1. 注意 Apache Tomcat/6.0.35 logs.javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 中提供了根本原因的完整堆栈跟踪

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

4

2 回答 2

1

您不应该在JSP(阅读 SO FAQ -如何避免 JSP 中的 Java 代码)中编写 Java 代码。您必须添加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 (?,?,?,?,?)";
于 2012-06-29T01:56:36.283 回答
1

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

所以当我设置它时它就可以工作:)

于 2012-07-02T00:12:36.857 回答