在用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);即可。
? 一定要是在英文输入法情况下输入