【问题标题】:how to exclude or setnull on some parameter if edittext is empty如果edittext为空,如何在某些参数上排除或设置null
【发布时间】:2017-06-02 15:15:03
【问题描述】:

我有一个带有很多过滤参数的存储过程 我有 2 个 edittext Cardnumber 和 Carcode,这两个都必须填写,然后才能得到任何结果

所以我的问题是,如果其中一个为空或两者均为空,我如何获得结果

 protected String doInBackground(String... params) {
                try {
                    Connection con = connectionClass.CONN();
                    if (con == null) {
                        z = "Error in connection with SQL server";
                    } else {
                        doerTicket = setingPreferences.getString("doerTicket", "");
                        CallableStatement cs = null;
                        String query = "exec [file].[usp_getParts] \n@p_ItemNumber = ?,\n@p_DoerTicket = ?,\n@p_CarItemNumber = ?;
                        cs = con.prepareCall(query);
                        cs.setString(1, Cardnumber);//edittext(@p_ItemNumber)
                        cs.setString(2, doerTicket);
                        cs.setString(3, Carcode);//edittext(@p_CarItemNumber)
                        ResultSet rs = cs.executeQuery();
                        while (rs.next()) {

                    }
                } catch (Exception ex) {
                    z = "Exceptions";
                }
                return z;

            }
        }

我当前在sp中使用的参数

ALTER PROCEDURE [file].[usp_getParts]
    , @p_ItemNumber VARCHAR ( 3000 ) = NULL
    , @p_CarItemNumber NVARCHAR ( 20 ) = NULL
    , @p_DoerTicket VARCHAR ( 200 ) = NULL

带有项目编号 带车码

或者我也可以通过使用得到结果

EXEC    @return_value = [file].[usp_getParts]
        @p_CarItemNumber  = NULL,
        @p_ItemNumber = N'*****',
        @p_DoerTicket = N'0x01000000f475bad9ea7d1f1d6b142a1b8cc95ce74b3f387cb1388a80097f35a8c1e9131ffa7f4b833553bede4a3abec49254373d06fb3294c60c6d24',
        @p_SearchSessionID = @p_SearchSessionID OUTPUT,
        @p_TotalRows = @p_TotalRows OUTPUT

【问题讨论】:

  • 不知何故您的问题令人困惑:您写道两个字段都必须填写,但您问如果一个或两个字段为空,您如何获得结果!?
  • 澄清一下:如果params 为空,您是否正在寻找一种避免设置语句参数的方法?
  • 是的,那是因为我需要把它们都填满才能得到结果
  • @MarcoStramezzi 是的,所以如果我的编辑文本为空,它不会填充参数
  • 我发布了 2 张图片,可以更好地了解我正在尝试做的事情

标签: java sql-server stored-procedures parameters callable-statement


【解决方案1】:

我认为您不能从语句中删除任何参数;我建议您使用通配符来设置未传递给函数的语句参数:

CallableStatement cs = null;
String query = "exec [file].[usp_getParts] \n@p_ItemNumber = ?,\n@p_DoerTicket = ?,\n@p_CarItemNumber = ?";
cs = con.prepareCall(query);
cs.setString(1, Cardnumber != null ? Cardnumber : "*");//edittext(@p_ItemNumber)
cs.setString(2, doerTicket != null ? doerTicket : "*");
cs.setString(3, Carcode != null ? Carcode : "*");//edittext(@p_CarItemNumber)
ResultSet rs = cs.executeQuery();

通过这种方式,您可以使用单个查询来提取具有任何过滤器组合的数据。

如果您不想在某些过滤器未通过时联系数据源,您可以在准备语句之前简单地检查它们并返回错误字符串(或者最好抛出应用程序异常)。

【讨论】:

  • 我仍然没有得到任何结果,因为似乎 Carcode 不支持只是通配符,其他一些参数也是如此,所以有一些我可以使用 @p_CarItemNumber = NULL 代替适用于所有参数
  • 对不起,我不明白你的评论
  • 我不知道该如何解释这一点,因为我试图解释我的汽车代码不支持通配符,所以它不能工作,而是应该使用 @p_CarItemNumber = NULL 就像我在我的问题中解释的那样代码和图片都有
  • 您是否尝试将空Carcode 设置为第三个参数?它不工作吗?我还发现CallableStatement 支持setNull 方法:它可以帮助你吗?
  • cs.setString(4, Cardnumber != null ? Cardnumber : null);//edittext(@p_CarItemNumber) 不起作用,setnull 只支持整数 varchar NULL 等数据类型,所以我不能在那里使用 Cardnumber
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-15
相关资源
最近更新 更多