您的位置:首页 > 编程语言 > ASP

asp.net中怎样快速取得插入数据后自动编号的值?

2016-07-27 09:02 786 查看
数据库中有字段值为自动编号,在asp.net中怎样在插入(Insert into Table() values())数据的同时,或者插入数据后立即取得到该自动编号的值?
请给出access和sql Server的解决方法?谢谢!


解决方案 »

两种方法   

1。CAST(IDENT_CURRENT('表名') AS BigInt)比较好用2。上条语句的新增@@IDENTITY

  

sql server的系统变量@@IDENTITY就是上一次的自动编号值

  

请问 qqdao(青青岛):可以把CAST(IDENT_CURRENT('表名') AS BigInt)讲的具体点吗?谢谢!

另外,在Access和SQL中完全一样吗?
  

sql = "insert into tables(x,y) values(1,2) select @@IDENTITY"

cm.ExecuteScalar()
  

其实,我觉得guid来编号不错。

  

谢谢!我在用@@时遇到了一个问题:

我的是

sql = "insert into tables(x,y) values(1,2)" +

      "select @@IDENTITY";

在asp.net(C#)中提示我

“异常详细信息: System.Data.OleDb.OleDbException: SQL 语句的结束位置缺少分号 (;)。”

好像是@在C#中不能随便用的?

  

1> insert into t1521 (name) values ('fasdfas') ;select @@identity as id;

2> go

(1 行受到影响)

 id

 ----------------------------------------

                                       10(1 行受到影响)

1>
  

在有触发时用@@IDENTITY显然是错的。

在并发时IDENT_CURRENT('表名')也不对。

所以应该用SCOPE_IDENTITY()才是比较好的选择。
  

我用了测试,insert into t1521 (name) values ('fasdfas') ;select @@identity as id;在Access中不能用的!请教在Access中怎么做?
  

请教谁可以给我一段这方面比较完整的C#代码,从Conn.Open()和后到Conn.Close()
  

我也求在 ACCESS方面的解!!!
  

sql server:

SqlConnection conn = new SqlConnection(ConnectionString);conn.open();sql = "Insert Into table1(t1,t2) value(1,2);select @@IDENTITY";SqlCommand cmd = new SqlCommand(sql);cmd.Connection = conn;int i = cmd.ExecuteScalar(); //i就是你要的cmd.Dispose();conn.close();conn.Dispose();

  

access 不太好弄有个笨办法,就是先将数据插入到表中,然后在表中选出刚才的数据,取ID
  

获取数据库的自动编号字段值是很难的,但是还是有办法的:)

下面分别就sql server与access讨论实现:

一、sql server的实现方案

A、原理篇

    我们应该了解到,存储过程和输出参数的一种常见用法就是“提供了一种简单的方法来获取标识值”。

    在使用sql server来插入一行记录时,该记录会自然含有一个标识字段。当然,我们要明白的是这个标识字段其实指的是一个数字字段,每次sql server插入一条记录时就会给这个字段赋值,赋值时按照顺序号加上一个值(通常是1)。尤其要注意的是:当我们把一条记录添加到含有标识字段的表中时,不能自行为这个标识字段赋值。

    标识值相当与access中的自动编号字段,它主要是为了给每个记录赋予一个唯一的键。 

    在asp.net中发现sql server的一条新插入记录的标识值是需要一点小窍门的。比如说在ado.net更新了数据库表以后,标识值就不能在任何标准的ado.net对象中自动出现。也就是楼主要寻求解决方法的原因了。

B、解决思路

我们要利用存储过程和输出参数提供的功能来实现之。

C、实现方法

首先,假设我们把数据库中有一个存储过程的名字为insertmbr,在这个存储过程的第一行代码中不仅含有我们要运行的insert语句,还要在第二行处包含以下语句:

SET @Identity=@@Identity

说明:@@Identity系统变量就是用来记录标识值的,将它赋予@Identity变量上就能输出到asp.net页面中了。

然后在asp.net页中,编写代码如下:

.

.

.

//conClsf变量代表一个数据库连接

cmdMbrs = New SqlCommand("insertmbr",conClsf) 

cmdMbrs = CommandType = CommandType.StoredProcedure

cmdMbrs.Parameters.Add("@identity")

cmdMbrs.Parameters("@identity").Direction = ParameterDirection.Output

cmdMbrs.ExecuteNOnQuery

intIdentity = cmdMbrs.Parameters("@identity").Value 此时,intIdentity变量中就是新插入记录的标识值。

时间问题,我待会就把access的实现方法写出来,现在就先发这个吧:)
  

蠢办法啊,插入后

select top 1 id from table order by id desc
  

zhuxiaojun2002(atoz) 

这种方法不行,

同时插入数据的人多呢?

取出来的就不是自己刚刚发的那个了:)
  

zhuxiaojun2002(atoz) 

这种方法不行,

同时插入数据的人多呢?

取出来的就不是自己刚刚发的那个了:)

那你就在后面加上where userID = currentUserID 呗。
  

sql = "insert into tables(x,y) values(1,2) select @@IDENTITY"

cm.ExecuteScalar()
  

insert ---------(略)

select @@identity as c1 from table或者用存储过程:CREATE PROCEDURE spName

//加入您的参数

@id int output

AS

insert into table(参数) values(参数)

select @id=@@identity RETURN

GO返回的参数@id值就是您要的值。
  

int   i   =   cmd.ExecuteScalar();   

这个右边不是对象吗?
  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: