【问题标题】:Passing an Array to a SQL query using Java's PreparedStatement使用 Java 的 PreparedStatement 将数组传递给 SQL 查询
【发布时间】:2013-06-10 22:23:39
【问题描述】:

我在使用 Java 的预处理语句将数组传递到 SQL 查询时遇到了一些麻烦。我首先尝试了 sourceforge 驱动程序,但是当我调用 setArray 方法时会得到 AbstractMethodError。不知道我换到 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()

【问题讨论】:

  • 我使用的是 Microsoft SQL Server Web 版(64 位)版本 10.50.1600.1 :)

标签: java mysql jdbc prepared-statement query-parameters


【解决方案1】:

我通过动态生成具有所需问号数量的字符串解决了同样的问题。 这是一个sn-p:-

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]);
}

【讨论】:

  • 谢谢。我回家后会尝试一下。 :)
猜你喜欢
  • 1970-01-01
  • 2011-11-10
  • 2021-03-30
  • 1970-01-01
  • 2012-09-26
  • 2020-02-21
  • 1970-01-01
  • 2021-05-17
相关资源
最近更新 更多