如何解决此java.sql.SQLException:语句参数<;数量>;未设定

如何解决此java.sql.SQLException:语句参数<;数量>;未设定,java,jdbc,prepared-statement,Java,Jdbc,Prepared Statement,这就是我的DAO类: public Map<String, String> issueOrUpdate(Map<String,String> employeeTempcardMap){ SlingDAO slingdao = new SlingDAO(); Map<String, String> issueOrUpdateMap = new HashMap<String, String>(); Str

这就是我的DAO类:

public Map<String, String> issueOrUpdate(Map<String,String> employeeTempcardMap){
        SlingDAO slingdao = new SlingDAO();
        Map<String, String> issueOrUpdateMap = new HashMap<String, String>();
        StringBuffer issueOrReturnTempcardQuery = new StringBuffer();
        String empname="",functionkey="",tempcardnumber="",dateofissue="",dateofreturn="";
        int empid=0,rowid=0,insertOrUpdateStatus=0;
        Connection connection = slingdao.getConnection();
        PreparedStatement issueOrReturnPS=null;
       if (connection != null) {
           try {
            if(employeeTempcardMap.get("functionkey").toString().equals("issueTempCard")){
                empid =Integer.parseInt(employeeTempcardMap.get("empid").toString()); //empname,tempcardnumber,dateofissue,rowid,dateofreturn
                empname =employeeTempcardMap.get("empname").toString();
                tempcardnumber =employeeTempcardMap.get("tempcardnumber").toString();
                dateofissue =employeeTempcardMap.get("issuedate").toString();
                //System.out.println("11111111111111111111111111111111111");
                //System.out.println("empid : "+empid+" : empname: "+empname+" : tempcardnumber : "+tempcardnumber+": dateofissue "+dateofissue+"Status : "+applicationConstants.ISSUED);

                issueOrReturnTempcardQuery.append(" INSERT INTO acct_tempcardhistory(empid,empname,tempcardnumber,tempcardstatus,issuedate,returndate) ");
                issueOrReturnTempcardQuery.append(" VALUES(?,?,?,?,?,?) ");
            }else{
                dateofreturn = employeeTempcardMap.get("returndate").toString();
                rowid = Integer.parseInt(employeeTempcardMap.get("rowid").toString());
                issueOrReturnTempcardQuery.append(" UPDATE acct_tempcardhistory  SET tempcardstatus=?,returndate=? ");
                issueOrReturnTempcardQuery.append(" WHERE id ="+rowid);
            }

                issueOrReturnPS = connection.prepareStatement(issueOrReturnTempcardQuery.toString());

               if(functionkey.equals("issueTempCard")){
                   //System.out.println("2222222222222222222222");
                   issueOrReturnPS.setInt(1, empid);
                   issueOrReturnPS.setString(2,empname.toString().trim());
                   issueOrReturnPS.setString(3, tempcardnumber.toString().trim());
                   issueOrReturnPS.setString(4, applicationConstants.ISSUED.toString().trim());
                   issueOrReturnPS.setString(5, dateofissue.toString().trim());
                   issueOrReturnPS.setString(6, "".toString().trim());
                   //issueOrUpdateMap.put("message","Temporary Card has been issued to "+empid);

               }else {
                   issueOrReturnPS.setString(1, applicationConstants.RETURNED);
                   issueOrReturnPS.setString(2,dateofreturn);
                   //issueOrUpdateMap.put("message","Temporary Card has been Returned by "+empid);
               }
               insertOrUpdateStatus = issueOrReturnPS.executeUpdate();

               System.out.println(insertOrUpdateStatus + "row(s) affected");

               if(insertOrUpdateStatus >0){
                   issueOrUpdateMap.put("message","Temporary Card has been issued/Returned to "+empid);
               }else{
                   issueOrUpdateMap.put("message","Temporary Card has not been issued/Returned to "+empid);
               }
               connection.close();

              // connection.commit();
           } catch (Exception ex) {
            ex.printStackTrace();
            issueOrUpdateMap.put("message","Temporary Card has not been issued/Returned to "+empid);
           } finally {
               try {
                slingdao.closeConnection(connection, null, issueOrReturnPS);
               } catch (Exception ex) {
                   ex.printStackTrace();
               }
           }
       } else {
           issueOrUpdateMap.put("dbmessage","Connection not Established. Please Contact Vendor");
       }
       return issueOrUpdateMap;
   }
}
当我打印时,我看到了所有的值,但它仍然显示

java.sql.SQLException: Statement parameter <number> not set.
java.sql.SQLException:未设置语句参数。
更新时也适用,但插入数据时不适用,我还将日期设置为字符串

请告诉我怎么走,或者我在哪里迷路

关于

看看这个:

