如何从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的区别