我无法使用Java Server Pages(JSP)和Tomcat连接在mySQL中创建的数据库"测试"。我收到错误消息"无法连接到数据库"。
我正在使用以下软件规格
Tomcat 6.0
jdk1.6.0_21
MySQL的5.1.49
mysql-connector-java-5.1.13-bin
我已经配置了以下环境变量
CATALINA_HOME:C: Program Files Tomcat 6.0
CLASSPATH:C: Program Files Tomcat 6.0 lib servlet-api.jar; C: Program Files Tomcat 6.0 lib jsp-api.jar; C: Program Files Java jdk1.6.0_21 jre lib ext mysql-connector-java-5.1.13-bin.jar。
JAVA_HOME:C: Program Files Java jdk1.6.0_21
我已将mysql-connector-java-5.1.13-bin jar文件放在以下两个位置:
CATALINE_HOME lib
C: Program Files Tomcat 6.0 webapps myapp WEB-INF lib
我目前使用默认用户名" root"和" password" sohail连接到mySQL Server 5.1。当前已选择"测试"数据库
我正在运行以下代码
Test DB Page
Insert Data INTO MYSQL
Connection con = null;
PreparedStatement stmt = null;
try
{
Class.forName("com.mysql.jdbc.Driver").newInstance();
con = DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","sohail");
stmt = con.prepareStatement("INSERT INTO login (loginID, firstname, lastname, gender, birthday, country, emailAddress) VALUES ('?','?','?','?','?','?','?')");
stmt.setString(1, request.getParameter("loginID"));
stmt.setString(2, request.getParameter("firstname"));
stmt.setString(3, request.getParameter("lastname"));
stmt.setString(4, request.getParameter("gender"));
stmt.setString(5, request.getParameter("Date of Birth"));
stmt.setString(6, request.getParameter("Country"));
stmt.setString(6, request.getParameter("emailAddress"));
int num = stmt.executeUpdate();
System.out.println(num +"records updated");
stmt.close();
con.close();
}
catch (Exception ex) {
out.println("Unable to connect to batabase.");
}
finally {
try {
if (stmt != null)
stmt.close();
}
catch (SQLException e) {}
try {
if (con != null)
con.close();
}
catch (SQLException e) {}
}
%>
Done with new DB
谁能解释为什么我无法连接数据库?
更新:我收到以下异常:
java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).
谢谢大家
通过修复以下2个错误,已解决了该问题。
1-不要引用参数,即?
2-删除重复项,即参数编号6
您得到什么错误信息?
请更改out.println("无法连接到batabase。"); 打印出异常。 编辑您的问题以包括例外
使用ex.toString()可以打印异常详细信息,而不是打印简单的消息;
Parameter index out of range (1 > number of parameters, which is 0)
这意味着preparedStatement.setSomething(1, something)已失败,因为1大于参数的可用数量0。
con.prepareStatement("INSERT INTO login (loginID, firstname, lastname, gender, birthday, country, emailAddress) VALUES ('?','?','?','?','?','?','?')"
您应该删除那些单引号。您不需要包括它们。 PreparedStatement将注意正确的引用方式。占位符?应该不带引号使用。所以:
con.prepareStatement("INSERT INTO login (loginID, firstname, lastname, gender, birthday, country, emailAddress) VALUES (?,?,?,?,?,?,?)"
也可以看看:
PreparedStatement教程
也就是说,这不是使用JDBC或JSP的推荐方法。在JSP中应避免使用Java代码。同样,CLASSPATH环境变量将被Tomcat忽略。
不要引用参数。采用
INSERT INTO login (loginID, firstname, lastname, gender, birthday, country,
emailAddress) VALUES (?,?,?,?,?,?,?)");
您的代码还设置了参数编号。 6两次。
+1表示还注意到位置6被设置了两次。 那可能只是错误的原因。
@extra:不,异常消息不会告诉您。 相反,它会出错。
这段代码伤了我的眼睛。
这样的脚本代码是错误的方法。
如果必须将其放在JSP中,则应该使用JSTL 标记。
但这甚至不是一个好主意。您已在页面中以纯文本格式获得了所有连接信息。您没有使用连接池或JNDI查找。您说的是"测试页"-不要让它进入生产阶段。