在查询错误中将不同的数据类型插入postgreSQL

时间:2012-10-20 14:58:43

标签: java sql postgresql

我想在PostgreSQL数据库中插入一条记录。它的大部分字段都是String,但也有java.sql.date和BIGINT。我怎样才能做到这一点?我的代码似乎不起作用。

    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 {     public 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 个答案:

答案 0 :(得分: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

Tom说的是,要填充PostgreSQL DATE类型列,您可以使用java.sql.date类型变量(而不是“common”java.util.Date)或{{{ 1}}。但这与当前问题完全无关(由executeUpdate调用中的参数引起)和你在这里做的(使用Timestamp类型变量设置它)是正常的。

答案 1 :(得分:0)

查看this问题。

基本上,您的代码应具有以下形式:

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

因为您没有包含有问题方法的所有源代码,所以很难完全诊断。