Java不会运行带有参数的prepared语句,也不会抛出任何错误

Java不会运行带有参数的prepared语句,也不会抛出任何错误,java,sql,sql-server,database,jdbc,Java,Sql,Sql Server,Database,Jdbc,我正试图在MSSQL数据库的“视图”中执行如下简单的查询。尝试2天后未成功。所以我转向了这样 PreparedStatement preparedStatement = connection.prepareStatement( "SELECT * FROM Vw_Transactions WHERE Cust_No=? "); preparedStatement.setString(1, "1234"); ResultSet resultSet = prepar

我正试图在MSSQL数据库的“视图”中执行如下简单的查询。尝试2天后未成功。所以我转向了这样

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

preparedStatement.setString(1, "1234");                
ResultSet resultSet = preparedStatement.executeQuery();
问题是我在查询后没有得到任何回复,甚至没有错误。即使等待了很长时间(例如3分钟),也不会。有一两次我在等待了5分钟后得到了一些结果。但那没用。我很想知道为什么在我做一些愚蠢的事情之前,比如对查询进行半清理和字符串concanate参数,作为最后的手段

有趣的观察结果:
  • 当我将客户id硬编码到 字符串和跳过语句。它带来的结果非常快,所以现在我确定不是数据加载导致了速度慢
  • 如果我运行 当我使用示例客户id时,它会出现在VisualStudio控制台中 直接地
  • 如果我选择不同的视图,相同的查询格式也可以工作 从数据库
我能看到的最后一个日志是:

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

注意:我已经提到了quesiton,我的不是重复的场景。我已经确定我没有犯那些错误

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

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

由于您的
Cust\u No
是SQL Server中的
char
类型,因此在这种情况下,这将是字符集转换

如前所述,字符串参数在默认情况下以Unicode(
nvarchar
)的形式发送,导致您的查询对所有
Cust\u No
执行
char
nvarchar
的转换


尝试添加
;sendStringParametersAsUnicode=false
到您的连接字符串中以禁用此功能。

什么是sql数据类型字段
Cust\u No
取决于
Cust\u No
的数据类型,您可能会强制sql Server对所有客户编号进行整数到字符串的转换(假设Cust\u No是数字)。这将对所有行执行,并将忽略视图中Cust_No上设置的所有索引。所以在比较查询速度时,您是否确实执行了
WHERE Cust_No='1234'
。@Jan在Visual Studio中,我可以看到
数据类型:char
。是的,我使用了'WHERE Cust_No='1234',对java类中字符串中的参数进行了硬编码。结果非常快。如果您发送字符串的nvarchar参数,然后转换为char(单字节字符集),也可能发生同样的情况。请参阅并尝试设置
;sendStringParametersAsUnicode=false
在数据库的连接URL中Y!如果没有像你这样的人对我说的话,我永远不会知道这件事。太棒了!我对你感激不尽。你能把它作为答案和任何更多的链接,帮助我了解你是如何知道这个转换发生在屏幕后面的。我会尽快接受的。Thnx Thnx Thnx。