【问题标题】:MySql Data truncated for column 'advance' at row 1MySql 数据在第 1 行被截断为列 'advance'
【发布时间】:2013-10-03 09:11:36
【问题描述】:

在我的项目中,我使用了 txtAdvance 的关键事件。

    double gtotal = Double.parseDouble(txtGtotal.getText());
    double ad = Double.parseDouble(txtAdvance.getText());
    double due = gtotal - ad;
    txtDue.setText(String.valueOf(due));

在最后一行运行之后,我添加了一个保存按钮来保存这些数据。下面给出的是该查询。

    public void saveInvoice(JTextField txtgtotal, JTextField txtAdvance, JTextField txtDue, JTextField txtInID) {

    try {
        db.putData("INSERT INTO indetails(inid, gtotal, advance, due) VALUES( '" + txtInID.getText() + "' ,'" + txtgtotal.getText() + "' , '" + txtAdvance.getText() + " ' " + " , '" + txtDue.getText() + "') ");
        JOptionPane.showMessageDialog(null, txtAdvance.getText());

        JOptionPane.showMessageDialog(null, "Invoice details saved");
    } 
    catch (Exception e) {
        JOptionPane.showMessageDialog(null, this.getClass().getName() + " first " + e);
    }
}

我在第 1 行截断了列 'advance' 的 MySql 数据。 Advance的数据类型是Double。但我找不到长度的方法。
(例如
列名:iid,数据类型:Int(18) {主键}
列名:inid,数据类型:Int( 18)
列名:gtotal,数据类型:Double
列名:advance,数据类型:Double
列名 em>:到期,数据类型:双
)

我正在使用 MySQL 查询浏览器。问题是当我向 txtAdvance 添加 0 值时,我遇到了这个错误。

【问题讨论】:

  • 我正在使用 JDBC 连接。
  • putData 方法是什么?为什么不使用PreparedStatement
  • 您的 PreparedStatement 应该是:"INSERT INTO indetails(inid, gtotal, advance, due) VALUES(?,?,?,?) 并且您应该使用 setDouble(2, ad) 来设置 advance 列。
  • @aged 我认为我的查询是正确的,如你所说。对不起,我在 mysql 查询浏览器中找不到设置高级 cloumn。你能解释一下吗?我会非常感谢你的。
  • 请看下面我的回答

标签: java mysql swing double


【解决方案1】:

如果您尝试保存的数据有小数点,则将 advancedatatype 更改为 double,长度为 10, 3 其中 10 表示位数,3 表示小数位数。

使用这个查询,

db.putData("INSERT INTO indetails(inid, gtotal, advance, due) VALUES(" + txtInID.getText() + "," + txtgtotal.getText() + "," + txtAdvance.getText() + "," + txtDue.getText()+")");

【讨论】:

  • @Dilini 仅适用于所有 character/varchar/date/timestamp 数据类型,我们必须使用 单引号数字我们不需要使用任何东西
【解决方案2】:

您应该使用 db 驱动程序,而不是手动创建查询:

PreparedStatement putData = con.prepareStatement("INSERT INTO indetails(inid, gtotal, advance, due) VALUES(?,?,?,?)");

double gtotal = Double.parseDouble(txtGtotal.getText());
double ad = Double.parseDouble(txtAdvance.getText());
double due = gtotal - ad;

putData.setInt(1, inid);
putData.setDouble(2, gtotal);
putData.setDouble(3, ad);
putData.setDouble(4, due);

try {
    putData.execute();
    JOptionPane.showMessageDialog(null, txtAdvance.getText());
    JOptionPane.showMessageDialog(null, "Invoice details saved");
} 
catch (Exception e) {
    JOptionPane.showMessageDialog(null, this.getClass().getName() + " first " + e);
}

【讨论】:

  • @aged but putData.setInt(1, inid);不被认为是一种方法。它只在工作 db.putData(sql query);我该怎么办?
  • 在上面的代码中putDatajava.sql.PreparedStatement类型的变量,所以putData.setInt(1, inid);必须有效。
猜你喜欢
  • 2012-06-23
  • 2021-08-19
  • 2016-12-11
  • 2014-01-09
  • 2021-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多