2016-06-08 57 views
1

I den folgenden Code haben:org.postgresql.util.PSQLException: Der Spaltenindex ist außerhalb des Bereichs: 2, Zahl der Spalten: 1

String insert = "INSERT INTO " + tableName + 
       "(" + COLUMNS.TILE_ID + "," + COLUMNS.TILE_DATA + "," + 
       COLUMNS.TILE_LEVEL + "," + COLUMNS.TILE_COLUMN + 
       "," + COLUMNS.TILE_ROW + 
       "," + COLUMNS.TILE_IMAGE_FORMAT + "," + COLUMNS.TILE_SOURCE + 
       ")"; 
String values = id + ",?" + "," + 
       tile.getLevel() + "," + tile.computeColumn() + "," + 
       tile.computeRow() + ",\'" + tile.getFileType().toUpperCase() + 
       "\'," + "\'" + 
       tile.getSource() + "\');"; 
     String query = insert + " VALUES (" + values; 
     System.out.println(query); 
     PreparedStatement statement = conn.prepareStatement(query); 
     statement.setBytes(2, tile.getData()); 
     return this.conn.createStatement().executeUpdate(query); 

Der Abfragewert:

INSERT INTO level1 (TILE_ID, TILE_DATA, TILE_LEVEL, TILE_COLUMN, TILE_ROW, TILE_IMAGE_FORMAT, TILE_SOURCE) WERTE (0,?, 1,0,0, 'JPG', 'null');

Der Fehler ich:

org.postgresql.util.PSQLException: Der Spaltenindex ist außerhalb des zulässigen Bereichs: 2, Anzahl der Spalten: 1.

Meine Tabelle:

tile_id bigint NOT NULL, 
    tile_data bytea, 
    tile_level smallint, 
    tile_row integer, 
    tile_column integer, 
    tile_image_format image_format, 
    tile_source character varying(30), 
    CONSTRAINT level10_pkey PRIMARY KEY (tile_id) 

Irgendwelche Ideen?

+0

Das 'tile_image_format' ist ein Enum-Typ, den ich selbst erstellt habe. –

Antwort

2

Sie haben Ihre Stacktrace geschrieben, aber Ihr Fehler scheint von diesem zu erscheinen:

statement.setBytes(2, tile.getData()); 

Welche weil man nur einen Parameter zu binden ist:

INSERT INTO level1 (TILE_ID,TILE_DATA,TILE_LEVEL,TILE_COLUMN,TILE_ROW,TILE_IMAGE_FORMAT,TILE_SOURCE) VALUES (0,?,1,0,0,'JPG','null'); 

Die Tatsache, dass die Parameter ist auf Position 2 in der Werteliste ist nicht was zählt. Es ist die Tatsache, dass es der erste Platzhalter ist, der zählt. So sollte der Code sein,

statement.setBytes(1, tile.getData()); 
0

Dank Antwort auf e4c5, fest ich meinen Code, wie folgend:

String insert = "INSERT INTO " + tableName + 
       "(" + COLUMNS.TILE_ID + "," + COLUMNS.TILE_DATA + "," + 
       COLUMNS.TILE_LEVEL + "," + COLUMNS.TILE_COLUMN + 
       "," + COLUMNS.TILE_ROW + 
       "," + COLUMNS.TILE_IMAGE_FORMAT + "," + COLUMNS.TILE_SOURCE + 
       ")"; 
String values = id + ",?" + "," + 
       tile.getLevel() + "," + tile.computeColumn() + "," + 
       tile.computeRow() + ",\'" + tile.getFileType().toUpperCase() + 
       "\'," + "\'" + 
       tile.getSource() + "\');"; 
String query = insert + " VALUES (" + values; 
PreparedStatement statement = conn.prepareStatement(query); 
statement.setBytes(1, tile.getData()); 
int result = statement.executeUpdate(); 
statement.close(); 
return result; 

Die Tatsache, dass der Parameter an Position 2 in der Liste Werte ist nicht das, was zählt. Es ist die Tatsache, dass es der erste Platzhalter ist, der zählt.

Verwandte Themen