如何从preparedstatement执行存储过程

Posted

技术标签:

【中文标题】如何从preparedstatement执行存储过程【英文标题】:how to execute a storedprocedure from preparestatement 【发布时间】:2016-08-03 16:38:40 【问题描述】:

我如何执行我的存储过程。 该程序在我直接从 sql 执行时有效,但当我从平板电脑执行时它不起作用

String itemshelf = DBshelf;// edittext for putting in values on set
String itemcard = DBcard;// edittext for putting in values on where
PreparedStatement preparedStatement = con.prepareStatement("EXEC [dbo].[spUpd_Location]");
                        preparedStatement.executeUpdate();

我的存储过程

ALTER PROCEDURE [dbo].[spUpd_Location]
   @itemshelf nvarchar(1000)=NULL
 , @itemcard nvarchar(1000)=NULL
 AS
SET NOCOUNT ON
UPDATE PS
SET [ShelfNumber]=@itemshelf
FROM [file].[ItemPart] PS
JOIN [file].[Item] P ON P.[id] = PS.[id]
where [ItemNumber]=@itemcard

【问题讨论】:

有什么错误? executeUpdate 看起来不对,因为那不是直接更新 我没有收到任何错误,但它不会更改数据库中的值 @itemcard 为 NULL,因此所有行的相等性测试都是错误的,用 2 个参数调用它? (如果你想与 null 相等,使用 IS NULL) 在我删除 null 后,我得到了未提供的预期参数“@itemshelf”。在我准备好的陈述中 【参考方案1】:

您的存储过程需要两个参数,您需要将它们提供给准备好的语句。您的 SQL 需要为参数提供占位符,并且需要在 PreparedStatement 对象上设置参数。您的代码将如下所示:

String itemshelf = DBshelf;// edittext for putting in values on set
String itemcard = DBcard;// edittext for putting in values on where
PreparedStatement preparedStatement = con.prepareStatement("EXEC [dbo].[spUpd_Location] ?, ?;");
preparedStatement.setString(1, itemshelf);
preparedStatement.setString(2, itemcard);
preparedStatement.executeUpdate();

【讨论】:

我得到无效的参数索引 1 SQL 语句在存储过程名称(已编辑修复)上缺少左括号,这可能是问题所在。 这里有一个类似的question 可能会有所帮助。此外,存储过程似乎没有返回任何内容,因此 executeUpdate 应该只是 execute

以上是关于如何从preparedstatement执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

JDBC中Statement与PreparedStatement的区别

java中PreparedStatement与Statement相比具有啥优势?

JDBC、MySQL:从 PreparedStatement 执行获取回行数据

转载----PreparedStatement和Statement的区别

使用JDBC CallableStatements执行存储过程

java中PreparedStatement执行带参数的sql语句如何实现模糊查询?