我想从表中读取数据,但是我收到了一个错误,因为我要比较的值可能包含这样的单词:abcd l'jdmd
我这样试试:
String s = "select ref(ad) from adresse_tab ad where ad.ort='"+rs.getString(11)+"' and ad.plz='"+rs.getString(13)+"' and ad.land='"+rs.getString(14)+"'";
PreparedStatement stmt5 = nsdCon.prepareStatement(s);
ResultSet rs5 = stmt5.executeQuery();
Query可能如下所示:
select ref(ad)
from adresse_tab ad
where ad.ort='Frankfurt am Main'
and ad.plz='65301'
and ad.land='Deutschland'
and ad.strasse='almundo l'tare '
所以此查询中的问题就是这种比较:
ad.strasse='almundo l'tare '
如何处理SQl查询中的reserverd字符?
谢谢
答案 0 :(得分:3)
请避免使用字符串连接创建带有提供参数的SQL查询。相反,您可以继续使用PreparedStatement,但使用占位符作为实际参数值,并使用语句set<X>()
方法设置参数。这是official Oracle docs的问题。
您必须提供值代替问号占位符(如果 你可以执行PreparedStatement对象之前有任何一个。做 这可以通过调用其中一个setter方法来定义 PreparedStatement类。以下陈述提供了两个 名为updateSales的PreparedStatement中的问号占位符:
updateSales.setInt(1,e.getValue()。intValue()); updateSales.setString(2,e.getKey());每个的第一个参数 这些setter方法指定问号占位符。在这 例如,setInt指定第一个占位符和setString 指定第二个占位符。
对于你的情况:
String s = "select ref(ad) from adresse_tab ad where ad.ort=? and ad.plz=? and ad.land=?";
PreparedStatement stmt5 = nsdCon.prepareStatement(s);
stmt5.setString(1, rs.getString(11));
... and so on
答案 1 :(得分:3)
使用prepared statement(为了更明确命名绑定变量,您可以使用OraclePreparedStatement):
String s = "select ref(ad) from adresse_tab ad where ad.ort=:ort and ad.plz=:plz and ad.land=:land";
PreparedStatement st5 = nsdCon.prepareStatement(s);
OraclePreparedStatement ost5 = (OraclePreparedStatement) st5;
ost5.setStringAtName("ort",rs.getString(11))
ost5.setStringAtName("plz",rs.getString(13))
ost5.setStringAtName("land",rs.getString(14))
ResultSet rs5 = st5.executeQuery();
答案 2 :(得分:1)
您不应将查询参数直接添加到查询字符串中。请改用Prepared Statement并在那里传递查询参数。另请参阅Does the preparedStatement avoid SQL injection?
答案 3 :(得分:1)
准备语句的重点是在查询中使用参数,以便可以自动转义值:
String s = "select ref(ad) from adresse_tab ad where ad.ort=? and ad.plz=? and ad.land=?";
PreparedStatement stmt5 = nsdCon.prepareStatement(s);
stmt5.setString(1, rs.getString(11));
stmt5.setString(2, rs.getString(13));
stmt5.setString(3, rs.getString(14));
ResultSet rs5 = stmt5.executeQuery();
答案 4 :(得分:0)
ad.strasse='almundo l'''tare '