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

在用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);即可。



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



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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值