2012-10-20 24 views
0

我想在PostgreSQL數據庫中插入一條記錄。它的大部分字段都是String,但也有java.sql.date和BIGINT。我怎樣才能做到這一點?我的代碼似乎不工作。在查詢錯誤中插入不同的數據類型到postgreSQL中

public Record(RecordFields data) 
    { 
     CreateNewRecord(data); 
    } 

     private void CreateNewRecord(RecordFields recordFields) 
     { 
      try 
      {  

        String addRecord = "INSERT INTO " + GlobalFields.TABLE + " VALUES (? , ? , ? , ? , ? , ? , ? , ? , ?);"; 

        Connection conn = DataBase.Connect(); 

        PreparedStatement query = conn.prepareStatement(addRecord); 
        query.setLong(1, recordFieldsID); 
        query.setString(2, recordFields.surname); 
        query.setString(3, recordFields.name); 
        query.setString(4, recordFields.sex); 

        DateTime date = recordFields.bornDate.toDateTime(); 
        query.setTimestamp(5, new Timestamp(date.getMillis())); 

        query.setString(6, recordFields.adress); 
        query.setString(7, recordFields.contact); 
        query.setString(8, recordFields.insurance); 
        query.setString(9, recordFields.commentary); 

        query.executeUpdate(addRecord); 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
     } 


    }  

表生成:

public static void CreateTable() 
    { 
     try 
     { 
      Connection conn = DataBase.Connect(); 

      try 
      { 
       Statement stat = conn.createStatement(); 

       String createTable = "CREATE TABLE " + GlobalFields.TABLE 
        + "(id BIGINT PRIMARY KEY," 
        + "surname TEXT," 
        + "name TEXT," 
        + "sex CHAR(1),"     
        + "bornDate DATE," 
        + "adress TEXT," 
        + "contact TEXT," 
        + "insurance TEXT," 
        + "commentary TEXT);"; 

       stat.executeUpdate(createTable); 
      } 
      finally 
      { 
       conn.close(); 
      } 
     } 
     catch(SQLException e) 
     { 
      e.printStackTrace(); 
     } 
    } 

公共類RecordFields { 公共RecordFields(){ }

public long id; 
public String surname; 
public String name; 
public String sex; 
public MutableDateTime bornDate; 
public String adress; 
public String contact; 
public String insurance; 
public String commentary; 

}

+2

你會得到什麼錯誤? –

+1

也許你可以描述它是如何工作的。什麼是輸出?是否拋出異常?什麼是細節? – btiernay

+0

org.postgresql.util.PSQLException:無法使用在PreparedStatement上接受查詢字符串的查詢方法。 \t at org.postgresql.jdbc2.AbstractJdbc2Statement.executeUpdate(AbstractJdbc2Statement。java:294) \t at EngineClasses.Record.CreateNewRecord(Pacjent.java:62) \t at EngineClasses.Record。 (Record.java:37) \t at mainPackage.Test.main(Test.java:38) –

回答

1
stat.executeUpdate(createTable); 

是罪魁禍首。在PreparedStatements executeUpdate takes no parameters

因此,修改該行 - 只要as expained by Tom Anderson

stat.executeUpdate(); 

,大功告成

此外,

INSERT table VALUES (values) 

使你的代碼不必要的脆。使用

INSERT INTO table (fieldlist) VALUES (valuelist) 

代替。

而且還2:

DateTime date = recordFields.bornDate.toDateTime(); 
query.setTimestamp(5, new Timestamp(data.getMillis())); 

是說

的一個頗爲曲折版本
query.setTimestamp(5,new Timestamp(recordFields.bornDate.getMillis())); 

編輯:關於Date in postgressql

什麼湯姆說是填補一個PostgreSQL DATE類型列你可以使用java.sql.date類型變量(與「常見」java.util.Date相對)或javax.sql.TimeStamp。但是這與目前的問題完全無關(這是由executeUpdate調用中的參數引起的),並且您在此處執行的操作(使用Timestamp類型變量進行設置)可以。

+0

我應該使用什麼方法,用參數發送這種查詢? –

+0

也請看看這個問題:http://stackoverflow.com/questions/12182751/date-in-postgressql和解釋給我湯姆安德森的答案,因爲看起來像我不明白的東西。 –

+0

非常感謝:) –

0

看一看this的問題。

從本質上講,你的代碼應該有如下形式:

String query = "..."; 
PreparedStatement stat = conn.prepareStatement(query); 
ResultSet rs = stat.executeQuery(); 
while (rs.next()) { 
    // TODO 
} 

因爲您還沒有有問題的方法的所有源代碼,這是很難完全診斷。

+0

現在包括所有必需的代碼。 –

相關問題