Java 如果edittext为空,如何在某些参数上排除或设置NULL
我有一个存储过程,其中包含许多用于过滤的参数 我有2个edittext Cardnumber和Carcode,在我得到任何结果之前,这两个都必须填写 所以我的问题是,如果其中一个是空的,或者两个都是空的,我如何得到结果Java 如果edittext为空,如何在某些参数上排除或设置NULL,java,sql-server,stored-procedures,parameters,callable-statement,Java,Sql Server,Stored Procedures,Parameters,Callable Statement,我有一个存储过程,其中包含许多用于过滤的参数 我有2个edittext Cardnumber和Carcode,在我得到任何结果之前,这两个都必须填写 所以我的问题是,如果其中一个是空的,或者两个都是空的,我如何得到结果 protected String doInBackground(String... params) { try { Connection con = connectionClass.CONN();
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
使用itemnumber
带车号
或者我也可以通过使用
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
我认为不能从语句中删除任何参数;我建议您使用通配符设置未传递给函数的语句参数:
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();
通过这种方式,您可以使用任何筛选器组合进行单个查询以提取数据
如果您不想在某些筛选器未通过时联系数据源,您只需在准备语句之前检查它们并返回错误字符串(或者最好抛出应用程序异常)。不知何故,您的问题令人困惑:您写的两个字段都必须填写,但是你会问如果其中一个或两个都是空的,你是如何得到结果的!?只是澄清一下:如果任何
params
为空,您是否在寻找一种避免设置语句参数的方法?是的,这是因为我需要先将它们都填充,然后才能从中获得结果it@MarcoStramezzi是的,所以如果我的edittext为空,它不会填充参数。我发布了2张图片,这可能会更好地了解我正在尝试的内容to doi仍然没有得到任何结果,因为Carcode不支持的似乎只是通配符,其他一些参数也是如此,所以有一些方法我可以使用@p_CarItemNumber=NULL来代替,因为这适用于所有参数。我不理解你的评论。我不知道在解释我的Carcode时,如何解释这个问题不要支持通配符,这样它就不能工作,而是应该使用@p_CarItemNumber=NULL,就像我在问题中对代码和图片所解释的那样。您是否尝试将NULLCarcode
设置为第三个参数?这不管用吗?我还发现,CallableStatement
支持一种方法:它可以帮助您吗?cs.setString(4,Cardnumber!=null?Cardnumber:null)//edittext(@p_CarItemNumber)
不起作用,setnull仅支持integer varchar NULL等数据类型,因此我无法在其中使用Cardnumber