SQLsever数据库问题:com.microsoft.sqlserver.jdbc.SQLServerException: 索引 1 超出范围

来源:互联网 发布:强矩阵组织 编辑:程序博客网 时间:2024/04/28 06:21

在用java封装sqlsever数据库的时候,遇到了一个很奇怪的问题

主要还是在防止SQL注入的部分代码上:

package dbsqlsever;import java.sql.*;public class SQLinject{static void read(String name) throws SQLException{Connection conn = null;        //Statement stmt = null;        PreparedStatement ps = null;   //会对sql语句进行预处理ResultSet rs = null;        try        {        //建立连接        conn = DB_init.getConnection();                //创建语句                //stmt = conn.createStatement();                String sql = "select num,name,age from studentinfo where convert(nvarchar(255),name) = ?";                ps = conn.prepareStatement(sql);        ps.setString(1, name);                //执行语句        rs = ps.executeQuery();                //输出结果        while(rs.next())        {        System.out.println(rs.getObject("num")+"\t"        +rs.getObject("name")+"\t"        +rs.getObject("age"));        }                }finally         {DB_init.free(rs,ps,conn);}}public static void main(String[] args) throws SQLException{// TODO 自动生成的方法存根read("a");}}



在用ps.setString(1, name);函数时,两个参数,运行之后却会显示

Exception in thread "main" com.microsoft.sqlserver.jdbc.SQLServerException: 索引 1 超出范围。at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:191)at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(SQLServerPreparedStatement.java:933)at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setValue(SQLServerPreparedStatement.java:948)at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setString(SQLServerPreparedStatement.java:1578)at dbsqlsever.SQLinject.read(SQLinject.java:26)at dbsqlsever.SQLinject.main(SQLinject.java:48)
com.microsoft.sqlserver.jdbc.SQLServerException: 索引 1 超出范围。


说明:也可能是索引2 or 3 ...超出范围。

原因:存储过程中的变量定义顺序和在java代码中调用时的变量赋值顺序有问题。

检查一下你的sql语句,1)看一下你的sql语句中的?号是中文还是英文

                                          2)看一下你的sql语句中?号的个数是否与你传入的参数的个数刚好相等

                                          3 ) 使用Dao包时:          

                                           param=null;                               

                                           rs=dao.query(sql, param);会出现以上错误,因为你的sql语句中没有?号,所以不需要添加param,                                            即使param为空。

                                           改成 rs=dao.query(sql);即可。



经过一番检查后,才发现:



?  一定要是在英文输入法情况下输入


阅读全文
0 0