2011-09-29 31 views
2

它看起来像火鸟不支持的getGeneratedKeys()你有一个AUTO_INCREMENT列执行插入之后。所以我想了解在插入后如何让我的手在生成的密钥上。火鸟+ JDBC:获取生成的密钥自刀片

1)我必须使用“插入到用户(...)VALUES(...)返回ID”,并通过一个CallableStatement以获取生成的ID叫这个?究竟如何?我需要围绕“呼叫{...}”来包裹我的插入吗?2)是否有一些其他方法可以在Firebird下获取生成的ID,某种“select last_id_generated()”。 “从用户选择最大(id)”不计算。

3)难道真的是的getGeneratedKeys()不是由火鸟JDBC驱动程序支持? (可选)

谢谢!

+0

这个帖子可能会有帮助:http://tech.dir.groups.yahoo.com/group/Firebird-Java/message/10170 –

+0

谢谢,但帖子有点含糊。在那里我不清楚如何使用JDBC来获取它。 – TraderJoeChicago

回答

2

事实证明,所有你需要做的就是打电话,而不是“插入......”回用的executeQuery(从PreparedStatement的)的executeUpdate。这将从您可以获取生成的ID的位置返回您的ResultSet。我从来没有想过你可以用executeQuery调用INSERT。我以为你必须执行executeUpdate。

+0

Firebird本身将INSERT ... RETURNING 作为查询生成结果集。由于getGeneratedKeys()没有(或没有完全)在Jaybird 2.1.6中实现(我将在明天再次检查这个),使用executeQuery()是一种可行的解决方法,因为它只是简单地对待任何其他生成结果集的查询。支持getGeneratedKeys()应该在Jaybird 2.2中提供,希望在年底之前发布。 –

+0

我检查并使用executeQuery是Jaybird 2.1.6中唯一的方法; getGeneratedKeys在Jaybird 2.2中工作(虽然还有一些bug)。 –

-1

这将让目前这一代

SELECT GEN_ID(GEN_NAME,0) FROM RDB$DATABASE 

与GEN_NAME被你叫那一代

当你创建一个自动增量场触发,并造就了一代触发看起来像这通常

SET TERM ^^ ; 
CREATE TRIGGER TABLE_BEFOREINSERT FOR TABLE ACTIVE BEFORE INSERT POSITION 0 AS 
BEGIN 

    if (new.ID is null) 
    then new.ID = gen_id(GEN_TABLE, 1); 

END ^^ 
SET TERM ; ^^ 

和产生创造看起来像这样

​​

这两者合在一起使得在插入一个新行之前,它检查是否指定了ID的值,如果不是,它将增加一代并获取其当前值并将其作为ID列

+0

我必须使用返回吗? “你称为那一代”是什么意思?这是一个auto_increment字段。 – TraderJoeChicago

+0

上面的代码只是一个regualr sql语句,就像您编写的用户示例中的select max(id)一样,您将从其中获得结果,就像任何其他select语句一样。当您将列设置为auto_increment字段时,数据库将创建一个通常名为GEN_TABLE_NAME的代,其GEN_以表名前缀 – thegaffney

+0

Firebird实际上并不像其他数据库那样具有auto_increment字段类型,该行为与触发器和生成器“伪造”。在这里查看更多信息:http://www.firebirdfaq.org/faq29/ - 我不知道JDBC驱动程序如何适应该模型。 – Harriv

2

我使用的建设得到主键值:

String buf =  
      "SELECT GEN_ID (<YOUR_ID_NAME*>, 0) " + //see description below 
      "FROM RDB$DATABASE"; 
try 
{ 
    Statement stm = conn.createStatement(); 
    ResultSet RS = stm.executeQuery (buf); 
    buf = null; 
    if (RS != null) 
    { 
     RS.next(); 
     buf = RS.getString (1).trim(); //That is it 
     RS.close(); 
    } 
} 
catch (SQLException e) 
{} 

现在buf将包含一个ID

< *> - 你可以帮助IBExpert看到它。在Jaybird 2.2加入

0

支持getGeneratedKeys。还有一些注意事项,默认RETURN_GENERATED_KEYS方法将返回表的所有列,所以你应该从结果按列名设置检索列,或者使用的方法之一明确指定列索引或列名,看Jaybird (2.2.7) release notes了解更多详情。

要回答你原来的问题:

  1. 当您执行INSERT ... RETURNING ...,你需要使用executeQuery(或execute),并处理结果集,如果你正在执行正常SELECT。与Jaybird 2。2,你也可以,如果你使用的是RETURN_GENERATED_KEYS使用executeUpdate并获得getGeneratedKeys()

  2. 结果集使用INSERT ... RETURNING ...getGeneratedKeys是唯一的方式来获得该语句生成的值,所有其他方法(如SELECT GEN_ID(GEN_NAME,0) FROM RDB$DATABASE)不能被信任因为序列在事务控制之外,并且可能已为不同的并发事务生成了返回值。

  3. 当你问这个问题时,它确实不被Jaybird支持(2.1.6)。

披露:我是Jaybird的开发人员之一。