关于order by后面不能使用参数传递值问题。

    今天,在小程序中做到排序功能时,莫名抛出了一个奇怪的错误。'@P3' 附近有语法错误。代码如下:

	@Override
	public List<Users> getUsers(int index,StringBuffer sb,int displayNum,String sortName,String sortDir) throws ClassNotFoundException, SQLException
	{
		int start=index;
		int end=index+displayNum;
		List<Users> list=new ArrayList<Users>();
		String sql="select rownum=identity(int,1,1),UserID,UserName,rolename,Email,Name,Age,Gender,Telephone,[state] into #temp from users" +
				" join [Role] " +
				" on Users.RoleID=[Role].roleid " +
				" select top 10 * ,total=(select COUNT(*) from #temp) from #temp " +
				" where rownum>? and rownum<=? ";
				if(!(sortName.equals("") || sortDir.equals("")))
				{
					sql+=" order by ? ?";
				}
				sql+=" drop table #temp";
		Connection conn=prepare();
		PreparedStatement ps=conn.prepareStatement(sql);
		ps.setInt(1, start);
		ps.setInt(2, end);
		if(!(sortName.equals("") || sortDir.equals("")))
		{
			ps.setString(3, sortName);
			ps.setString(4, sortDir);
		}
		ResultSet rs= ps.executeQuery();
		String s="";
		while(rs.next())
		{
			Users user=new Users();
			user.setAge(rs.getString("Age"));
			user.setEmail(rs.getString("Email"));
			user.setGender(rs.getString("Gender"));
			user.setName(rs.getString("Name"));
			user.setState(rs.getString("state").charAt(0));
			user.setTelephone(rs.getString("Telephone"));
			user.setUserID(rs.getString("UserID"));
			user.setUserName(rs.getString("UserName"));
			user.setRoleName(rs.getString("rolename"));
			list.add(user);
			s=rs.getString("total");
		}
		sb.append(s);
		conn.close();
		ps.close();
		rs.close();
		return list;
	}

    经过一些简单的排除,我琢磨着应该是ps.setString(3,sortName)这一句出现了问题。

   但是,令人不解的是,不管怎么分析,语句没有错,传入的参数也没有错。就是一执行就会报错。

   于是,我把代码改成下面这样。

	@Override
	public List<Users> getUsers(int index,StringBuffer sb,int displayNum,String sortName,String sortDir) throws ClassNotFoundException, SQLException
	{
		int start=index;
		int end=index+displayNum;
		List<Users> list=new ArrayList<Users>();
		
		String sql="select rownum=identity(int,1,1),UserID,UserName,rolename,Email,Name,Age,Gender,Telephone,[state] into #temp from users" +
		" join [Role] " +
		" on Users.RoleID=[Role].roleid " +
		" select top 10 * ,total=(select COUNT(*) from #temp) from #temp " +
		" where rownum>"+start+" and rownum<="+end+" ";
		if(!(sortName.equals("") || sortDir.equals("")))
		{
			sql+=" order by "+sortName+" "+sortDir+" ";
		}
		sql+=" drop table #temp";
		Connection conn=prepare();
		Statement ps= conn.createStatement();
		ResultSet rs= ps.executeQuery(sql);
		String s="";
		while(rs.next())
		{
			Users user=new Users();
			user.setAge(rs.getString("Age"));
			user.setEmail(rs.getString("Email"));
			user.setGender(rs.getString("Gender"));
			user.setName(rs.getString("Name"));
			user.setState(rs.getString("state").charAt(0));
			user.setTelephone(rs.getString("Telephone"));
			user.setUserID(rs.getString("UserID"));
			user.setUserName(rs.getString("UserName"));
			user.setRoleName(rs.getString("rolename"));
			list.add(user);
			s=rs.getString("total");
		}
		sb.append(s);
		conn.close();
		ps.close();
		rs.close();
		return list;
	}
    有意思的是,这次执行却没有报任何错,完美运行。可是,这现象却让我不解了,为什么同样的语句,两种不同的写法会有如此差异呢?

    后来,通过自己不断的缩小测试范围,以及网上查得的一些资料。总算是知道了,order by 后面不能用参数的形式传入值。只能用字符串拼接或其他方式。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值