2012-01-16 92 views
3

價值數我遇到了一個錯誤,值java.sql.SQLException:列數不匹配,第1行的mysql JAVA

Column count doesn't match value count at row 1 
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3609) 
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3541) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2002) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2163) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2624) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2127) 
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2427) 

這是超級沮喪,因爲我一直在修改代碼就像改變在所有字符串arg中,但錯誤仍然出現。

public void readDataBase(int val, String d1, String d2, String d3, String d4) throws  Exception { 
try { 
// This will load the MySQL driver, each DB has its own driver 
Class.forName("com.mysql.jdbc.Driver"); 
// Setup the connection with the DB 
connect = DriverManager 
.getConnection("jdbc:mysql://localhost/MAXdb?"+ "user=root&password="); 

// Statements allow to issue SQL queries to the database 
statement = connect.createStatement(); 
// Result set get the result of the SQL query  
    resultSet = statement 
.executeQuery("select * from MAXdb.emcsg"); 
writeResultSet(resultSet); 

// PreparedStatements can use variables and are more efficient 
preparedStatement = connect 
.prepareStatement("insert into MAXdb.emcsg values (default,?, ?, ? , ?, ?)"); 
// Parameters start with 1 

preparedStatement.setInt(1, val); 
    preparedStatement.setString(2, d1); 
preparedStatement.setString(3, d2); 
preparedStatement.setString(4, d3); 
preparedStatement.setString(5, d4); 


preparedStatement.executeUpdate(); 

preparedStatement = connect 
.prepareStatement("SELECT id, Date, Time, Demand, SUPPLY from MAXdb.emcsg"); 
resultSet = preparedStatement.executeQuery(); 
writeResultSet(resultSet); 



    } catch (Exception e) { 
throw e; 
} finally { 
close(); 
} 

} 

我的第二類:

public void Csvreader() throws IOException { 
try { 
// TODO code application logic here 

CSVReader reader = new CSVReader(new FileReader("D:/TEST.csv")); 

String nextLine[]; 
int i = 1; 
Mysql sen = new Mysql(); 
while ((nextLine = reader.readNext()) != null) { 
try { 
sen.readDataBase(i, nextLine[0], nextLine[1], nextLine[2], nextLine[3]); 
i = i+1; 
} catch (Exception ex) { 
Logger.getLogger(Opencsv.class.getName()).log(Level.SEVERE, null, ex); 
} 
} 


} catch (FileNotFoundException ex) { 
Logger.getLogger(Opencsv.class.getName()).log(Level.SEVERE, null, ex); 
} 

} 

數據庫: 字段類型整理屬性Null默認額外操作 ID INT(11)否無
日期文本utf8_general_ci否無
時間文本utf8_general_ci否無
需求文本utf8_general_ci否無
供應文本utf8_general_ci

回答

8

好吧,我懷疑這就是問題所在:

insert into MAXdb.emcsg values (default,?, ?, ? , ?, ?) 

您還沒有指定哪個列的每個這些參數的意思是指 - 我懷疑你不是得了6列。即使在表格中有6列,最好在SQL中明確指出您要爲每個參數使用哪一列。

+0

我只是檢查,只有5場有在MySQL – Eugene 2012-01-16 15:52:23

+0

感謝您的幫助!我發現我的錯誤! – Eugene 2012-01-16 15:59:20

5

看來,下面的語句:

insert into MAXdb.emcsg values (default,?, ?, ? , ?, ?) 

導致錯誤。檢查emcsg是否有6列。

+0

我剛查過,只有5個字段在mysql – Eugene 2012-01-16 15:52:06

+0

感謝您的幫助!我很感激! – Eugene 2012-01-16 15:59:33

2

你在數據庫表中肯定有六列嗎?

總是谷歌錯誤消息或錯誤代碼。通常返回的第一個鏈接將清楚地解釋問題並提供解決方案。

+0

謝謝!我前一陣子發現了我的錯誤! – Eugene 2012-01-16 16:02:20

2

在我看來,數據庫結構存在問題。我想你並沒有假設你擁有的所有領域。

+0

謝謝!我發現我的錯誤! – Eugene 2012-01-16 15:57:16

0

錯誤不在Java中。在你的插入語句中你指定了6列,而MAXdb.emcsg有一些其他的數字。壞消息是 - 如果儘管你有明確的錯誤信息,但你仍然無法發現它,那麼你現在應該停止編碼。它不會變得更容易,一旦你開始犯更多的特定問題的錯誤,你不會在Stackoverflow上找到幫助。

+3

這對你來說相當苛刻......我終於在默認情況下注意到了我的錯誤。對不起, – Eugene 2012-01-16 15:57:02

0

你的方法簽名

public void readDataBase(int val, String d1, String d2, String d3, String d4) 

有5個變量,但你的方法調用有6個:

preparedStatement = connect 
.prepareStatement("insert into MAXdb.emcsg values (default,?, ?, ? , ?, ?)"); 
+1

這並不重要,該方法可以硬編碼一些值或從一個或多個其他參數計算它們。 – 2012-01-16 16:00:06

+0

我以前的評論被低估了。也許我不清楚:方法sig具有多少個參數並不重要,重要的部分是INSERT語句具有與表具有相同數量的值。 – 2012-01-16 16:07:43

+0

@PaulMedcraft:我不好意思,我注意到,想投票給其他人,但似乎是在錯誤的地方點擊了。很抱歉,我的不好。一旦我點擊它,我意識到自己的錯誤。問候 – 2012-01-16 16:15:05

3

假如你試圖改變這個

preparedStatement = connect 
.prepareStatement("insert into MAXdb.emcsg values (default,?, ?, ? , ?, ?)"); 

這個

preparedStatement = connect 
.prepareStatement("insert into MAXdb.emcsg values (?, ?, ? , ?, ?)"); 

這可能適合你。

問候

+0

謝謝!我設法解決它,但我很感激! – Eugene 2012-01-16 16:07:09

+0

@EugeneWong:您的歡迎。很高興你解決了它。問候 – 2012-01-16 16:08:04

相關問題