Передача массива в SQL-запрос с использованием PreparedStatement Java

У меня возникли небольшие проблемы с передачей массива в SQL-запрос с использованием подготовленных операторов Java. Сначала я попробовал драйвер sourceforge, однако я получил AbstractMethodError при вызове метода setArray. Не зная решения, я переключился на драйвер Microsoft sqlserver, но теперь я получаю совершенно другую ошибку: «java.sql.SQLFeatureNotSupportedException: эта операция не поддерживается». Пробовал целую кучу вещей, чтобы попытаться решить эту проблему, но ничего не работает.

Мой код Java похож на примеры, которые я видел здесь и в Интернете, и выглядит следующим образом:

PreparedStatement ps = connection.prepareStatement(query);
String[] suppliers = {"21","2774","120563","3714","59"};
ps.setArray(1, connection.createArrayOf("text", suppliers));
ResultSet rs = ps.executeQuery();

Пример моих SQL-запросов. Единственная действительно интересная строка — это предпоследняя строка, в которой я добавил '?' символ, как я понимаю, как я передаю параметр SQL-запросу.

productsPrices.query = select contract.supplierid as 'hotelid' \
  , round((rate.s1/money.buy)*euro.sell,0) as "single" \
  , round((rate.s2/money.buy)*euro.sell,0) as "double" \
  ,service.Name as 'roomtype' \
  ,stock.alloc - stock.taken as 'stock.available' \
  , contract.notes as 'boardType' \
  , object.name as 'occupancy' \
  ,object.cap as 'capacity' \
  ,object.mincap as 'min capacity' \
  ,stock.date as 'date' \
from stock stock \
  inner join rate rate on stock.rateid = rate.id \
  inner join contract contract on rate.contractid = contract.id \
  inner join service service on contract.serviceid = service.ID \
  inner join object object on service.objectid = object.ID \
  inner join band band on contract.termsid = band.ID \
  inner join Money money on band.moneyid = money.id \
  inner join Money euro on euro.Name  = 'Euros' \
where stock.date > getdate() \
and stock.closed = 0 \
and (stock.alloc - stock.taken) > 0 \
and stock.date > getdate() \
      and contract.supplierid in (?) \
      and contract.Finish > GETDATE()

person Community    schedule 14.06.2013    source источник
comment
Я использую Microsoft SQL Server Web Edition (64-разрядная версия) версии 10.50.1600.1 :)   -  person    schedule 14.06.2013


Ответы (1)


Я решил ту же проблему, динамически генерируя строку с необходимым количеством вопросительных знаков. Вот фрагмент: -

String param = "(";
for(int i=0;i<suppliers.length;i++){
param = param+"?,";
}
param = param.substring(0,param.length()-1);
param=param+")";

query = query + param;

PreparedStatement ps = connection.prepareStatement(query);

for(int i=0;i<suppliers.length;i++){
ps.setString(i+1,suppliers[i]);
}
person chetan    schedule 14.06.2013
comment
Спасибо. Я попробую это через некоторое время, когда вернусь домой. :) - person ; 14.06.2013