【问题标题】:Parsing SQLDate, java.util.Date and LocalDate解析 SQLDate、java.util.Date 和 LocalDate
【发布时间】:2017-03-28 08:32:15
【问题描述】:

我对使用日期感到非常困惑,有人可以为下面的代码指出正确的方向吗,它会引发以下异常:

org.h2.jdbc.JdbcSQLException: 参数值“11”无效 "参数索引" [90008-193]

 import java.util.logging.Level;
 import java.util.logging.Logger;
 import java.sql.*;
 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.time.LocalDate;
 import java.time.ZoneId;


 public class Database {

     public static void main(String[] args) throws SQLException {  
        Connection conn = null;
        Statement st = null;
        String URL = "jdbc:h2:~/registDB";
        String USER = "admin";
        String PASSWORD = "password";
        ZoneId z = ZoneId.systemDefault() ;
        LocalDate currentDate = LocalDate.now(z);
        LocalDate expiration = currentDate.plusDays(inputFld.getText()); //JTextField.getText()
        java.sql.Date expirationDate = java.sql.Date.valueOf(expiration);

        try {  
           Class.forName("org.h2.Driver").newInstance();
           conn = DriverManager.getConnection(URL,USER,PASS);
           String sql = "INSERT INTO data
                        (fullName,regNum,itemName,note,zHemjee,fee,
                         time,date,totalPay,expirationDate)"
                         + "VALUES"
                         + "(?,?,?,?,?,?,?,?,?,?)";
           pst = conn.prepareStatement(sql);  
                   // 1st index left not being modified on purpose which is ID auto_increment-ed     
           pst.setString(2, getFullName());   // Get methods are   
                                         // JTextField.getText() casted into proper data types
                                         // except the 11th row which is throwing SQLException
           pst.setString(3, getRegNum());
           pst.setString(4, getItemName());
           pst.setString(5, getNote());
           pst.setInt(6, getzHemjee());
           pst.setInt(7, getFee());
           pst.setInt(8, getTime());
           pst.setDate(9, java.sql.Date.valueOf(LocalDate.now()));
           pst.setDouble(10, getTotalPay());
           pst.setDate(11, expirationDate);
           pst.executeUpdate();
           pst.close();
           conn.close();

        } catch (ClassNotFoundException | SQLException ex) {
         Logger.getLogger(database.class.getName()).log(Level.SEVERE, null, ex);
        }      
    }
 }

这是我创建一个包含列类型的表的 SQL 语句:

  CREATE TABLE IF NOT EXISTS data "
            +"(id INT NOT NULL AUTO_INCREMENT,"             //int
            + " fullname varchar(30),"                      //String
            + " regNum varchar(10),"                        //String
            + " itemName varchar(30),"                      //String
            + " note varchar(30),"                          //String
            + " zHemjee int,"                            //int
            + " fee number,"                                //int
            + " time INT,"                                  //int
            + " date DATE,"                                 //Date
            + " totalPay BIGINT,"                           //int
            + " expirationDate DATE);");                    //Date

【问题讨论】:

  • 感谢您的评论,但我尝试将其转换为字符串,并且我将 PreparedStatement 用于我的原始代码版本。
  • @AshfordTulgaa 2011 = 2017 - 4 - 2. 您的“日期”被解释为数学表达式。上面的链接解决了这个问题。如果您使用的代码与您发布的不同,请发布您的实际代码...
  • @assyslias 非常感谢
  • 你告诉我的链接在哪里? stackoverflow.com/questions/1081234/…这个?

标签: java h2 java-time sql-date-functions date


【解决方案1】:

问题是您输入了错误的索引。 您应该从 1 而不是 2 开始。
只有 10 个“?”你有第 11 个不存在的参数。
这段代码应该可以工作:

String sql = "INSERT INTO data
                    (ovogNer,regNum,itemName,note,zHemjee,hvv,
                     hugatsaa,date,totalPay,expirationDate)"
                     + "VALUES"
                     + "(?,?,?,?,?,?,?,?,?,?)";
pst = conn.prepareStatement(sql);       
pst.setString(1, getFullName());  
pst.setString(2, getRegNum());
pst.setString(3, getItemName());
pst.setString(4, getNote());
pst.setInt(5, getzHemjee());
pst.setInt(6, getFee());
pst.setInt(7,  getTime());
pst.setDate(8, java.sql.Date.valueOf(LocalDate.now()));
pst.setDouble(9, getTotalPay());
pst.setDate(10, expirationDate);
pst.executeUpdate();

您在设置整数时也有奇怪的“+”。

【讨论】:

  • 感谢您的回复,但第一个索引是 ID,它是 AUTO_INCREMENTed,所以我故意留下了它。
  • 您的 INSERT 查询中没有 id。因此你不应该插入它。我刚刚注意到 ovegner 也应该是全名(猜错字 - 请修复它)。在插入时,您根本不需要添加 id。它将由数据库自动递增。随意从参数中删除 id。
【解决方案2】:

Bojan Petkovic 的回答是正确的。话虽如此,每当我有两个或三个以上的参数时,我总是使用索引变量来防止错误。像这样:

int index = 1;
String sql = "INSERT INTO data
                    (ovogNer,regNum,itemName,note,zHemjee,hvv,
                     hugatsaa,date,totalPay,expirationDate)"
                     + "VALUES"
                     + "(?,?,?,?,?,?,?,?,?,?)";
pst = conn.prepareStatement(sql);       
pst.setString(index++, getFullName());  
pst.setString(index++, getRegNum());
pst.setString(index++, getItemName());
pst.setString(index++, getNote());
pst.setInt(index++, getzHemjee());
pst.setInt(index++, getFee());
pst.setInt(index++,  getTime());
pst.setDate(index++, java.sql.Date.valueOf(LocalDate.now()));
pst.setDouble(index++, getTotalPay());
pst.setDate(index++, expirationDate);
pst.executeUpdate();

当然,这种方法取决于您将所有内容按正确的顺序排列(您已经这样做了)。另一种选择是使内部常量可以计算为数字。但是,当您达到这一点时,您确实需要使用一个框架来进行 SQL 访问。 :)

[编辑] 或者至少在代码按照描述工作的意义上是“正确的”。

【讨论】:

    猜你喜欢
    • 2019-07-22
    • 1970-01-01
    • 2017-11-12
    • 2018-03-01
    • 2018-07-15
    • 2011-12-06
    • 2016-09-08
    • 2011-08-01
    • 2020-04-17
    相关资源
    最近更新 更多