Java不会使用参数运行预准备语句,也不会抛出任何错误

时间:2016-06-23 08:25:58

标签: java sql sql-server database jdbc

我尝试在' VIEW'中尝试执行如下所述的简单查询。我的MSSQL数据库。尝试2天后没有成功。所以我转向SO。

PreparedStatement preparedStatement = connection.prepareStatement(
"SELECT * FROM Vw_Transactions WHERE Cust_No=? ");

preparedStatement.setString(1, "1234");                
ResultSet resultSet = preparedStatement.executeQuery();

问题是我在查询后没有得到任何回复。甚至没有错误。甚至在等待很长时间之后,例如3mins。在等待最多5分钟后,我得到了一些结果。但这没用。我很想知道为什么在我做一些愚蠢的事情之前,像查询的半消毒和字符串concantenate参数,作为最后的手段。

有趣的观察:

  • 当我将客户ID硬编码时,同样的查询在java中起作用 字符串并跳过准备好的声明。它带来的结果非常快,所以现在我确定它不是导致速度缓慢的数据负载。
  • 如果我运行,同样的查询 当我使用示例客户ID时,它在Visual Studio控制台中 直接
  • 如果选择其他VIEW,则相同的查询格式有效 来自数据库

我能看到的唯一最后一个日志是:

> SQLServerPreparedStatement:3: calling sp_prepexec: PreparedHandle:0, SQL:SELECT * FROM Vw_Transactions WHERE Cust_No=@P0

注意:我已经提到this问题,而我的不是重复的情况。我已经确定我没有这些错误。

1 个答案:

答案 0 :(得分:2)

根据Cust_No的数据类型,sqljdbc驱动程序可能会以意外格式发送字符串。

这将强制在SQL Server中进行数据转换,使得所有索引在该表/视图上无效。

由于您的Cust_No在SQL Server中的类型为char,因此在这种情况下这将是一个字符集转换。

正如http://msdn.microsoft.com/en-us/library/ms378988(v=sql.110).aspx所指出的那样,默认情况下,字符串参数会以Unicode(= nvarchar)的形式发送,从而导致您的查询对所有{char转换为nvarchar次转换1}}。

尝试将Cust_No添加到您的连接字符串中以禁用此功能。