2012-08-10 179 views
6

我有一个MySQL数据库预定义的表格: enter image description here将数据插入到MySQL表用java

我对储蓄从用户输入到数据库中的数据工作,但我不能似乎任何数据的保存数据库。用下面的代码,我试图更新数据库的第一行(ID:1到OTHER 2:0)。我究竟做错了什么?

private java.sql.Connection con = null; 
private PreparedStatement pst = null; 
private ResultSet rs = null; 
private String url = "jdbc:mysql://localhost:8889/deliveryEarn"; 
private String user = "root"; 
private String password = "root"; 

try { 
    con = DriverManager.getConnection(url, user, password); 
    Statement st = (Statement) con.createStatement(); 

    st.executeUpdate("INSERT INTO incomeCalc " + "VALUES (3, 75, 6, 25, 18.50)"); 

    con.close(); 
} 

catch (SQLException ex) { 
    Logger lgr = Logger.getLogger(deliveryMain.class.getName()); 
    lgr.log(Level.SEVERE, ex.getMessage(), ex); 

} 
+0

如果您没有收到错误消息,把SQLException变为异常和看看你得到了什么错误 – 2012-08-10 15:02:36

+0

为什么使用直接sql来做你的插入,而不是像休眠或Ibatis的ORM呢? – Chris 2012-08-10 15:05:59

+0

是的,最好使用像Hibernate或iBatis这样的ORM – 2013-01-01 10:52:39

回答

9

我认为它不会工作,因为值的数量少于您的表中的列数。你需要做的是指定列的名称以匹配你的值的数量。

INSERT INTO incomeCalc VALUES (3, 75, 6, 25, 18.50) // error 
// the only way this will work is when you have only 5 columns in 
// your table but in your case you have 7 that is why it will not work 

应该

INSERT INTO incomeCalc(specify columns here to the values bound to) 
VALUES (3, 75, 6, 25, 18.50) 

w3School: (INSERT)

它可以编写INSERT INTO语句两种形式。

第一种形式不指定列名,其中数据将被插入,只有它们的值:

INSERT INTO table_name 
VALUES (value1, value2, value3,...) 

第二种形式同时指定列名和值将被插入:

INSERT INTO table_name (column1, column2, column3,...) 
VALUES (value1, value2, value3,...) 
3

你插入语句应该是:

"INSERT INTO incomeCalc(ID, TIPS, HOURS, GAS, HOURLY_EARNINGS) " + 
"VALUES (3, 75, 6, 25, 18.50)" 

在你的语句丢失列名等字样。

+0

INSERT语句中的列名是可选的,即使指定它们并不明智,请参阅http://dev.mysql.com/doc/refman/ 5.5/en/insert.html – 2012-08-11 08:36:54

+0

如果在表中具有列数少于实际列数的插入语句,则列名不是可选的。 – AlenBer 2013-10-24 08:53:43

1

你需要指定例如列名:

"INSERT INTO incomeCalc (ID, TIPS, HOURS, GAS, HOURLY_EARNINGS) VALUES (3, 75, 6, 25, 18.50)" 
1

A。按照它们在MYSQL DB中定义的顺序传递表中所有列的值。在这里,我们可以看到在你的表7列,你只提供5个值...

。利用这句法

INSERT INTO TABLE_NAME (COLUMN_NAMES_SEPARATED_BY_COMMA) VALUES (VALUES_SEPARATED_BY_COMMA) 
1

像你munyengm声明rcase将是: “INSERT INTO incomeCalc(ID,TIPS,小时,GAS,HOURLY_EARNINGS)” + “VALUES(3,75,6, 25,18.50)“

但你可能要循环的值和东西,所以我会建议使用准备的语句,而不是,这防止SQL注入。

ps = "INSERT INTO incomeCalc(ID, TIPS, HOURS, GAS, HOURLY_EARNINGS) VALUES (?, ?, ?, ?, ?)" 

然后

 ps.setInt(index++, id); //id=3 
     ps.setInt(index++, tips); //tips=75 
     ps.setInt(index++, hours);//hour=6 
     ps.setInt(index++, gas);//gas=25 
     ps.setFloat(index++, HOURLY_EARNINGS); 
1

首先READONLY = false;

有一些restrictions.You需要把[Name_table$]\前后COLUMN_NAMES后。像这样:

st.executeUpdate("INSERT INTO [IncomeCalc$] (\"ID\", \"TIPS\", \"HOURS\", \"GAS\",\"HOURLY_EARNINGS\") VALUES ('2012-10-25 01:00:00','16.3')"); 
1

这种格式工作对我来说就像你看到它,没有多余的逗号,斜线或其他任何东西是必要的:

statement.executeUpdate("INSERT INTO incomeCalc (value1, value2, value99) VALUES (3, 75, 6)");