今天解决了一个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>
分享到:
相关推荐
注意,这个过程只适用于那些在插入时能立即返回自增主键的数据库系统,比如MySQL。在某些数据库中(如Oracle),可能需要使用其他方法来获取自增主键。 总的来说,Java中的JDBC提供了一种灵活且强大的方式来处理...
- `IDENT_INCR()`: 返回自增列的增量值,通常是1,但也可能是其他用户定义的值。 - `IDENT_SEED()`: 返回自增列的初始种子值,即第一次插入时的起始值。 3. **示例代码解析**: - `DECLARE @Table_name VARCHAR...
以下是如何在 Oracle 中创建自增列的详细步骤和相关知识点: 1. **创建序列(Sequence)** - `CREATE SEQUENCE` 语句用于创建序列。例如: ```sql CREATE SEQUENCE userlogin_seq INCREMENT BY 1 -- 每次增加的...
- 更新自增列时,若值重复则报错,大于当前值则下一个编号从新值开始。 - `REPLACE`命令不会改变WHERE子句中出现的AUTO_INCREMENT值,除非没有明确指定。 4. **last_insert_id()函数**: - 该函数用于获取自增列...
自增列通常用作主键的一部分,自动递增其值,为新插入的每一行提供一个唯一的标识。这极大地方便了数据管理和维护,尤其是在大量插入新记录时。 在SQL Server中,你可以通过查询系统视图和对象来判断一个表是否具有...
DBCC CHECKIDENT ('table_name', NORESEED) 命令用于检查表的当前标识值和应有的标识值,将返回一个报表,指明当前标识值和应有的标识值。例如: Checking identity information: current identity value '6109', ...
比如,创建一个由多个列组成的唯一索引,将自增列作为最后的列。这样,前面列的不同组合将对应不同的自增序列。 总的来说,理解MySQL中不同存储引擎对自增字段的处理方式非常重要,这有助于我们在设计数据库时做出...
例如,执行 `SEQ_EMP.NEXTVAL` 将会返回序列的下一个值,并使当前值变为这个新值;而 `SEQ_EMP.CURRVAL` 则返回序列的当前值。 ### 修改序列 (Alter Sequence) 如果需要对已创建的序列进行修改,可以使用 ALTER ...
`ExecuteScalar()`方法将返回查询的第一行第一列的值,这正是我们想要的自动增长列`id`。请注意,如果`ExecuteScalar()`返回`null`,则表示插入操作可能失败或者`id`列未生成新值。因此,在实际应用中,你需要进行...
序列主要用于当需要为表中的某列自动生成唯一值时。例如,在插入新记录时,可以使用序列生成的值作为主键或唯一标识符。 ##### 序列的基本操作: 1. **创建序列**: ```sql CREATE SEQUENCE sequence_name ...
- `DBHelper.ExecSqlScalar` 方法执行SQL语句并返回查询结果的第一行第一列数据。 - 如果查询结果为 `NULL` 或者表中没有数据,则返回的是空字符串。 #### 2. 生成新的编码 接下来,我们需要基于获取到的最大编码...
这个查询会返回所有自增主键列的元数据,包括它们所在的表、数据类型以及理论上的最大值。 在Prometheus的Web界面中,我们可以使用Prometheus Query Language (PromQL) 来计算剩余自增主键的百分比。例如,可以编写...
`OUTPUT INSERTED.ID`将返回新插入行的标识列值。如果你是在ADO.NET环境中,可以通过调用`SqlCommand.ExecuteScalar()`方法来获取这个值,如下所示: ```csharp int r = command.ExecuteScalar(); ``` 2. 使用全局...
- **概念:** `LAST_INSERT_ID()`是一个内置函数,用于返回上一次插入操作产生的自增ID。 - **用法:** 可以直接在查询语句中使用`LAST_INSERT_ID()`来获取自增ID。 - **示例:** 假设执行了一次插入操作后,可以...
Identity属性是SQL Server中用于创建自增列的一种机制,它允许列的值自动增加,无需手动插入。通常的定义格式为IDENTITY(初始值, 步长值),例如IDENTITY(1, 1)表示该列的值将从1开始自增,每插入一行,该列的值自动...
此外,提到了一些与Oracle自增字段相关的文章和方法,如使用触发器(Trigger)和序列(Sequence)模拟自增列,创建自增ID字段的步骤,以及使用序列和触发器的实例。这些方法都是在Oracle中实现自动递增数值的关键...
通过更新语句,我们将`id`列的值设置为`SEQ_ID.NEXTVAL`,从而实现了自增主键的效果。 ```sql -- 新建一个缺少主键的表 CREATE TABLE test1 (name1 VARCHAR2(40), city VARCHAR2(40)); -- 插入数据 -- ...