怎么获取刚刚插入数据库记录的ID,并且提取出来???解决就给分……在线等……

时间:2022-04-22 13:54:47
用这个方法好像不行,该怎么办?请高手指点
public int GetAutoID(ref int testprocessID)
{
OpenConnection();
cm=new SqlCommand("select @@identity from testprocess",cn);
dr=cm.ExecuteReader();
if(dr.Read())
{
testprocessID=int.Parse(dr["@@identity"].ToString());
}
CloseConnection();
return testprocessID;

13 个解决方案

#1


返回一个@@identity

#2


怎么返回呢?给点代码好吗?

#3


用一个output参数:

代码:

#region Insert
private const string PROC_INSERT = "Information_Insert";
public bool Insert(InformationEntity entity)
{
SqlParameter[] parms = GetParametersForInsert();
parms[0].Value = DataUtility.FiltrateValue(entity.Id);
parms[1].Value = DataUtility.FiltrateValue(entity.Title);
parms[2].Value = DataUtility.FiltrateValue(entity.Keyword);
parms[3].Value = DataUtility.FiltrateValue(entity.CreateDataTime);
parms[4].Value = DataUtility.FiltrateValue(entity.LastModifyDateTime);
parms[5].Value = DataUtility.FiltrateValue(entity.LastVisitDateTime);
parms[6].Value = DataUtility.FiltrateValue(entity.VisitTimes);

bool result = SqlHelper.ExecuteNonQuery(CommandType.StoredProcedure, PROC_INSERT, parms) == 1;
if(result) 
{
entity.Id = (long)parms[0].Value;
}
return result;
}

Store Procedure:
CREATE PROCEDURE [Information_Insert]
@id bigint output,
@title nvarchar(200),
@keyword nvarchar(200),
@createDataTime datetime,
@lastModifyDateTime datetime,
@lastVisitDateTime datetime,
@visitTimes int
AS
INSERT INTO Information
(
[Title],
[Keyword],
[CreateDataTime],
[LastModifyDateTime],
[LastVisitDateTime],
[VisitTimes]
)
VALUES
(
@title,
@keyword,
@createDataTime,
@lastModifyDateTime,
@lastVisitDateTime,
@visitTimes
)

SET @id = SCOPE_IDENTITY()
GO

#4


testprocessID=int.Parse(dr[0].ToString());


另外,"select @@identity from testprocess"要与另一个导致新@@identity被创建的SQL命令一起使用才行。

#5


用存储过程。。 返回的唯一数据集是通过select @@identity返回的

#6


使用testprocessID=int.Parse(dr[0].ToString());后提示说输入的字符串格式不正确^

#7


testprocessID=int.Parse(dr[0].ToString());
昨又变成字符型,又转回整形?
testprocessID=int.Parse(dr[0]);
这样不行?

#8


我使用testprocessID=dr.GetInt32(0);也不行.
testprocessID=int.Parse(dr[0]);
都不行.只能用一楼仁兄的存储过程试一试了.

#9


TO:ubbii(培骏) ,你为什么要用parms[0].Value = DataUtility.FiltrateValue(entity.Id);
这个值不是自动递增的吗?

#10


没有看见插入操作在哪。而且应该用sqlcommand.executescalar方法返回一个值呀。
int i =Convert.ToInt32(cm.ExecuteScalar());

#11


parms[0].Value = DataUtility.FiltrateValue(entity.Id);
DataUtility是什么意思啊,还有FiltrateValue(entity.Id)可以解释一下吗?

#12


TO:tnt8csdn2000(Userful,我是假设已经插入好了,然后返回刚插入的ID,你的返回可以详细点吗?
解决了,这里的兄弟全部有分的,明天另开贴给你们加分.

#13


不好意思,刚才打错了,是这样的,parms[0]不应该赋值,直接设为Direction=ParameterDirection.Output,
Sql中,先用Insert插入记录,自增的列,SqlServer会自动赋值,
这时候可以用@@Identity或者SCOPE_IDENTITY得到刚才SqlServer自动给的那个值
(两者之间的区别可以参见SqlServer的帮助)
然后将这个值交给一个output参数就可以(SET @id = SCOPE_IDENTITY)

#1


返回一个@@identity

#2


怎么返回呢?给点代码好吗?

#3


用一个output参数:

代码:

#region Insert
private const string PROC_INSERT = "Information_Insert";
public bool Insert(InformationEntity entity)
{
SqlParameter[] parms = GetParametersForInsert();
parms[0].Value = DataUtility.FiltrateValue(entity.Id);
parms[1].Value = DataUtility.FiltrateValue(entity.Title);
parms[2].Value = DataUtility.FiltrateValue(entity.Keyword);
parms[3].Value = DataUtility.FiltrateValue(entity.CreateDataTime);
parms[4].Value = DataUtility.FiltrateValue(entity.LastModifyDateTime);
parms[5].Value = DataUtility.FiltrateValue(entity.LastVisitDateTime);
parms[6].Value = DataUtility.FiltrateValue(entity.VisitTimes);

bool result = SqlHelper.ExecuteNonQuery(CommandType.StoredProcedure, PROC_INSERT, parms) == 1;
if(result) 
{
entity.Id = (long)parms[0].Value;
}
return result;
}

Store Procedure:
CREATE PROCEDURE [Information_Insert]
@id bigint output,
@title nvarchar(200),
@keyword nvarchar(200),
@createDataTime datetime,
@lastModifyDateTime datetime,
@lastVisitDateTime datetime,
@visitTimes int
AS
INSERT INTO Information
(
[Title],
[Keyword],
[CreateDataTime],
[LastModifyDateTime],
[LastVisitDateTime],
[VisitTimes]
)
VALUES
(
@title,
@keyword,
@createDataTime,
@lastModifyDateTime,
@lastVisitDateTime,
@visitTimes
)

SET @id = SCOPE_IDENTITY()
GO

#4


testprocessID=int.Parse(dr[0].ToString());


另外,"select @@identity from testprocess"要与另一个导致新@@identity被创建的SQL命令一起使用才行。

#5


用存储过程。。 返回的唯一数据集是通过select @@identity返回的

#6


使用testprocessID=int.Parse(dr[0].ToString());后提示说输入的字符串格式不正确^

#7


testprocessID=int.Parse(dr[0].ToString());
昨又变成字符型,又转回整形?
testprocessID=int.Parse(dr[0]);
这样不行?

#8


我使用testprocessID=dr.GetInt32(0);也不行.
testprocessID=int.Parse(dr[0]);
都不行.只能用一楼仁兄的存储过程试一试了.

#9


TO:ubbii(培骏) ,你为什么要用parms[0].Value = DataUtility.FiltrateValue(entity.Id);
这个值不是自动递增的吗?

#10


没有看见插入操作在哪。而且应该用sqlcommand.executescalar方法返回一个值呀。
int i =Convert.ToInt32(cm.ExecuteScalar());

#11


parms[0].Value = DataUtility.FiltrateValue(entity.Id);
DataUtility是什么意思啊,还有FiltrateValue(entity.Id)可以解释一下吗?

#12


TO:tnt8csdn2000(Userful,我是假设已经插入好了,然后返回刚插入的ID,你的返回可以详细点吗?
解决了,这里的兄弟全部有分的,明天另开贴给你们加分.

#13


不好意思,刚才打错了,是这样的,parms[0]不应该赋值,直接设为Direction=ParameterDirection.Output,
Sql中,先用Insert插入记录,自增的列,SqlServer会自动赋值,
这时候可以用@@Identity或者SCOPE_IDENTITY得到刚才SqlServer自动给的那个值
(两者之间的区别可以参见SqlServer的帮助)
然后将这个值交给一个output参数就可以(SET @id = SCOPE_IDENTITY)