if(functionkey.equals("issueTempCard")){

现在考虑您希望“代码”>功能键< /代码>变量以从中获取值。您如何期望它与发行的电子贺卡相等?为什么创建SQL语句的条件与设置参数的条件不同?为什么你有两个独立的if/else语句

我强烈建议您重构此方法-如果您使代码更清晰,它将帮助您更容易发现此类问题。此外,我强烈建议您对所有值使用参数,避免使用如下代码:

issueOrReturnTempcardQuery.append(" WHERE id ="+rowid);
看看这个:

if(functionkey.equals("issueTempCard")){

现在考虑您希望“代码”>功能键< /代码>变量以从中获取值。您如何期望它与发行的电子贺卡相等?为什么创建SQL语句的条件与设置参数的条件不同?为什么你有两个独立的if/else语句

我强烈建议您重构此方法-如果您使代码更清晰,它将帮助您更容易发现此类问题。此外,我强烈建议您对所有值使用参数,避免使用如下代码:

issueOrReturnTempcardQuery.append(" WHERE id ="+rowid);
你有:

if(functionkey.equals("issueTempCard")){
                   //System.out.println("2222222222222222222222");
                   issueOrReturnPS.setInt(1, empid);
                   issueOrReturnPS.setString(2,empname.toString().trim());
                   issueOrReturnPS.setString(3, tempcardnumber.toString().trim());
                   issueOrReturnPS.setString(4, applicationConstants.ISSUED.toString().trim());
                   issueOrReturnPS.setString(5, dateofissue.toString().trim());
                   issueOrReturnPS.setString(6, "".toString().trim());
                   //issueOrUpdateMap.put("message","Temporary Card has been issued to "+empid);

               }else {
                   issueOrReturnPS.setString(1, applicationConstants.RETURNED);
                   issueOrReturnPS.setString(2,dateofreturn);
                   //issueOrUpdateMap.put("message","Temporary Card has been Returned by "+empid);
               }
如果调用了else,则只设置了参数1和2,但有6个参数

您有:

if(functionkey.equals("issueTempCard")){
                   //System.out.println("2222222222222222222222");
                   issueOrReturnPS.setInt(1, empid);
                   issueOrReturnPS.setString(2,empname.toString().trim());
                   issueOrReturnPS.setString(3, tempcardnumber.toString().trim());
                   issueOrReturnPS.setString(4, applicationConstants.ISSUED.toString().trim());
                   issueOrReturnPS.setString(5, dateofissue.toString().trim());
                   issueOrReturnPS.setString(6, "".toString().trim());
                   //issueOrUpdateMap.put("message","Temporary Card has been issued to "+empid);

               }else {
                   issueOrReturnPS.setString(1, applicationConstants.RETURNED);
                   issueOrReturnPS.setString(2,dateofreturn);
                   //issueOrUpdateMap.put("message","Temporary Card has been Returned by "+empid);
               }

如果调用了else,则只设置了参数1和2,但有6个参数

您忘记将
functionKey
设置为表达式的结果

employeeTempcardMap.get("functionkey").toString();

永远不要声明,尤其是永远不要使用伪值预先初始化本地变量。这只是掩盖了这样的编码问题。如果您有
final String functionKey=…
,这种错误在理论上是不可能的。

您忘记将
functionKey
设置为表达式的结果

employeeTempcardMap.get("functionkey").toString();

永远不要声明,尤其是永远不要使用伪值预先初始化本地变量。这只是掩盖了这样的编码问题。如果您有
最终字符串函数key=…
,这种错误在理论上是不可能的。

这意味着您试图按照代码的预期插入较少的值

范例 您正在插入“1,2” 但代码预期为3 所以应该是“1,2”
它将工作

这意味着您试图按照代码预期插入较少的值

范例 您正在插入“1,2” 但代码预期为3 所以应该是“1,2”
它会工作的

介意给stacktrace吗?在代码中有行号指示吗?请查看更新的stacktrace,它给出了我调用DAO方法的行号,在DAO中,它给出了
insertOrUpdateStatus=issueOrReturns.executeUpdate()中的行号介意给出堆栈跟踪吗?在代码中有行号指示吗?请查看更新的stacktrace,它给出了我调用DAO方法的行号,在DAO中,它给出了
insertOrUpdateStatus=issueOrReturns.executeUpdate()中的行号Jon Skeet,你的观点很有价值,实际上它帮助我解决了这个问题,但是Marko Topolnik提供了代码中的确切问题,但是我非常喜欢你的回答方式,这样就不会变成填鸭式的回答。谢谢。Jon Skeet,你的观点很有价值,实际上它帮助我解决了这个问题,但是Marko Topolnik提供了代码中的确切问题,但是我非常喜欢你的回答方式,这样就不会变成填鸭式的回答。谢谢