首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过JDBC正确输入Decimal类型?

如何通过JDBC正确输入Decimal类型?
EN

Stack Overflow用户
提问于 2015-01-26 21:19:29
回答 2查看 5K关注 0票数 0

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

如果我使用下面的代码,它可以很好地插入:

代码语言:javascript
复制
String update = "insert into expenses(Expense,Cost,Purchase_Date,Description)\n" +
                "values('milk', 3.18, '2015-01-23','Grocery');";

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

代码语言:javascript
复制
String ExpenseName;
Double ExpenseCost;
String ExpenseDate;
String ExpenseType;

然后使用以下代码插入值:

代码语言:javascript
复制
String update = "insert into expenses(Expense,Cost,Purchase_Date,Description)\n" +
                "values('"+ExpenseName+"',"+ExpenseCost+",'"+ExpenseDate+"','"+ExpenseType+"');";

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

我的数据库中的成本字段定义为decimal(15,2)

更令人恼火的是,当我尝试将此代码作为测试进行更新时:

代码语言:javascript
复制
String update = "insert into expenses(Expense,Cost,Purchase_Date,Description)\n" +
                "values('"+ExpenseName+"',3.18,'"+ExpenseDate+"','"+ExpenseType+"');";

我收到另一个错误消息:

代码语言:javascript
复制
 SQLException: Data truncation: Incorrect date value: 'null' for column 'Purchase_Date' at row 1

这让我很困惑,因为通过数据库,我可以用'2015-01-23‘来更新Expends表中的Purchase_Date字段。如果它有任何用途,则该字段为date类型。也许是因为我的java中的date对象是string?

EN

回答 2

Stack Overflow用户

发布于 2015-01-26 21:45:17

你真的应该使用PreparedStatement

代码语言:javascript
复制
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();

另外,你应该正确初始化你的变量。假设它们被声明为字段,您应该将它们初始化为:

代码语言:javascript
复制
String ExpenseName="SomeName";
Double ExpenseCost=1.8;
Date ExpenseDate=new Date();
String ExpenseType="Some Type";

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

票数 3
EN

Stack Overflow用户

发布于 2015-01-26 21:24:59

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28150856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档