如何通过JDBC正确输入十进制类型?

时间:2015-01-26 13:19:29

标签: java sql jdbc

我已将java项目(使用netbeans)连接到MySQL数据库,但我在插入数据时遇到了问题。

如果我使用此代码,它会很好地插入:

String update = "insert into expenses(Expense,Cost,Purchase_Date,Description)\n" +
                "values('milk', 3.18, '2015-01-23','Grocery');";

但是当我尝试用这些预定义的值替换插入值时:

String ExpenseName;
Double ExpenseCost;
String ExpenseDate;
String ExpenseType;

然后使用此代码插入值:

String update = "insert into expenses(Expense,Cost,Purchase_Date,Description)\n" +
                "values('"+ExpenseName+"',"+ExpenseCost+",'"+ExpenseDate+"','"+ExpenseType+"');";

我收到错误:SQLException:列'Cost'不能为null

我数据库中的费用字段定义为十进制(15,2)

更令人烦恼的是,当我尝试使用此代码作为测试更新时:

String update = "insert into expenses(Expense,Cost,Purchase_Date,Description)\n" +
                "values('"+ExpenseName+"',3.18,'"+ExpenseDate+"','"+ExpenseType+"');";

我得到另一个错误说:

 SQLException: Data truncation: Incorrect date value: 'null' for column 'Purchase_Date' at row 1

这让我感到很困惑,因为通过数据库我在使用'2015-01-23'更新费用表中的Purchase_Date字段时没有任何问题。如果它的任何使用该字段是日期类型。也许是因为我的java中的日期对象是字符串?

2 个答案:

答案 0 :(得分:3)

你真的应该使用PreparedStatement

PreparedStatement pst= con.prepareStatement(
        "insert into expenses(Expense,Cost,Purchase_Date,Description)" +
        " values(?, ?, ?,?)");
pst.setString(1, ExpenseName);
pst.setDouble(2, ExpenseCost);
pst.setDate(3, new java.sql.Date(ExpenseDate.getTime()));
pst.setString(4, ExpenseType);
pst.executeUpdate();

此外,您应该正确地启动变量。 假设它们被声明为字段,您应该将它们初始化为:

String ExpenseName="SomeName";
Double ExpenseCost=1.8;
Date ExpenseDate=new Date();
String ExpenseType="Some Type";

未初始化的变量可能是SQLException的来源,因为ExpenseNameExpenseDate会在您的SQL字符串中连接为"null"

答案 1 :(得分:2)

您应该始终使用PreparedStatement来插入/更新数据,而不是使用字符串连接。这不仅可以帮助您正确formatting the data,还可以保护您免受SQL injection攻击。