繁体   English   中英

在SQL Server的prepareStatement上执行PreparedStatement

[英]PreparedStatement is executed on prepareStatement on SQL Server

我们有一个类似于以下内容的Java代码:

PreparedStatement stmt = connection.prepareStatement("drop login tmp");
int result = stmt.executeUpdate();

通过调试器运行时,似乎我们的SQL语句在执行第一行之后甚至在执行第二行之前执行。 当执行第二行时,由于用户名tmp不再存在,所以将再次执行drop SQL,并导致错误。

这仅针对SQL Server,而针对具有类似drop SQL查询的Oracle和Postgres则不会。

这是一个已知问题吗? 除了转移到Statement而不是PreparedStatement之外,是否有一个通用的解决方法?

我认为最好的选择是对测试数据库运行SQL Server Profiler,并查看运行此代码时真正对服务器造成的影响。 使用C#准备好的语句,您会看到类似

declare @p1 int
set @p1=-1
exec sp_prepexec @p1 output, N'@param, varchar(100)', ...
select @p1

Java或SQL客户端库可能使用其他技术。

话虽这么说,预处理语句仅设计用于缓存和参数化可参数化的重复的类似语句。 这个想法是保存重新编译SQL语句。 如果您不发出许多重复的类似语句,那么准备好的语句就不利于您,并且缓存SQL没用。 就我个人而言,我无法想象使用'drop login'如此之多,以至于缓存会有所帮助。

最重要的是,我认为DROP LOGIN语句不能在T-SQL中使用参数。

创建PreparedStatement ,查询将发送到服务器以对其进行预编译( Source )。

猜测中,SQLServer认为没有占位符,而是执行查询。

从评论来看,您已经知道解决方法是创建一个Statement

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM