当前位置: 代码迷 >> J2SE >> PreparedStatement接口中的setString步骤为什么不能用来代替数据库的表名
  详细解决方案

PreparedStatement接口中的setString步骤为什么不能用来代替数据库的表名

热度:13   发布时间:2016-04-23 20:37:34.0
PreparedStatement接口中的setString方法为什么不能用来代替数据库的表名
错误代码片段如下:

Connection conn = c.doGetConnection();     //取得Connection对象的一个方法
String sql = "INSERT INTO ? VALUES(?,?)"; //在一个表中添加一行记录
String tableName = new String("account");   
String[] values = new String[2];
values[0] = "22222222";
values[1] = "22222222";
PreparedStatement pre = conn.prepareStatement(sql);
pre.setString(1,tableName );                               //设置表名为 “account”
pre.setString(2,values[0]);
pre.setString(3, values[1]);
pre.executeUpdate();


执行后报如下错误:
java.sql.SQLSyntaxErrorException: ORA-00903: 表名无效
于是我不用?来代替表名,修改红色部分的代码后执行成功,修改后的代码如下:

Connection conn = c.doGetConnection();     //取得Connection对象的一个方法
String sql = "INSERT INTO account VALUES(?,?)"; //在account表中添加一行记录
String[] values = new String[2];
values[0] = "22222222";
values[1] = "22222222";
PreparedStatement pre = conn.prepareStatement(sql);
pre.setString(1,values[0]);
pre.setString(2, values[1]);
pre.executeUpdate();


这是为什么呀,我的理解是setString方法可以替换过了“?”所在的位置的值,但是却不能替换表名,是这样的吗?恳请大伙帮帮忙。





------解决方案--------------------
1.setString/setInt.....实际上用的是数据库的绑定变量,顾名思义,只能替换变量。
2.setString最终生成的SQL时会在?前后都加上''。
------解决方案--------------------
我所知道的所有数据库,都不能这样子搞。
你还是在生成PS之前,用Java程序替换掉。

String sqlTemplate = "INSERT INTO __TABLE_NAME__ VALUES(?, ?)";
String sql = sqlTemplate.replaceAll("__TABLE_NAME__", "account ");
  相关解决方案