数据库为Sql-server2000,有一表,主键ID为Int、自动增长,在dot net 2.0中用FormView加SqlDataSource控件自动插入新记录,如何在插入记录后,取得新记录的ID的值?(注:本人用select @@IDENTITY,在FormView1_ItemInserted和SqlDataSource_examinee_Inserted事件中都无法取得)谢谢
解决方案 »
- 大家帮看看 程序错在哪?
- 如何读取域中的所有用户名
- 怎么将数据库数据用dataset的方式XML数据格式显示在aspx上
- 请问asp.net如何实现这个功能
- MyGridView1.DataKeys[e.RowIndex].Value.ToString()怎么取值为空?
- .net2005 如何实现multipage ,tabstrip
- 如何在.VB代码中更改HTML的属性
- DELETE存储过程不能返回值
- 散分,请大家说一下提高自己技术的方法,方便别人借鉴一下,另外请推荐一些自已常上的好的关于web编程的网站,谢谢!
- 单位领导不让开qq,有没有能把qq做成网页形式的发送接收信息,这样就不用开qq了
- 违反并发性: UpdateCommand 影响了预期 1 条记录中的 0 条。
- 使用membership出现的“找不到存储过程 'dbo.aspnet_CheckSchemaVersion'”错误
select top 1 id from table1 order by id desc或者加一个时间字段,插入时保存当前时间
再用保存的时间去数据库select
但是,我觉得用这个应该可以:
public object ExecuteScalar(string strSql)
{
Open();
SqlCommand cmd = new SqlCommand(strSql,conn);
object mm=cmd.ExecuteScalar();
return mm;
}
返回首行 也就是id值了
具体你 试试
取最后一个值
Set @id=SCOPE_IDENTITY();
select max(id) from tbname等不行,因为是多用户.
用的是FormView加SqlDataSource控件插入新记录,没有insert语句,
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'@@IDENTITY
返回最后插入的标识值。
@@IDENTITY
返回最后插入的标识值。语法
@@IDENTITY返回类型
numeric注释
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函数类似。 @@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。示例
下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的标识值。INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
@@IDENTITY
返回最后插入的标识值。语法
@@IDENTITY返回类型
numeric注释
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生
的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。
若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。
如果此语句激发一个或多个执行产生标识值的插入操作的触发器,
则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或
SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原
为以前的设置。在返回插入到表的 @@IDENTITY 列的最后一个值方面,@@IDENTITY、SCOPE_IDENTITY 和
IDENT_CURRENT 函数类似。 @@IDENTITY 和 SCOPE_IDENTITY 将返回在当前会话的所有表中生成的最后一个标识值。
但是,SCOPE_IDENTITY 只在当前作用域内返回值,而 @@IDENTITY 不限于特定的作用域。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回任何
会话和任何作用域中为特定表生成的标识值。有关更多信息,请参见 IDENT_CURRENT。示例
下面的示例向带有标识列的表中插入一行,并用 @@IDENTITY 显示在新行中使用的
标识值。INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
nbsp; ; IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值。IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表。IDENT_CURRENT 返回为任何会话和作用域中的特定表所生成的值。
@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值。
SCOPE_IDENTITY 返回为当前会话和当前作用域中的任何表最后生成的标识值SCOPE_IDENTITY 和 @@IDENTITY 返回在当前会话中的任何表内所生成的最后一个标识值。但是,SCOPE_IDENTITY 只返回插入到当前作用域中的值;@@IDENTITY 不受限于特定的作用域。
例如,有两个表 T1 和 T2,在 T1 上定义了一个 INSERT 触发器。当将某行插入 T1 时,触发器被激发,并在 T2 中插入一行。此例说明了两个作用域:一个是在 T1 上的插入,另一个是作为触发器的结果在 T2 上的插入。
假设 T1 和 T2 都有 IDENTITY 列,@@IDENTITY 和 SCOPE_IDENTITY 将在 T1 上的 INSERT 语句的最后返回不同的值。
@@IDENTITY 返回插入到当前会话中任何作用域内的最后一个 IDENTITY 列值,该值是插入 T2 中的值。
SCOPE_IDENTITY() 返回插入 T1 中的 IDENTITY 值,该值是发生在相同作用域中的最后一个INSERT。如果在作用域中发生插入语句到标识列之前唤醒调用 SCOPE_IDENTITY() 函数,则该函数将返回 NULL 值。
而IDENT_CURRENT('T1') 和 IDENT_CURRENT('T2') 返回的值分别是这两个表最后自增的值。
一是使用Transcation(事务):
Insert之后,即可用SELECT TOP 1 [pkName] FROM [tableName] ORDER BY DESC
另外一种方法是所有表主键,自己定义(随机产生,且不重复),添加前,就已经知道这个主键的ID了;
此函数,http://download.csdn.net/source/303596
这个肯定可以取到..insert into xxx;SELECT @@IDENTITY AS 'Identity'
你用控件插入的时候获取此刻时间(@CreateDate)。
取ID就用 select top 1 ID from Table where dateDiff(ms,@LastUpdateDate ,@CreateDate)< 0.001
然后设置Execute为Scalar,
默认为NoQuery是返回插入的记录数
mysql=mysql+"insert into table values()";
mysql=mysql+"<br>"+"set select @Newid=@@IDENTITY from table "+"<br>";
mysql=mysql+"inser into table1 values(@Newid)";
执行mysql
我用的是FormView加SqlDataSource控件插入新记录,没有insert语句, 所以无法用SELECT @@IDENTITY 取值
写个类...继承 SqlDataSource ...剩下的不用说了吧?
--建议
select Scope_Identity()
select IDENT_CURRENT('表')
IDENT_CURRENT 也不行,因为是多用户。
请求帮助,谢谢。
cmd.exec..("insert ....");
cmd.exec...("select @@identity");
在cs里是一个进程,但对于数据库来说,是两个会话,所以取不到.scope_identity受会话和作用域限制.
最最准确的,用 scope_identity.
@@identity会受触发器等同会话的其它作用域影响,稍有不甚取的就是错的.ident_current 只受表限制, 不受作用域和会话限制, 每次都能取到, 但是实用性不大,因为有并发问题.现在不是说怎么取, 应该看看你的插入操作是怎么进行的.
你应该需要适当的改进你的插入操作部分的代码, 而不是来选择用哪个来取.
谢谢,我用的是FormView加SqlDataSource控件插入新记录,没有插入语句,所以无法用scope_identity取.
//如果执行完之后再取的话,可以考虑这样取
select top 1 ID from [myTable] order by ID desc
select top 1 ID from [myTable] order by ID desc不行,是多用户
他没有更新
select @@IDENTITY 是可以的
这里是如何解决的
很简单
很详细
还有就是scarlar
tableadapter
然后返回只需要转换一下