数据库为Sql-server2000,有一表,主键ID为Int、自动增长,在dot net 2.0中用FormView加SqlDataSource控件自动插入新记录,如何在插入记录后,取得新记录的ID的值?(注:本人用select @@IDENTITY,在FormView1_ItemInserted和SqlDataSource_examinee_Inserted事件中都无法取得)谢谢

解决方案 »

  1.   

    直接取表不行吗?
    select top 1 id from table1 order by id desc或者加一个时间字段,插入时保存当前时间
    再用保存的时间去数据库select
      

  2.   

    你的做法具体不是太了解,
    但是,我觉得用这个应该可以:
    public object ExecuteScalar(string strSql)
        {
            Open();
            SqlCommand cmd = new SqlCommand(strSql,conn);
            object mm=cmd.ExecuteScalar();
            return mm;
        }
    返回首行  也就是id值了
    具体你 试试
      

  3.   

    IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。@@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。
      

  4.   

    不会用 SqlDataSource但猜想 select @@IDENTITY 应该可以
      

  5.   

    select max(id) from tbname
    取最后一个值
      

  6.   

    select Max(id) from Table
      

  7.   

    select @@IDENTITY可以吧,你把你写的SQL贴出来.我就是那么用的,没什么问题的
      

  8.   

    select Max(id) from Table
      

  9.   

    在存储过程最后加上这名话:@id 为输出或者返回参数
    Set @id=SCOPE_IDENTITY();
      

  10.   

    int id=   Convert.ToInt32(SqlCmd.ExecuteScalar("Insert into 略;Select   @@identity"));
      

  11.   

    首先谢谢大家.
    select max(id) from tbname等不行,因为是多用户.
    用的是FormView加SqlDataSource控件插入新记录,没有insert语句,
      

  12.   

    select @@IDENTITY 跟插入的sql语句结合一起使用应该可以的吧,很久前貌似见过这样的存储过程
      

  13.   

    INSERT INTO jobs (job_desc,min_lvl,max_lvl)
    VALUES ('Accountant',12,125)
    SELECT @@IDENTITY AS 'Identity'@@IDENTITY
    返回最后插入的标识值。
      

  14.   

    这个select @@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'
      

  15.   

    汗,怎么排版的?
    @@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'
      

  16.   

    select @@IDENTITY 不行,因为没有insert语句。
      

  17.   

    @@IDENTITY是真对当前会话,而不是全局共享,不然一定取的到.
      

  18.   

    SQL Server 2000中,有三个比较类似的功能:他们分别是:SCOPE_IDENTITY、IDENT_CURRENT 和 @@IDENTITY,它们都返回插入到 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') 返回的值分别是这两个表最后自增的值。 
      

  19.   

    说实的,有关此问题,Insus.NET的做法有两种:
    一是使用Transcation(事务):
    Insert之后,即可用SELECT TOP 1 [pkName] FROM [tableName] ORDER BY DESC
     
    另外一种方法是所有表主键,自己定义(随机产生,且不重复),添加前,就已经知道这个主键的ID了;
    此函数,http://download.csdn.net/source/303596
      

  20.   

    你不能在inserted事件里面去,因为inserted事件里面insert操作已经完成并且结束了。select @@identity必须和insert在同一个stored procedure里面才有意义,因此你要写一个insert的stored procedure,以自定义方式执行insert,调用这个stored procedure,获取它的返回值。
      

  21.   

    一般都是用select @@identity在存储过程里获得,然后取OUT参数来获取的啊,应该没有什么问题的!
      

  22.   

    select @@IDENTITY 
    这个肯定可以取到..insert into xxx;SELECT @@IDENTITY AS 'Identity'
      

  23.   

    两次解释,我没有insert语句,而且有控件直接插入新记录的,所以直接用SELECT @@IDENTITY 不行.
      

  24.   

    这种问题就像26楼朋友说的那样。用时间来标示,最好不过了。
    你用控件插入的时候获取此刻时间(@CreateDate)。
    取ID就用 select top 1 ID from Table where dateDiff(ms,@LastUpdateDate ,@CreateDate)< 0.001
      

  25.   

    select top 1 id from table1 order by id desc 
      

  26.   

    select top 1 id from table1 order by id desc 不行,因为并发性很高
      

  27.   

    插入语句末尾添加SELECT @@IDENTITY,
    然后设置Execute为Scalar,
    默认为NoQuery是返回插入的记录数
      

  28.   

    mysql="declare @Newid int"+"<br>";
    mysql=mysql+"insert into table values()";
    mysql=mysql+"<br>"+"set select @Newid=@@IDENTITY from table "+"<br>";
    mysql=mysql+"inser into table1 values(@Newid)";
    执行mysql
      

  29.   

    首先谢谢大家,
    我用的是FormView加SqlDataSource控件插入新记录,没有insert语句, 所以无法用SELECT @@IDENTITY 取值
      

  30.   


    写个类...继承 SqlDataSource ...剩下的不用说了吧?
      

  31.   

    楼主的意思是插入的同时要返回新生成的那个ID值,不可能为了这样在来一句select max()吧!效率在哪?
      

  32.   


    --建议
    select Scope_Identity()
      

  33.   

    cmd.ExecuteScalar()可以取到,就用@@IDENTITY
      

  34.   

    插入记录之后 
    select IDENT_CURRENT('表')
      

  35.   

    寫stored procedure 获取它的返回值。
      

  36.   

    select SCOPE_IDENTITY 即可
      

  37.   

    SCOPE_IDENTITY 、 @@IDENTITY 不行,因为我用的是FormView加SqlDataSource控件插入新记录,没有insert语句, 不在同一作用域或会话中。
    IDENT_CURRENT 也不行,因为是多用户。
    请求帮助,谢谢。
      

  38.   

    楼主你取不到,应该是因为你的插入语句与取标识的语句不在同一会话中.  @@identity本就不受作用域限制.
    cmd.exec..("insert ....");
    cmd.exec...("select @@identity");
    在cs里是一个进程,但对于数据库来说,是两个会话,所以取不到.scope_identity受会话和作用域限制.
    最最准确的,用 scope_identity.
    @@identity会受触发器等同会话的其它作用域影响,稍有不甚取的就是错的.ident_current 只受表限制, 不受作用域和会话限制, 每次都能取到, 但是实用性不大,因为有并发问题.现在不是说怎么取, 应该看看你的插入操作是怎么进行的.
    你应该需要适当的改进你的插入操作部分的代码, 而不是来选择用哪个来取.
      

  39.   

    to fcuandy :
      谢谢,我用的是FormView加SqlDataSource控件插入新记录,没有插入语句,所以无法用scope_identity取.
      

  40.   

    既然是自动增长类型,而且是最新插入的值,那就是最大的值了。直接 select max(id) from tablename 就可以了,然后看看你还需要什么条件,加上就行了。
      

  41.   

    同  21  搂要写在一个存储过程里,然后在Inserted事件里就有返回值了
      

  42.   

    SELECT @maxid=@@IDENTITY 
      

  43.   

    我用的是FormView加SqlDataSource控件插入新记录,没有插入语句,所以无法直接用scope_identity、@@IDENTITY 取.
      

  44.   

    我用的是FormView加SqlDataSource控件插入新记录,没有插入语句,所以无法直接用scope_identity、@@IDENTITY 取
      

  45.   

    我用的是FormView加SqlDataSource控件插入新记录,没有插入语句,所以无法直接用scope_identity、@@IDENTITY 取
      

  46.   

     @@IDENTITY  要在本次SqlConnection关闭前使用。否则返回0。如果任何时候都能select  @@IDENTITY 那就没有意义了
      

  47.   

    两次强调,我用的是FormView加SqlDataSource控件插入新记录,没有插入语句,所以无法用@@IDENTITY和scope_identity取.
      

  48.   


    //如果执行完之后再取的话,可以考虑这样取
    select top 1 ID from [myTable] order by ID desc
      

  49.   

    //如果执行完之后再取的话,可以考虑这样取
    select top 1 ID from [myTable] order by ID desc不行,是多用户
      

  50.   

    select @@IDENTITY或用Scope_Identity(),建议用后者
      

  51.   

    SqlDataSource的问题
    他没有更新
    select @@IDENTITY 是可以的
      

  52.   

    select @@IDENTITY 等不行,因为我没有用SQL的insert语句
      

  53.   

    http://blogs.msdn.com/b/smartclientdata/archive/2005/10/31/returnidentityvaluequery.aspx
    这里是如何解决的
    很简单
    很详细
      

  54.   

    其实就是用到了@@indentity
    还有就是scarlar
    tableadapter
    然后返回只需要转换一下