解析SQLDate,java.util.Date和LOCALDATE的

问题描述:

我很困惑使用日期可能有人点我在下面的代码正确的方向,它会引发以下异常:解析SQLDate,java.util.Date和LOCALDATE的

org.h2 .jdbc.JdbcSQLException:为参数 “parameterIndex” 无效值 '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 
+0

http://*.com/questions/1081234/java-date-insert-into-database –

+0

可能的重复感谢您的评论,但我试图将其转换为字符串,我使用PreparedStatement为我的原始版本的代码。 –

+1

@AshfordTulgaa 2011 = 2017 - 4 - 2.你的“日期”被解释为一个数学表达式。上面的链接解决了这个问题。如果您使用的代码与您发布的代码不同,请发布您的实际代码... – assylias

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

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

+0

谢谢你的回复,但第一个索引是ID,它是AUTO_INCREMENT,所以我故意留下了。 –

+1

您的INSERT查询中没有该ID。因此你不应该插入它。 我刚刚注意到ovegner应该是全名(猜一个错字 - 请修复它)。 On Inserts你根本不需要添加id。它将由数据库自动递增。随意从参数中删除id。 –

+0

它的作品非常感谢你 –

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

[编辑]或者至少代码是“正确的”,就像代码的工作原理一样。