Java 将字符串值传递给SQL bigint列
鉴于以下陈述:Java 将字符串值传递给SQL bigint列,java,sql,jdbc,Java,Sql,Jdbc,鉴于以下陈述: String query = "Select * from T_spareParts where SparePartPK IN (? )" 在我的BackBean(JSF 2)中,我首先遍历表中的所有汽车,并构建一个包含当前选择的所有汽车的字符串(通过选择每个汽车ID作为主键),因此在传递给SQL之前的最后一个字符串可能如下所示: String finalString = " '1','2','3','4'"; 然后: this.pr
String query = "Select * from T_spareParts where SparePartPK IN (? )"
在我的BackBean(JSF 2
)中,我首先遍历表中的所有汽车,并构建一个包含当前选择的所有汽车的字符串(通过选择每个汽车ID作为主键),因此在传递给SQL之前的最后一个字符串可能如下所示:
String finalString = " '1','2','3','4'";
然后:
this.prepareStatement= this.connection.prepareStatement(query);
this.prepareStatement.setString(1,finalString);
this.prepareStatement.executeQuery();
引发的异常为:
Error converting data type nvarchar to bigint.
现在我的理解是异常是由于SparePartPK
是类型bigint
引起的,我们正在传递一个字符串
但在SQL Server(2008)中,我可以做到:
Select * from T_spareParts where SparePartPK IN ('1','2','3','4')"
返回预期的结果。为什么我会遇到异常?我如何才能更正该问题?(如果这不是最好的方法,也可以随意评论)
更新:
我还尝试生成没有单引号的finalString
,这会导致引发相同的异常:
String finalString = " 1,2,3,4";
您应该将数字放入数组(而不是字符串),并使用preparedStatement.setArray()谢谢您的建议。尽管作为一种替代方法,我创建了一个
StoredProcedure
,其中包含一个参数,在StoredProcedure中,我使用传递的参数运行上述查询,在部分中形成
因此上述所有代码仍然适用,传递给StoredProcess的参数是一个字符串,由,
分隔,不带单引号
可能不是最佳答案,但效果很好:) 尝试从集合中删除单引号。@AVD-刚刚尝试了您的建议-引发了完全相同的异常。是否可以在prepareStatement中使用put finastring而不使用参数setString?谢谢您的建议。我将字符串更改为long[]类型,并尝试使用this.prepareStatement.setObject(1,testArray)
设置prepareStatement,但出现异常错误驱动程序不支持此函数。setObject(1,类[J)
。我不允许更改我们使用的JDBC驱动程序……我相信有些人会不同意我的观点,但我尽量远离存储过程,只在绝对必要时使用它们。存储过程语言是不可移植的-几乎所有支持存储过程的数据库都有不同的存储过程语言。如果使用存储过程d proc,以后需要切换到另一个数据库,您必须重新编写存储的proc,而准备好的语句将在所有数据库中运行。对于一个小的爱好项目,我想这并不重要,但对于“真实”开发,它经常会起作用。我明白您的观点-我们刚刚转移到一个新的SQL Server,通常他们喜欢运行我目前所在公司的所有东西都是微软的,所以转移到另一个数据库环境的可能性很小。不过,感谢你指出这一点,我会在以后的案例中牢记这一点。