【问题标题】:Fill textboxes with null values用空值填充文本框
【发布时间】:2016-06-26 21:44:37
【问题描述】:

我正在编写一个 Web 应用程序,其中必须从数据库中提取数据并显示在文本框中。一切正常。但我需要在那些文本框if(!rs.next()) 中将值显示为No Data Available,目前我正在尝试下面的代码。

package org.DAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.bean.UserBean;
import org.code.general.DBConnection;
import org.code.general.GetTheUserDetails;

public class GetDataDAO {
    DBConnection dbConnection = new DBConnection();
    GetTheUserDetails getTheUserDetails = new GetTheUserDetails();

    public List<UserBean> list(String systemUserName) throws Exception {

        List<UserBean> userBeans = new ArrayList<UserBean>();
        try {

            Connection conn = dbConnection.getConn();
            Statement stmt = dbConnection.getStmt();
            ResultSet rs = dbConnection.getRs();
            String excelPath = dbConnection.getExcelPath();
            String queryString = null;
            dbConnection.createClassForNameForExcel();
            conn = DriverManager.getConnection(
                    "jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=" + excelPath + "; READONLY=FALSE;");
            System.out.println("Connecting to database…");
            System.out.println("Oracle JDBC Driver Registered!");
            if (conn != null) {
                System.out.println("You made it, take control your database now!");
            } else {
                System.out.println("Failed to make connection!");
            }
            stmt = conn.createStatement();
            queryString = "Select * from [" + dbConnection.getSheetPath()
                    + "$] where STATE IS NULL and [Case Owner] = '"
                    + getTheUserDetails.getUserNameDetails(systemUserName) + "'";
            System.out.println("Query is " + queryString);
            rs = stmt.executeQuery(queryString);
            ResultSetMetaData rsmd = rs.getMetaData();
            System.out.println("bno of cols are " + rsmd.getColumnCount());
            while (rs.next()) {
                if (rs.next()) {
                    UserBean userBean = new UserBean();
                    userBean.setCaseNumber(rs.getString(1));
                    userBean.setCaseOwner(rs.getString(2));
                    userBean.setStatus(rs.getString(4));
                    userBean.setIssue(rs.getString(5));
                    userBean.setReason(rs.getString(6));
                    userBean.setDateOpened(rs.getString(7));
                    userBean.setAge(rs.getInt(8));
                    userBeans.add(userBean);
                } else {
                    UserBean userBean = new UserBean();
                    userBean.setCaseNumber("None");
                    userBean.setCaseOwner("None");
                    userBean.setStatus("None");
                    userBean.setIssue("None");
                    userBean.setReason("None");
                    userBean.setDateOpened("None");
                    userBean.setAge(Integer.parseInt("None"));
                    userBeans.add(userBean);
                }
            }

            rs.close();
            conn.commit();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return userBeans;
    }
}

根据我的理解,我已经写了尝试下面的算法,

if(rs.next)
   then create the bean and add the values from database,
 else 
   create the bean and add the values as None

请让我知道我哪里出错了,我该如何解决这个问题。

谢谢

【问题讨论】:

  • 我认为两次调用rs.next() 不是一个好主意。这将导致不显示第一个值,因为您跳过了它。其次,如果数据库不包含任何值,那么它不应该指向新行。您是说这些值只是空值,但该行存在吗?我只是担心这些行会是空的,然后你在循环中的逻辑将不起作用。
  • 另外,如果rs.next() 为假,这意味着你不能创建一个空的UsesrBean。您必须在 while 循环之外执行此操作。
  • 嗨@JernejK,我可以删除while(rs.next()) 并保留if-else 吗?
  • 视情况而定。数据库是否返回一个实例,只是所有行都为空?或者这是否意味着该表根本不包含行?因为如果表不包含任何行,那么 `rs.next()' 方法将始终为 false。而你的 if else 甚至都不会被执行,因为它甚至都无法进入 while 循环。

标签: java jdbc dao


【解决方案1】:
if(rs.next)
   then create the bean and add the values from database,
 else 
     set the bean as null

在 jsp 中检查 bean 是否为空,然后在文本框下检查 No Data Available。理想情况下,您应该在 servlet 或控制器中执行此操作,因为 jsp 应该尽可能轻

【讨论】:

    【解决方案2】:

    公共布尔 next()

    将光标移动到下一行。如果结果集中没有更多行,则此方法返回 false。

    因此,当您两次拨打rs.next(),一次拨打while 一次拨打if 时,您每次都会错过一行。

    尝试删除if条件

    【讨论】:

      【解决方案3】:

      代码每次迭代都会跳过一行:

      while (rs.next()) {
          if (rs.next())
      

      如果结果集是 0 行或 1 行,则只需使用 rs.next():

      if (rs.next())
      {
          // Use 'rs'.
      }
      else
      {
          // "None".
      }
      

      另外:

      • null 检查conn 是多余的,因为如果DriverManager.getConnection() 失败,则会引发异常。
      • 使用 try-with-resources 确保始终释放 ConnectionStatementResultSet

      【讨论】:

        【解决方案4】:

        如果行是空的,你必须有这样的逻辑:

                rs = stmt.executeQuery(queryString);
                ResultSetMetaData rsmd = rs.getMetaData();
        
                System.out.println("bno of cols are " + rsmd.getColumnCount());
        
                while (rs.next()) {
                        UserBean userBean = new UserBean();
                        userBean.setCaseNumber(rs.getString(1));
                        userBean.setCaseOwner(rs.getString(2));
                        userBean.setStatus(rs.getString(4));
                        userBean.setIssue(rs.getString(5));
                        userBean.setReason(rs.getString(6));
                        userBean.setDateOpened(rs.getString(7));
                        userBean.setAge(rs.getInt(8));
                        userBeans.add(userBean);
                }
                if(userBeans.size() == 0) {
                        UserBean userBean = new UserBean();
                        userBean.setCaseNumber("None");
                        userBean.setCaseOwner("None");
                        userBean.setStatus("None");
                        userBean.setIssue("None");
                        userBean.setReason("None");
                        userBean.setDateOpened("None");
                        userBean.setAge(Integer.parseInt("None"));
                        userBeans.add(userBean);
                }
        
                rs.close();
                conn.commit();
                conn.close();
        

        但如果行不为空,只包含空值,那么你可以有这样的逻辑:

                rs = stmt.executeQuery(queryString);
                ResultSetMetaData rsmd = rs.getMetaData();
                System.out.println("bno of cols are " + rsmd.getColumnCount());
        
                while (rs.next()) {
                        UserBean userBean = new UserBean();
                        String value = rs.getString(1) == null ? "None" : rs.getString(1);
                        // you do this for all the columns, from 1 to 8
                        userBean.setCaseNumber(rs.getString(1));
                        userBean.setCaseOwner(rs.getString(2));
                        userBean.setStatus(rs.getString(4));
                        userBean.setIssue(rs.getString(5));
                        userBean.setReason(rs.getString(6));
                        userBean.setDateOpened(rs.getString(7));
                        userBean.setAge(rs.getInt(8));
                        userBeans.add(userBean);
                }
        
                rs.close();
                conn.commit();
                conn.close();
        

        【讨论】:

        • 很高兴我的第一个代码确实帮助了你。玩得开心编码更多:)
        猜你喜欢
        • 2011-07-07
        • 1970-01-01
        • 2011-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多