GVKun编程网logo

PreparedStatement.executeBatch()之后的getGeneratedKeys()(extract($_get))

11

针对PreparedStatement.executeBatch和之后的getGeneratedKeys这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Cause:org.apache.ib

针对PreparedStatement.executeBatch之后的getGeneratedKeys这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展Cause: org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting resul...、com.microsoft.jdbc.base.BaseDatabaseMetaData.supportsGetGeneratedKeys()Z、Java PreparedStatement RETURN_GENERATED_KEYS不起作用、Java PreparedStatement抱怨execute()上的SQL语法等相关知识,希望可以帮助到你。

本文目录一览:

PreparedStatement.executeBatch()之后的getGeneratedKeys()(extract($_get))

PreparedStatement.executeBatch()之后的getGeneratedKeys()(extract($_get))

我想要使​​用INSERT几行PreparedStatement

ps = con.prepareStatement(query,PreparedStatement.RETURN_GENERATED_KEYS);for(Element e:listOfElements){    ps.setString(1,this.col_val_1);    ps.setString(2,this.col_val_2);    ps.setInt(3,this.col_val_3);    ps.addBatch();}ps.executeBatch();ResultSet rs = ps.getGeneratedKeys();

在这一点上,当我期望得到每个生成的PK时INSERT,我得到了SQLServerException

com.microsoft.sqlserver.jdbc.SQLServerException: The statement must be executed before any results can be obtained.

我希望对每个执行的插入操作都获得一个ResultSet一行,因此我可以生成每个PK。

我期望错了吗?难道我做错了什么?是否可以使用批处理以其他方式完成?

答案1

小编典典

getGeneratedKeys()对批处理执行的支持是根据JDBC规范定义的实现。SQL Server驱动程序很可能不支持批量执行。

我试图在Microsoft网站上寻找明确的声明,但找不到它。MSDN上的这个旧版(2007年)论坛帖子确实声明不支持它:http :
//social.msdn.microsoft.com/Forums/en-
US/sqldataaccess/thread/6cbf5eea-e5b9-4519-8e86-f4b65ce3f8e1

Cause: org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting resul...

Cause: org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting resul...

mybatis 插入数据时报错:

Cause: org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: java.sql.SQLException: 不支持的特性
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:8)

原因:加了如下标红的设置(useGeneratedKeys="true" 把新增加的主键赋值到自己定义的 keyProperty(id)中)

<insert id="insert" parameterType="com.vimtech.bms.business.domain.monitor.finan.AssetsVisitReportWithBLOBs" useGeneratedKeys="true" keyProperty="serialid">

解决方法一:没什么用的话,删除标红的即可;

解决方法二:用 selectKey 先查下自增的主键 ID 值然后赋给相应的主键 ID 即可

oracle 的写法 (查序列的下一个值然后赋值):

<selectKey resultType="java.lang.Long" order="BEFORE" keyProperty="###">
  SELECT SEQ_ASSETS_VISIT_REPORT.nextval AS ### FROM dual
</selectKey>

SQLServer 的写法

<selectKey resultType="java.lang.Integer" keyProperty="timelineConfigId">
  SELECT @@IDENTITY AS TIMELINE_CONFIG_ID
</selectKey>

 

com.microsoft.jdbc.base.BaseDatabaseMetaData.supportsGetGeneratedKeys()Z

com.microsoft.jdbc.base.BaseDatabaseMetaData.supportsGetGeneratedKeys()Z

