Java ResultSet.next()导致SQLServerException:将nvarchar值“NM21”转换为数据类型int时转换失败

Java ResultSet.next()导致SQLServerException:将nvarchar值“NM21”转换为数据类型int时转换失败,java,mysql,sql-server,jdbc,Java,Mysql,Sql Server,Jdbc,我正在尝试创建一个服务器,它可以接受来自客户端的查询,找到匹配的记录,并返回相关信息。这里有很多代码,但最相关的部分是方法getProductString代码。我包含了尽可能多的连接信息,以备您查看,但我的测试查询是通过这个连接工作的。我的测试查询是: ResultSet a=statement.ExecuteQuery从[REDACTED]中选择前10位代码[name in english]、NetSalesPrice、PriceList1 异常似乎是创建或访问ResultSet时数据类型错误

我正在尝试创建一个服务器,它可以接受来自客户端的查询,找到匹配的记录,并返回相关信息。这里有很多代码,但最相关的部分是方法getProductString代码。我包含了尽可能多的连接信息,以备您查看,但我的测试查询是通过这个连接工作的。我的测试查询是:

ResultSet a=statement.ExecuteQuery从[REDACTED]中选择前10位代码[name in english]、NetSalesPrice、PriceList1

异常似乎是创建或访问ResultSet时数据类型错误或NumberFormatException的结果。但是,我尝试将代码强制转换为int,即使行productDescription=rs.getString1+:+rs.getString2+:$+rs.getString3;被注释掉了。我确信错误是由rs.next抛出的。此外,我们知道rs不是空的,因为我们检查了rs.isBeforeFirst,如果结果集为空,它将返回false

这是完整的信息

com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting the nvarchar value 'NM21' to data type int.
   at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer.nextRow(SQLServerResultSet.java:4853)
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1781)
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:1034)
   at PCServer.getProduct(PCServer.java:83)
   at PCServer$ThreadServer.run(PCServer.java:128)

我知道这个问题和其他问题看起来很相似。关于这个错误还有很多其他的帖子,但是没有一篇是由ResultSet抛出的。接下来,我发现了这个错误,结果证明这是一个相当愚蠢的错误。但它教会了我不要放弃我的问题

我的查询需要在代码周围加上单引号。因此,它应该是:

statement.executequaly从ERPLY_项目中选择代码[name in english]、NetSalesPrice、PriceList1,其中代码=“+Code+”,而不是:

statement.executequery从ERPLY_项目中选择代码[name in english]、NetSalesPrice、PriceList1,其中代码=+代码

我已经有很长一段时间忽视了这一点。对于使用WHERE子句按过程生成查询的问题,连接是一种非常容易受到攻击的查询生成方法。相反,Isaac建议使用以编程方式生成查询


我希望这最终会对某些人有所帮助。

您根本不应该将值连接到查询中,您应该使用带有参数占位符的准备好的语句。您当前的代码和解决方案容易受到SQL注入的攻击。我在另一个问题中看到了这一点,这就是为什么我包含了最后一段。我只是想解释我遇到的问题。但后来我改变了我的程序,使用了预先准备好的语句,而不是串联。
com.microsoft.sqlserver.jdbc.SQLServerException: Conversion failed when converting the nvarchar value 'NM21' to data type int.
   at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer.nextRow(SQLServerResultSet.java:4853)
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1781)
   at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:1034)
   at PCServer.getProduct(PCServer.java:83)
   at PCServer$ThreadServer.run(PCServer.java:128)