`
joerong666
  • 浏览: 418365 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

返回自增列的值

阅读更多

今天解决了一个IBatis.Net的使用的问题,这个问题困扰了很久。在做一个管理系统,后台Server采用的是HTTP Server+DB来提供服务。 最初使用的是Perl+BerkeleyDB,演进到Servlet+Mysql,然后又演进到ASP.NET + SQL Server,从Servlet开始ORM使用的是Hibernate,到了ASP.NET后,Hibernate转变为了NHibernate。一次偶然的机会,接触到了别人的一个系统,也想把这个管理系统中的NHibernate替换为IBatis.Net,并且把请求统一放到一个Controller进行Dispatch,也可以在Controller中加入日志、权限、验证等机制。当然,对于Struts等框架都是采用类似的机制完成的。自己也是一种借鉴和学习。在测试使用IBatis.Net的时候遇到一个问题,NHibernate的时候,插入一个对象,就可以获得这个对象对应的记录的自动生成的PK。IBatis可以通过SelectKey来做,我确实也有在Java下的例子,可是在网上看到的一些资料指出的在IBatis.Net中的用法,但是不能成功。一直搞了很久。今天终于是解决了。自己给自己记录一下吧。

<statements>
  <statement  id="INSERT-ADMIN" resultClass="int">
      insert into admin (lastlogin, flag, controlflag, username, password, description)
      values (#LastLogin#, #Flag#, #ControlFlag#, #Username#, #Password#, #Description#)

      SELECT SCOPE_IDENTITY()  AS value

    </statement >

这个是正确的写法,不需要用到selectKey,自己以前的错误在两个地方,一个是在statement中没有写resultClass,另外一个就是用 select @@IDENTITY as id(value),始终不行,这个我一直没有搞明白是什么原因。只是根据自己的需要,返回的应该是这个scope中的id,所有使用select scope_identity 就可以了。

 

 

以下配置也是OK的

<!—Oracle SEQUENCE Example using .NET 1.1 System.Data.OracleClient --> 
<insert id="insertProduct-ORACLE" parameterClass="product"> 
  
<selectKey resultClass="int" type="pre" property="Id" > 
     SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL
  
</selectKey> 
  insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) 
</insert>

<!— Microsoft SQL Server IDENTITY Column Example --> 
<insert id="insertProduct-MS-SQL" parameterClass="product"> 
  insert into PRODUCT (PRD_DESCRIPTION)
  values (#description#) 
 
<selectKey resultClass="int" type="post" property="id" > 
   select @@IDENTITY as value
 
</selectKey>
</insert>

<!-- MySQL Example -->
<insert id="insertProduct-MYSQL" parameterClass="product"> 
  insert into PRODUCT (PRD_DESCRIPTION)
  values (#description#) 
 
<selectKey resultClass="int" type="post" property="id" > 
   select LAST_INSERT_ID() as value
 
</selectKey>
</insert>

分享到:
评论

相关推荐

    jdbc 插入记录并返回自增主键值

    注意,这个过程只适用于那些在插入时能立即返回自增主键的数据库系统,比如MySQL。在某些数据库中(如Oracle),可能需要使用其他方法来获取自增主键。 总的来说,Java中的JDBC提供了一种灵活且强大的方式来处理...

    得到自增列的下一个会插入的id

    - `IDENT_INCR()`: 返回自增列的增量值,通常是1,但也可能是其他用户定义的值。 - `IDENT_SEED()`: 返回自增列的初始种子值,即第一次插入时的起始值。 3. **示例代码解析**: - `DECLARE @Table_name VARCHAR...

    oracle数据库如何创建自增列的技巧教程.docx

    以下是如何在 Oracle 中创建自增列的详细步骤和相关知识点: 1. **创建序列(Sequence)** - `CREATE SEQUENCE` 语句用于创建序列。例如: ```sql CREATE SEQUENCE userlogin_seq INCREMENT BY 1 -- 每次增加的...

    mysql自增字段重排 mysql删除表后自增字段从1开始.pdf

    - 更新自增列时,若值重复则报错,大于当前值则下一个编号从新值开始。 - `REPLACE`命令不会改变WHERE子句中出现的AUTO_INCREMENT值,除非没有明确指定。 4. **last_insert_id()函数**: - 该函数用于获取自增列...

    SQL SERVER 自增列

    自增列通常用作主键的一部分,自动递增其值,为新插入的每一行提供一个唯一的标识。这极大地方便了数据管理和维护,尤其是在大量插入新记录时。 在SQL Server中,你可以通过查询系统视图和对象来判断一个表是否具有...

    SQL Server 中调整自增字段的当前初始值

    DBCC CHECKIDENT ('table_name', NORESEED) 命令用于检查表的当前标识值和应有的标识值,将返回一个报表,指明当前标识值和应有的标识值。例如: Checking identity information: current identity value '6109', ...

    mysql自增字段重排 mysql删除表后自增字段从1开始.docx

    比如,创建一个由多个列组成的唯一索引,将自增列作为最后的列。这样,前面列的不同组合将对应不同的自增序列。 总的来说,理解MySQL中不同存储引擎对自增字段的处理方式非常重要,这有助于我们在设计数据库时做出...

    Oracle使用序列创建自增字段

    例如,执行 `SEQ_EMP.NEXTVAL` 将会返回序列的下一个值,并使当前值变为这个新值;而 `SEQ_EMP.CURRVAL` 则返回序列的当前值。 ### 修改序列 (Alter Sequence) 如果需要对已创建的序列进行修改,可以使用 ALTER ...

    SQL获取刚插入的记录的自动增长列ID的值

    `ExecuteScalar()`方法将返回查询的第一行第一列的值,这正是我们想要的自动增长列`id`。请注意,如果`ExecuteScalar()`返回`null`,则表示插入操作可能失败或者`id`列未生成新值。因此,在实际应用中,你需要进行...

    oracle通过触发器,实现序列自增

    序列主要用于当需要为表中的某列自动生成唯一值时。例如,在插入新记录时,可以使用序列生成的值作为主键或唯一标识符。 ##### 序列的基本操作: 1. **创建序列**: ```sql CREATE SEQUENCE sequence_name ...

    Asp中实现编号自增的代码

    - `DBHelper.ExecSqlScalar` 方法执行SQL语句并返回查询结果的第一行第一列数据。 - 如果查询结果为 `NULL` 或者表中没有数据,则返回的是空字符串。 #### 2. 生成新的编码 接下来,我们需要基于获取到的最大编码...

    使用prometheus统计MySQL自增主键的剩余可用百分比

    这个查询会返回所有自增主键列的元数据,包括它们所在的表、数据类型以及理论上的最大值。 在Prometheus的Web界面中,我们可以使用Prometheus Query Language (PromQL) 来计算剩余自增主键的百分比。例如,可以编写...

    sql server获得新记录标识列值的二种方法

    `OUTPUT INSERTED.ID`将返回新插入行的标识列值。如果你是在ADO.NET环境中,可以通过调用`SqlCommand.ExecuteScalar()`方法来获取这个值,如下所示: ```csharp int r = command.ExecuteScalar(); ``` 2. 使用全局...

    mysql取得自动增长的主键值

    - **概念:** `LAST_INSERT_ID()`是一个内置函数,用于返回上一次插入操作产生的自增ID。 - **用法:** 可以直接在查询语句中使用`LAST_INSERT_ID()`来获取自增ID。 - **示例:** 假设执行了一次插入操作后,可以...

    SQL Server中实现字段值自动增长且连续.pdf

    Identity属性是SQL Server中用于创建自增列的一种机制,它允许列的值自动增加,无需手动插入。通常的定义格式为IDENTITY(初始值, 步长值),例如IDENTITY(1, 1)表示该列的值将从1开始自增,每插入一行,该列的值自动...

    oracle生成动态前缀且自增号码的函数分享

    此外,提到了一些与Oracle自增字段相关的文章和方法,如使用触发器(Trigger)和序列(Sequence)模拟自增列,创建自增ID字段的步骤,以及使用序列和触发器的实例。这些方法都是在Oracle中实现自动递增数值的关键...

    Oracle数据库中创建自增主键的实例教程

    通过更新语句,我们将`id`列的值设置为`SEQ_ID.NEXTVAL`,从而实现了自增主键的效果。 ```sql -- 新建一个缺少主键的表 CREATE TABLE test1 (name1 VARCHAR2(40), city VARCHAR2(40)); -- 插入数据 -- ...

Global site tag (gtag.js) - Google Analytics