2016-06-08 2 views
1

У меня есть следующий код:org.postgresql.util.PSQLException: Индекс столбца находится вне диапазона: 2, число столбцов: 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); 

Значение запроса:

ВСТАВИТЬ INTO level1 (TILE_ID, TILE_DATA, TILE_LEVEL, TILE_COLUMN, TILE_ROW, TILE_IMAGE_FORMAT, TILE_SOURCE) VALUES (0,?, 1,0,0, 'JPG', 'null');

ошибка я получаю:

org.postgresql.util.PSQLException: Индекс столбца находится вне диапазона: 2, количество столбцов: 1.

Мои Таблица:

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) 

Любые идеи?

+0

'tile_image_format' - тип перечисления, который я создал сам. –

ответ

2

Вы не отправил свой StackTrace, но ваша ошибка, кажется, появляются из этого:

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

Что происходит потому, что у вас есть только один параметр для связывания:

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'); 

Тот факт, что параметр находится в позиции 2 в списке значений, а не то, что считается. Это факт, что это первый владелец места. Так что ваш код должен быть,

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

Благодаря e4c5 ответ, я установил свой код следующим образом:

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; 

Тот факт, что параметр находится в положении 2 в списке значений не то, что на счет. Это факт, что это первый владелец места.

Смежные вопросы