解析SQLDate、java.util.Date和LocalDate

解析SQLDate、java.util.Date和LocalDate,java,h2,java-time,sql-date-functions,date,Java,H2,Java Time,Sql Date Functions,Date,我很困惑如何处理日期。有人能给我指出正确的方向吗?对于下面的代码,它会引发以下异常: org.h2.jdbc.JdbcSQLException:参数的值“11”无效 “参数索引”[90008-193] 下面是我的SQL语句,用于创建具有列类型的表: CREATE TABLE IF NOT EXISTS data " +"(id INT NOT NULL AUTO_INCREMENT," //int + " fullnam

我很困惑如何处理日期。有人能给我指出正确的方向吗?对于下面的代码,它会引发以下异常:

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

下面是我的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

问题是,如果您输入了错误的索引,您就不会这样做。 您应该从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();

此外,在设置整数时,还出现了奇怪的“+”

问题是您输入了错误的索引。 您应该从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();

此外,在设置整数时,还出现了奇怪的“+”

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

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访问使用框架的位置。:)


[编辑]或者至少代码是“正确的”,即代码按照描述的方式工作。

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访问使用框架的位置。:)


[编辑]或者至少代码在某种意义上是“正确的”,即代码按照所描述的方式工作。

感谢您的评论,可能是重复的,但我尝试将其转换为字符串,并且我使用PreparedStatement作为我的原始代码版本。@AshfordTulgaa 2011=2017-4-2。你的“日期”被解释为一个数学表达式。上面的链接解决了这个问题。如果您使用的代码与您发布的代码不同,请发布您的实际代码…@assyslias非常感谢您这里是您告诉我的链接?这一个?可能是“谢谢你的评论”的副本,但我尝试将其转换为字符串,并使用PreparedStatement作为原始版本的代码。@AshfordTulgaa 2011=2017-4-2。你的“日期”被解释为一个数学表达式。上面的链接解决了这个问题。如果您使用的代码与您发布的代码不同,请发布您的实际代码…@assyslias非常感谢您这里是您告诉我的链接?这一个?谢谢你的回复,但是第一个索引是ID,它是自动递增的,所以我故意留下了它。你的插入查询中没有ID。因此,不应插入它。我刚刚注意到ovegner也应该是全名(猜一个拼写错误-请修复它)。在插入时,根本不需要添加id。它将由数据库自动递增。请随意从参数中删除id。感谢您的回复,但第一个索引是id,并且它是自动递增的,所以我特意留下了它。您的插入查询中没有id。因此,不应插入它。我刚刚注意到ovegner也应该是全名(猜一个拼写错误-请修复它)。在插入时,根本不需要添加id。它将由数据库自动递增。请随意从参数中删除id。