我在数据库中有一个表应用程序,其中有一些列命名为leaveid,leavetype,nofdaysand等等.q是所选文本字段选项的逻辑名称。如果某个用户在nofdays
中没有数据,那么我该如何确定?我正在使用它,但它不起作用:
String q = request.getParameter("q");
ResultSet r = smt.executeQuery(
"select leaveid ,leavetype,sum(nofdays) as nofdays from application where (name= '"
+ session.getAttribute("userid") + "' and leavetype='" + q
+ "') group by leavetype" );
while (r.next()) {
nofdays = r.getInt("nofdays");
if (nofdays == 0) {
if (q.equals("SL")) {
balleave = 12 - nofdays;
out.print(balleave);
}
}
我想获得(balleave = 12)中的值。我怎样才能做到这一点?
答案 0 :(得分:0)
有点不清楚你在问什么,但我认为你正在努力解决的问题是你的表包含零行,其中包含所选的用户ID和leavetype
“SR ”。在这种情况下,您似乎想要将balleave
计算为12.假设我已正确解释您,您的方法和特定代码都存在一些问题。
该方法最基本的问题是您的查询不会返回与您要检测的条件对应的任何行。这很自然,因为像您这样的聚合查询只聚合现有的数据。解决此问题的最简单方法可能是在没有指示其他结果时设置默认值(即12)。
现在,您的查询和Java代码对于您描述的任务而言过于复杂,我倾向于认为您对所选结构有更大的理由。但是,由于您尚未公开此类内容,因此我无法建议如何将工作方法集成到其中。相反,这是一个独立版本:
int balleave = 12; // This value will stick if there is no data
String q = request.getParameter("q");
if ("SR".equals(q)) {
PreparedStatement stmt = connection.prepareStatement(
"select sum(nofdays) as nofdays from application where name = ? and leavetype= 'SR'");
try {
stmt.setString(1, session.getAttribute("userid"));
ResultSet r = stmt.executeQuery();
try {
if (r.next()) {
balleave -= r.getInt("nofdays");
}
} finally {
r.close();
}
} finally {
stmt.close();
}
}
请注意,不需要循环,因为结果集最多只包含一行。您的原始代码也是如此。另请注意,通过将输入值与字符串文字连接来构造SQL语句非常不安全。如果要执行由变量输入值参数化的语句,请使用PreparedStatement
。当从用户输入中提取任何参数时,特别是。
此外,仅在用户将balleave
指定为“SR”的情况下才设置q
。如果这是唯一的目标,那么当用户指定q
的其他值时,您根本不需要执行任何查询 - 在这种情况下,您事先知道您不会得到服务于目的