2017-03-28 65 views
0

我很困惑使用日期可能有人點我在下面的代碼正確的方向,它會引發以下異常:解析SQLDate,java.util.Date和LOCALDATE的

org.h2 .jdbc.JdbcSQLException:爲參數 「parameterIndex」 無效值 '11'[90008-193]

import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.sql.*; 
import javax.swing.*; 
import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.time.LocalDate; 
import java.time.ZoneId; 


public class Database { 

    public static void main(String[] args) throws SQLException { 
     Connection conn = null; 
     Statement st = null; 
     String URL = "jdbc:h2:~/registDB"; 
     String USER = "admin"; 
     String PASSWORD = "password"; 
     ZoneId z = ZoneId.systemDefault() ; 
     LocalDate currentDate = LocalDate.now(z); 
     LocalDate expiration = currentDate.plusDays(inputFld.getText()); //JTextField.getText() 
     java.sql.Date expirationDate = java.sql.Date.valueOf(expiration); 

     try { 
      Class.forName("org.h2.Driver").newInstance(); 
      conn = DriverManager.getConnection(URL,USER,PASS); 
      String sql = "INSERT INTO data 
         (fullName,regNum,itemName,note,zHemjee,fee, 
         time,date,totalPay,expirationDate)" 
         + "VALUES" 
         + "(?,?,?,?,?,?,?,?,?,?)"; 
      pst = conn.prepareStatement(sql); 
        // 1st index left not being modified on purpose which is ID auto_increment-ed  
      pst.setString(2, getFullName()); // Get methods are 
             // JTextField.getText() casted into proper data types 
             // except the 11th row which is throwing SQLException 
      pst.setString(3, getRegNum()); 
      pst.setString(4, getItemName()); 
      pst.setString(5, getNote()); 
      pst.setInt(6, getzHemjee()); 
      pst.setInt(7, getFee()); 
      pst.setInt(8, getTime()); 
      pst.setDate(9, java.sql.Date.valueOf(LocalDate.now())); 
      pst.setDouble(10, getTotalPay()); 
      pst.setDate(11, expirationDate); 
      pst.executeUpdate(); 
      pst.close(); 
      conn.close(); 

     } catch (ClassNotFoundException | SQLException ex) { 
     Logger.getLogger(database.class.getName()).log(Level.SEVERE, null, ex); 
     }  
    } 
} 

這裏是我的SQL語句創建一個表,它的列類型:

CREATE TABLE IF NOT EXISTS data " 
      +"(id INT NOT NULL AUTO_INCREMENT,"    //int 
      + " fullname varchar(30),"      //String 
      + " regNum varchar(10),"      //String 
      + " itemName varchar(30),"      //String 
      + " note varchar(30),"       //String 
      + " zHemjee int,"       //int 
      + " fee number,"        //int 
      + " time INT,"         //int 
      + " date DATE,"         //Date 
      + " totalPay BIGINT,"       //int 
      + " expirationDate DATE);");     //Date 
+0

http://stackoverflow.com/questions/1081234/java-date-insert-into-database –

+0

可能的重複感謝您的評論,但我試圖將其轉換爲字符串,我使用PreparedStatement爲我的原始版本的代碼。 –

+1

@AshfordTulgaa 2011 = 2017 - 4 - 2.你的「日期」被解釋爲一個數學表達式。上面的鏈接解決了這個問題。如果您使用的代碼與您發佈的代碼不同,請發佈您的實際代碼... – assylias

回答

1

問題是,你是否輸入了錯誤的索引。 你應該從1開始而不是在2。
只有10'?'你有第11個參數不存在。
此代碼應工作:

String sql = "INSERT INTO data 
        (ovogNer,regNum,itemName,note,zHemjee,hvv, 
        hugatsaa,date,totalPay,expirationDate)" 
        + "VALUES" 
        + "(?,?,?,?,?,?,?,?,?,?)"; 
pst = conn.prepareStatement(sql);  
pst.setString(1, getFullName()); 
pst.setString(2, getRegNum()); 
pst.setString(3, getItemName()); 
pst.setString(4, getNote()); 
pst.setInt(5, getzHemjee()); 
pst.setInt(6, getFee()); 
pst.setInt(7, getTime()); 
pst.setDate(8, java.sql.Date.valueOf(LocalDate.now())); 
pst.setDouble(9, getTotalPay()); 
pst.setDate(10, expirationDate); 
pst.executeUpdate(); 

還您設置整數時有奇怪的「+」。

+0

謝謝你的回覆,但第一個索引是ID,它是AUTO_INCREMENT,所以我故意留下了。 –

+1

您的INSERT查詢中沒有該ID。因此你不應該插入它。 我剛剛注意到ovegner應該是全名(猜一個錯字 - 請修復它)。 On Inserts你根本不需要添加id。它將由數據庫自動遞增。隨意從參數中刪除id。 –

+0

它的作品非常感謝你 –

1

Bojan Petkovic的回答是正確的。話雖如此,每當我有兩個或三個以上的參數,我總是使用索引變量來防止錯誤。像這樣:

int index = 1; 
String sql = "INSERT INTO data 
        (ovogNer,regNum,itemName,note,zHemjee,hvv, 
        hugatsaa,date,totalPay,expirationDate)" 
        + "VALUES" 
        + "(?,?,?,?,?,?,?,?,?,?)"; 
pst = conn.prepareStatement(sql);  
pst.setString(index++, getFullName()); 
pst.setString(index++, getRegNum()); 
pst.setString(index++, getItemName()); 
pst.setString(index++, getNote()); 
pst.setInt(index++, getzHemjee()); 
pst.setInt(index++, getFee()); 
pst.setInt(index++, getTime()); 
pst.setDate(index++, java.sql.Date.valueOf(LocalDate.now())); 
pst.setDouble(index++, getTotalPay()); 
pst.setDate(index++, expirationDate); 
pst.executeUpdate(); 

當然,這種方法取決於你把所有東西都放在正確的順序(你做的)。另一個選擇是使內部常量符合數字。當你達到這一點時,你正處在一個你真的需要爲你的SQL訪問使用框架的地方。 :)

[編輯]或者至少代碼是「正確的」,就像代碼的工作原理一樣。

相關問題