使用LinqtoSQL中的存储过程更新包含标识元素的记录

时间:2012-07-29 20:34:04

标签: c# sql linq-to-sql stored-procedures identity-column

我有一个表定义为:

CREATE TABLE [dbo].[procInfo](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [startTime] [datetime] NOT NULL,
    [endTime] [datetime] NULL,
    [procName] [varchar](50) NOT NULL,
 CONSTRAINT [PK_procInfo] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

当我启动一个Process时,我使用我的c#代码中的LinQtoSQL存储过程为它创建一条记录。 现在,当流程结束时,我想用endtime更新相同的记录。 id应保持与其他表引用的相同。 我知道SQL查询:

SET IDENTITY_INSERT [dbo].[procInfo] ON
SET IDENTITY_INSERT [dbo].[procInfo] OFF

如果已经完成的进程,我有办法存储id。现在,我想编写一个存储过程来使用endTime更新此记录。我一直在尝试各种各样的东西,但没有一个在起作用 有关如何做到这一点的任何建议吗?

3 个答案:

答案 0 :(得分:1)

也许我错过了什么,但你不能简单地使用UPDATE查询吗?

UPDATE procInfo
SET endTime = <end time>
WHERE id = <process id>

应该很简单。

答案 1 :(得分:0)

啊,我发现了一种更简单的方法 我可以把存储过程写成:

CREATE PROCEDURE dbo.insertProcEndTime
(
@id int,
@endtime datetime
)
AS
/* SET NOCOUNT ON */
UPDATE procInfo
SET endTime = @endtime
WHERE id = @id

RETURN

......它奏效了。无需修改IDENTITY_INSERT标志 保持简单愚蠢!!

答案 2 :(得分:0)

插入记录后,您可以使用查询SELECT SCOPE_IDENTITY()

获取IDENTITY

借助此IDENTITY,您可以更新结束时间

  

SELECT SCOPE_IDENTITY()它返回最后一个IDENTITY值   在连接和同一范围内的声明中生成,   无论产生价值的表如何。 SCOPE_IDENTITY()   像@@ IDENTITY一样,将返回在中创建的最后一个标识值   当前会话,但它也会将其限制为您当前的范围   好。换句话说,它将返回您的最后一个标识值   显式创建,而不是由a创建的任何标识   触发器或用户定义的函数。