解析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
问题是,你是否输入了错误的索引。 你应该从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_INCREMENT,所以我故意留下了。 –
您的INSERT查询中没有该ID。因此你不应该插入它。 我刚刚注意到ovegner应该是全名(猜一个错字 - 请修复它)。 On Inserts你根本不需要添加id。它将由数据库自动递增。随意从参数中删除id。 –
它的作品非常感谢你 –
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访问使用框架的地方。 :)
[编辑]或者至少代码是“正确的”,就像代码的工作原理一样。
http://*.com/questions/1081234/java-date-insert-into-database –
可能的重复感谢您的评论,但我试图将其转换为字符串,我使用PreparedStatement为我的原始版本的代码。 –
@AshfordTulgaa 2011 = 2017 - 4 - 2.你的“日期”被解释为一个数学表达式。上面的链接解决了这个问题。如果您使用的代码与您发布的代码不同,请发布您的实际代码... – assylias