欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

com.microsoft.sqlserver.jdbc.SQLServerException: 必须声明标量变量 "@P2where"。

程序员文章站 2024-02-20 15:41:16
...

今天在JDBC连接数据库出现了com.microsoft.sqlserver.jdbc.SQLServerException: 必须声明标量变量 "@P2where"异常。预编译的prepareStatement中“?”前面不能有空格,有等号两边带空格习惯的朋友一定要注意这个问题

at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
	at com.microsoft.sqlserver.jdbc.IOBuffer.processPackets(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getPrepExecResponse(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PreparedStatementExecutionRequest.executeStatement(Unknown Source)
	at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown Source)
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source)
	at com.db.DButil.update(DButil.java:84)
	at com.Dao.StuDao.update(StuDao.java:26)
	at com.Web.updateSer.doPost(updateSer.java:53)

DButil.java:84是count = ps.executeUpdate()

public int update(String sql,Object...objects) {
		conn = getConn();
		int count = 0;
		try {
			ps = conn.prepareStatement(sql);
			if(objects != null && objects.length > 0) {
				for (int i = 0; i < objects.length; i++) {
					ps.setObject(i + 1, objects[i]);
				}
			}
			count = ps.executeUpdate() ;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			close();
		}
		return count;
	}

at com.Dao.StuDao.update(StuDao.java:26)是下面这行:

		update("update Student set name = ?,age = ?,sex = ? where id = ?",t.getName(),t.getAge(),t.getSex(), t.getId());

百度看很多别人的文章发现说是逗号的问题,后来发现没有少逗号,后来经过修改之后正确代码如下 ,预编译的prepareStatement中“?”前面不能有空格,有等号两边带空格习惯的朋友一定要注意这个问题

		update("update Student set name=?,age=?,sex=? where id=?", t.getName(),t.getAge(),t.getSex(), t.getId());