【问题标题】:Ways of concatenating string in a prepared statement [duplicate]在准备好的语句中连接字符串的方法[重复]
【发布时间】:2017-01-19 01:29:30
【问题描述】:

我有一个 Web 应用程序,它需要根据用户的输入将其数据存储在特定的表中。例如如果用户输入代码“A”,他们的数据将保存到数据库A,而如果用户输入代码“B”,数据将保存到数据库B。我需要知道是否有办法操纵准备好的语句,以便将代码连接到准备好的语句字符串的末尾。

我有 3 个表,MachineProblem2A、2B 和 2C。有没有办法简单地将代码连接到下面我的 sql 字符串的末尾?

        String sql="select * from MachineProblem2";
        PreparedStatement pstmnt= conn.prepareStatement(sql);

我尝试了不同的方法,例如“从 MachineProblem2 中选择 *”+employeeCode 但它不起作用。我试过 "select * from MachineProblem2".concat(employeeCode) 它不能正常工作。 我什至尝试了一个我在条件语句存在的地方创建的函数,它依赖于employeeCode,例如if(employeeCode.equals("A") return "select * from MachineProblem2A"

所有这些都给了我一个 Null Pointer Exceptionjava.lang.InstantiationException: bean employeeRecords not found within scope 错误。

我在 sqlRet() 和 getAllRecords() 上得到空指针,但数据输入正确存储在指定的表上。我在检索它们以进行输出时遇到问题。

private String sqlInsert(){
    if(employeeCode.equals("A") && employeeSales > 2500){
        return "insert into MachineProblem2A(EmployeeName, EmployeeCode, EmployeeSales, EmployeeGross, EmployeeCommission, EmployeeResult)"+ "values(?,?,?,?,?,?)";
    }else if(employeeCode.equals("B") && employeeSales > 2000){
        return "insert into MachineProblem2B(EmployeeName, EmployeeCode, EmployeeSales, EmployeeGross, EmployeeCommission, EmployeeResult)"+ "values(?,?,?,?,?,?)";
    }else if(employeeCode.equals("C") && employeeSales > 1500){
        return "insert into MachineProblem2C(EmployeeName, EmployeeCode, EmployeeSales, EmployeeGross, EmployeeCommission, EmployeeResult)"+ "values(?,?,?,?,?,?)";
    } return null;

}       
private String sqlRet(){
    if(employeeCode.equals("A") && employeeSales > 2500){
        return "select * from MachineProblem2A";
    }else if(employeeCode.equals("B") && employeeSales > 2000){
        return "select * from MachineProblem2B";
    }else if(employeeCode.equals("C") && employeeSales > 1500){
        return "select * from MachineProblem2C";
    } return null;

}

 private void insertRecord(Connection conn){

    try{


        PreparedStatement pstmnt= conn.prepareStatement(sqlInsert());
        pstmnt.setString(1, employeeName);
        pstmnt.setString(2, employeeCode);
        pstmnt.setDouble(3, employeeSales);
        pstmnt.setDouble(4, gross);
        pstmnt.setDouble(5, commission);
        pstmnt.setDouble(6, result);

        //now commit to database
        pstmnt.executeUpdate();

    }catch(SQLException sqle){
        sqle.printStackTrace();
    }

}


// get records

    public ResultSet getAllRecords(Connection conn){
    ResultSet records = null;

    try{


        PreparedStatement pstmntA= conn.prepareStatement(sqlRet());

        records= pstmntA.executeQuery();



    }catch(SQLException sqle){
        sqle.printStackTrace();
    }
    return records;
}

//错误//

java.lang.NullPointerException
edu.ust.iics.employee.model.EmployeeBean.sqlRet(EmployeeBean.java:183)
edu.ust.iics.employee.model.EmployeeBean.getAllRecords(EmployeeBean.java:225)
edu.ust.iics.employee.controller.EmployeeHistoryServlet.doPost(EmployeeHistoryServlet.java:35)
edu.ust.iics.employee.controller.EmployeeHistoryServlet.doGet(EmployeeHistoryServlet.java:28)
javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

【问题讨论】:

  • 你有三个数据库或三个表?
  • 抱歉,3 桌。已更正。
  • 好。你能从三个表中提供三列吗?请提供三个表名及其列名
  • 你得到的异常与串联无关。发布导致异常的实际代码及其完整的堆栈跟踪。这看起来像糟糕的数据库设计,顺便说一句。
  • 嗯,employeeCode 或employeeSales 为空。阅读stackoverflow.com/questions/218384/…

标签: java jdbc prepared-statement string-concatenation


【解决方案1】:


您可以使用以下查询

SELECT T1.COLUMN_NAME || T2.COLUMN_NAME || T3.COLUMN_NAME
FROM
TABLE_1 T1, TABLE_2 T2, TABLE_3 T3
WHERE T1.PRIMARY_KEY_COLUMN = T2.PRIMARY_KEY_COLUMN
AND
T1.PRIMARY_KEY_COLUMN = T3.PRIMARY_KEY_COLUMN

告诉我你需要它作为 sql 查询或 java

【讨论】:

  • 我不认为这是被问到的......问题中的这 3 个表似乎是分片的糟糕尝试,而不是逻辑连接的表,因此您可以对它们进行连接查询.
  • 是的,明白了。会帮助你
猜你喜欢
  • 1970-01-01
  • 2023-03-08
  • 2011-04-18
  • 2022-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-30
相关资源
最近更新 更多