新增记录后,获取新增id出错

artcodeman 2008-12-09 09:38:34
有一News表,id为主键,自动增长,新增记录后想获取新增记录的id,无法获取,代码如下

SqlConnection Conn = new SqlConnection(strconn) ;
Conn.Open();
string sql = "insert into News(Title,NewsFrom,NewsContents,UpdateTime) values(@Title,@NewsFrom,@NewsContents,@UpdateTime)";
SqlCommand cmd = new SqlCommand(sql,Conn);
cmd.Parameters.Add(new SqlParameter("@Title",SqlDbType.NVarChar,255));
cmd.Parameters.Add(new SqlParameter("@NewsFrom",SqlDbType.NVarChar,50));
cmd.Parameters.Add(new SqlParameter("@NewsContents",SqlDbType.NText));
cmd.Parameters.Add(new SqlParameter("@UpdateTime",SqlDbType.DateTime,8));
cmd.Parameters["@Title"].Value=StrTitle;
cmd.Parameters["@NewsFrom"].Value=StrNewsFrom;
cmd.Parameters["@NewsContents"].Value=StrContents;
cmd.Parameters["@UpdateTime"].Value=DateTime.Now;
cmd.ExecuteNonQuery();
//获取新增记录ID
sql="select SCOPE_IDENTITY() as ID from News";
SqlCommand cmdsel = new SqlCommand(sql,Conn);
SqlDataReader NewsDr = cmdsel.ExecuteReader();
if(NewsDr.Read())
{
Response.Redirect("News_Detail.aspx?ID="+NewsDr["ID"].ToString());
}
Conn.Close();
...全文
257 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
空心兜兜 2008-12-09
  • 打赏
  • 举报
回复
学习下
twin21cn 2008-12-09
  • 打赏
  • 举报
回复
在存储过程里先Insert ,然后SELECT @@identity 取这个返回值就可以了
liwei920 2008-12-09
  • 打赏
  • 举报
回复
SqlConnection Conn = new SqlConnection(strconn) ;
Conn.Open();
string sql = "insert into News(Title,NewsFrom,NewsContents,UpdateTime) values(@Title,@NewsFrom,@NewsContents,@UpdateTime);SELECT @Identity=SCOPE_IDENTITY()";
SqlCommand cmd = new SqlCommand(sql,Conn);
cmd.Parameters.Add(new SqlParameter("@Title",SqlDbType.NVarChar,255));
cmd.Parameters.Add(new SqlParameter("@NewsFrom",SqlDbType.NVarChar,50));
cmd.Parameters.Add(new SqlParameter("@NewsContents",SqlDbType.NText));
cmd.Parameters.Add(new SqlParameter("@UpdateTime",SqlDbType.DateTime,8));
SqlParameter identity=new SqlParameter("@Identity",SqlDbType.Int);
identity.Direction = ParameterDirection.Output;
cmd.Parameters.Add(identity);
cmd.Parameters["@Title"].Value=StrTitle;
cmd.Parameters["@NewsFrom"].Value=StrNewsFrom;
cmd.Parameters["@NewsContents"].Value=StrContents;
cmd.Parameters["@UpdateTime"].Value=DateTime.Now;
int iden=int.Parse(cmd.ExecuteReader().toString());
ReyZhang 2008-12-09
  • 打赏
  • 举报
回复
在插入的sql语句中写就可以了

string sql = "insert into News(Title,NewsFrom,NewsContents,UpdateTime) values(@Title,@NewsFrom,@NewsContents,@UpdateTime);SELECT SCOPE_IDENTITY() as id "; 


执行返回单个值的操作

int Id=Convert.ToInt32(cmd.ExecuteScalar());

walkghost 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 BernardSun 的回复:]
sql数据库直接在insert 最后写
SELECT @@identity
就行了,不用另查
[/Quote]
比如:
insert into testid (data) values ('aaa') select @@identity
就会返回当前插入行的自动编号的ID。
叶子 2008-12-09
  • 打赏
  • 举报
回复

declare @table table (id int identity(1,1),mcontent nvarchar(200))

insert into @table (mcontent)
select 'tt' union all
select 'yy'
select * from @table

select @@identity 'newid'

insert into @table (mcontent)
select 'mm'
select @@identity 'newid'


lz运行一下就看明白了
sxmonsy 2008-12-09
  • 打赏
  • 举报
回复
接点分也不容易呀
jiang_jiajia10 2008-12-09
  • 打赏
  • 举报
回复

SELECT MAX(ID) from News

这样多用户同时并发操作怎么办。不推荐这样做。
wuyq11 2008-12-09
  • 打赏
  • 举报
回复
select max(id) as ID from News
或把添加放在存储过程,在过程里
select max(id) from news 返回数据
tian_fang 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 takeshe 的回复:]
@@IDENTITY,返回最近一次插入的IDENTITY列的数值,返回值是numeric
[/Quote]

.
Robin 2008-12-09
  • 打赏
  • 举报
回复
SELECT max(ID) from News会出现脏读的问题

SqlConnection Conn = new SqlConnection(strconn) ;
Conn.Open();
string sql = "insert into News(Title,NewsFrom,NewsContents,UpdateTime) values(@Title,@NewsFrom,@NewsContents,@UpdateTime) SELECT @@Identity";
SqlCommand cmd = new SqlCommand(sql,Conn);
cmd.Parameters.Add(new SqlParameter("@Title",SqlDbType.NVarChar,255));
cmd.Parameters.Add(new SqlParameter("@NewsFrom",SqlDbType.NVarChar,50));
cmd.Parameters.Add(new SqlParameter("@NewsContents",SqlDbType.NText));
cmd.Parameters.Add(new SqlParameter("@UpdateTime",SqlDbType.DateTime,8));
SqlParameter identity=new SqlParameter("@Identity",SqlDbType.Int);
cmd.Parameters["@Title"].Value=StrTitle;
cmd.Parameters["@NewsFrom"].Value=StrNewsFrom;
cmd.Parameters["@NewsContents"].Value=StrContents;
cmd.Parameters["@UpdateTime"].Value=DateTime.Now;
int Id=Convert.ToInt32(cmd.ExecuteScalar());

试试
HarrisonXu 2008-12-09
  • 打赏
  • 举报
回复
顶..
sz_free_bird 2008-12-09
  • 打赏
  • 举报
回复
没测试过,你试试。
takeshe 2008-12-09
  • 打赏
  • 举报
回复
@@IDENTITY,返回最近一次插入的IDENTITY列的数值,返回值是numeric
sz_free_bird 2008-12-09
  • 打赏
  • 举报
回复
 SqlConnection Conn = new SqlConnection(strconn) ;
Conn.Open();
string sql = "insert into News(Title,NewsFrom,NewsContents,UpdateTime) values(@Title,@NewsFrom,@NewsContents,@UpdateTime);SELECT @Identity=SCOPE_IDENTITY()";
SqlCommand cmd = new SqlCommand(sql,Conn);
cmd.Parameters.Add(new SqlParameter("@Title",SqlDbType.NVarChar,255));
cmd.Parameters.Add(new SqlParameter("@NewsFrom",SqlDbType.NVarChar,50));
cmd.Parameters.Add(new SqlParameter("@NewsContents",SqlDbType.NText));
cmd.Parameters.Add(new SqlParameter("@UpdateTime",SqlDbType.DateTime,8));
SqlParameter identity=new SqlParameter("@Identity",SqlDbType.Int);
identity.Direction = ParameterDirection.Output;
cmd.Parameters.Add(identity);
cmd.Parameters["@Title"].Value=StrTitle;
cmd.Parameters["@NewsFrom"].Value=StrNewsFrom;
cmd.Parameters["@NewsContents"].Value=StrContents;
cmd.Parameters["@UpdateTime"].Value=DateTime.Now;
int iden=int.Parse(cmd.ExecuteReader().toString());
artcodeman 2008-12-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 zhnzzy 的回复:]
SELECT MAX(ID) from News
[/Quote]
这样会出现并发性问题,有可能获取的是另一个客户端插入的id
sz_free_bird 2008-12-09
  • 打赏
  • 举报
回复
这样肯定是不行的。因为你分两次访问了数据库。也就是两次会话。而SCOPE_IDENTITY() 返回在当前会话中的任何表内所生成的最后一个标识值。你第二次访问数据库的时候没有生成任何值。所以你要在第一次访问数据库的时候得到此值。
cyqlightrain 2008-12-09
  • 打赏
  • 举报
回复
你这样写不好,如果数据量很大的话很容易出错,还是把插入和获取ID写到一个SP里面运行吧!
BernardSun 2008-12-09
  • 打赏
  • 举报
回复
sql数据库直接在insert 最后写
SELECT @@identity
就行了,不用另查

zhnzzy 2008-12-09
  • 打赏
  • 举报
回复
SELECT MAX(ID) from News
加载更多回复(3)

62,040

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