java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid parameter binding(s).错误

z184931481 2007-06-13 11:55:32
环境:TOMCAT6.0+JDK
注册代码:
<%@ page contentType="text/html; charset=gb2312" %>
<%@ page language="java" import="java.sql.*"%>
<html>
<head>
<title>系统用户注册</title>
</head>
<%
final String DBDRIVER = "com.microsoft.jdbc.sqlserver.SQLServerDriver" ;
final String DBURL = "jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=myjob";

Connection conn = null ;
ResultSet rs = null ;
String name=null;
String password=null;
String user="sa";
String pass="";
String reg_name=request.getParameter("name");
String reg_pass=request.getParameter("password");
Statement st=null;
PreparedStatement stat=null;
boolean flag=true;
try
{
Class.forName(DBDRIVER) ;
conn = DriverManager.getConnection(DBURL,user,pass) ;
st=conn.createStatement();
rs = st.executeQuery("select * from user1") ;
while(rs.next())
{

if(reg_name.equals(rs.getString(1))){
out.println("<br><br><center><B>请重新注册</B></center>");
out.println("<script>alert('对不起,用户名"+reg_name+"已存在');location.replace('reg.jsp');</script>");
flag=false;
break;
}

}
if (flag){
stat=conn.prepareStatement("insert user1(user1.name,user1.pass) values('"+reg_name+"','"+reg_pass+"')");
stat.setString(1,reg_name);
stat.setString(2,reg_pass);
stat.executeUpdate();
out.println("<br><br><center><B>注册成功</B></center>");
out.println("<br><br><center>您的用户名是:"+reg_name+"</center>");
out.println("<br><center>您的密码是: "+reg_pass+"</center>");
stat.close();
String name_reged=null;
session.putValue("name_reged",reg_name);
out.println("<script>alert('谢谢注册,请登陆');location.replace('index.jsp')</script>");


}
rs.close() ;

conn.close() ;
}
catch(Exception e)
{
out.println(e);
}
%>
</html>
报错:
java.sql.SQLException: [Microsoft][SQLServer 2000 Driver for JDBC]Invalid parameter binding(s).

请大侠们帮忙解决,小弟先谢过了
...全文
2276 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
songfuqiang 2008-03-24
  • 打赏
  • 举报
回复
就是设置参数!
z184931481 2007-06-13
  • 打赏
  • 举报
回复
非常感谢
  • 打赏
  • 举报
回复
这就是使用 PreparedStatement 的结果,PreparedStatement 是预编译语句,先将sql语句编译,再填充参数值的,这样可以有效地防范SQL注入。

stat中不是有两个“?”吗。
stat.setString(1, reg_name); 即将第一个问号的值设为 reg_name,1表示第一个问号,setString表示第一个问号的值类型是字符型,还有很多啦,比如:setInt、setDate等,具体使用哪一个就要看问号所对应的类型。
z184931481 2007-06-13
  • 打赏
  • 举报
回复
谢谢问题已解决,stat.setString(1,reg_name);到底代表什么意思呢
  • 打赏
  • 举报
回复
因为你有:

stat.setString(1,reg_name);
stat.setString(2,reg_pass);

所以要把

stat=conn.prepareStatement("insert user1(user1.name,user1.pass) values('"+reg_name+"','"+reg_pass+"')");

改成

stat = conn.prepareStatement("insert user1(user1.name,user1.pass) values(?,?)");

否则它找不到匹配的参数。

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