原因 microsoft 提供的数据库驱动存在 bug。需要换一种驱动连接,使用 jtds(下载地址:http://sourceforge.net/projects/jtds/files/)下载 jtds1.2 版,解压得到 jtds-1.2.jar,引用到 eclipse 中项目目录下(去除原驱动引用),更改 hibernate 配置文件:

原驱动连接配置:

 <property name="connection.driver_class">com.microsoft.jdbc.sqlserver.SQLServerDriver</property>
        <property name="connection.url">jdbc:microsoft:sqlserver://127.0.0.1:1433;DatabaseName=hibernate</property>
更改 jtds 连接:  
        <property name="connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
        <property name="connection.url">jdbc:jtds:sqlserver://127.0.0.1:1433;DatabaseName=hibernate</property>

问题得到解决。补充:java 代码调原驱动连接数据库是没有问题的,搭配 hibernate 会有此问题。


转载自:http://blog.csdn.net/myloveyoyo1314/archive/2010/01/07/5152902.aspx

之前出现这个问题时一直没在意,以为是重装了系统后软件中少了什么东西导致的,因为在连接 mysql5.1 时正常,连接 sql2000 时就是连不上,郁闷,终于在网上找到了解答,原来是 sql 驱动和 hibernate 的兼容性问题,现问题已解决,留此文备查.

 

本文来自 CSDN 博客,转载请标明出处:http://blog.csdn.net/jsship/archive/2010/03/13/5377210.aspx

Java PreparedStatement RETURN_GENERATED_KEYS不起作用

Java PreparedStatement RETURN_GENERATED_KEYS不起作用

我试图在执行SQL插入时将标识列返回给我的Java程序。运行代码时出现以下错误

    Uncaught exception thrown in one of the service methods of the servlet: Cocoon. Exception thrown : java.lang.AbstractMethodError: java/sql/Connection.prepareStatement(Ljava/lang/String;I)Ljava/sql/PreparedStatement;

这是我正在运行的代码。

private void insertUserInputParameters(ReportData rptData){     UserInputParameters userParams = rptData.getUserInputData();     StringBuilder sql = new StringBuilder();     PreparedStatement pstmt = null;     ResultSet rs = null;     int userDataId = -1;    //Get a database connection.    sl = ServiceLocator.getInstance();    ds = sl.getDataSource("jdbc/collegeguide");    con = ds.getConnection();    con.setReadOnly(false);    sql.append("insert into cpgusrdtaf (statecd, addr1, addr2, city, state, ");    sql.append("zipcode, dependent, shdindic, marstatus, residency, prntatge, ");    sql.append("fincome, mincome, pincome, taxspaid, taxreturn, elig1040, ");    sql.append("gincome, pcash, inetwrth, bnetwrth, pbenefit, paddlinf, ");    sql.append("puntax, pdslcwrk, smstatus, sresidncy, studtr, stud1040, ");    sql.append("sadjinc, sincome, spincome, sdslcwrk, studtax, scash, ");    sql.append("sinvest, snetwrth, saddlinf, suntax, househld, nmbrsch, ");    sql.append("studact, studsat, schools, housing) ");    sql.append("values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ");    sql.append("?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");    //This line of code is where I get the error**    pstmt = con.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS);    //If I remove the ''Statement.RETURN_GENERATED_KEYS'' I do not get the error.**    pstmt = con.prepareStatement(sql.toString());    setStatementValues(pstmt, userParams);    pstmt.executeUpdate();    rs = pstmt.getGeneratedKeys();    if(rs.next()){       userDataId = rs.getInt(1);    }

我不允许使用存储过程,所以我不能走那条路。任何帮助将不胜感激

我正在使用Java 1.5

预先感谢道格

答案1

小编典典

我的JT400.jar文件是较旧的版本。我从sourceforge下载了最新的jar文件,问题已解决。

Java PreparedStatement抱怨execute()上的SQL语法

Java PreparedStatement抱怨execute()上的SQL语法

这真让我发疯……我在这里做错了什么?

ArrayList<String> toAdd = new ArrayList<String>();toAdd.add("password");try{    PreparedStatement pStmt = conn.prepareStatement("ALTER TABLE testTable ADD ? varchar(100)");        for (String s : toAdd) {            pStmt.setString(1, s);            pStmt.execute();        }} catch (SQLException e) {    e.printStackTrace();}

结果是…

02:59:12,885错误[STDERR]
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册以获取正确的语法,以在第1行的“
password” varchar(100)”附近使用

但…

ArrayList<String> toAdd = new ArrayList<String>();toAdd.add("password");try{    Statement stmt = conn.prepareStatement();        for (String s : toAdd) {            stmt.execute("ALTER TABLE testTable ADD "+s+" varchar(100)");        }} catch (SQLException e) {    e.printStackTrace();}

完美运行…直接在MySQL命令行客户端直接输入文本也是如此。

mysql> alter table testTable add stringGoesHere varchar(100);Query OK, 1 row affected (0.23 sec)Records: 1  Duplicates: 0  Warnings: 0

我究竟做错了什么?

答案1

小编典典

在MySQL手册明确表示,?(参数标记)是唯一,不列名绑定的数据值。

参数标记只能用于应显示数据值的地方,而不能用于SQL关键字,标识符等。

因此,您将不得不使用第二种方法。

关于PreparedStatement.executeBatch之后的getGeneratedKeys的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Cause: org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting resul...、com.microsoft.jdbc.base.BaseDatabaseMetaData.supportsGetGeneratedKeys()Z、Java PreparedStatement RETURN_GENERATED_KEYS不起作用、Java PreparedStatement抱怨execute()上的SQL语法的相关信息,请在本站寻找。

本文标签: