Java不会运行带有参数的prepared语句,也不会抛出任何错误
我正试图在MSSQL数据库的“视图”中执行如下简单的查询。尝试2天后未成功。所以我转向了这样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
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。