![](/img/trans.png)
[英]difference between prepareStatement() and preparedStatement() behaviour
[英]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.