我正在开发Windows应用程序(使用Visual Studio 2008,Sql server 2005)。我必须维护用户日志信息。我有一个标识栏。它工作正常。但是现在identity列的值是172.再次当我尝试登录时,我收到错误:
违反主键pk_userLogId无法在object'dbo.UserLog'中插入重复值。 声明已经终止。
当我关闭错误对话框时,我仍然可以使用该应用程序但是没有维护用户日志。
我应该怎么做以避免收到此错误消息?
我有什么方法可以设置标识列的最大值吗?
请帮帮我! 提前谢谢!
答案 0 :(得分:0)
您是否已将自己的标识列设置为自动增量。它听起来不像数字范围问题。相反,在创建新的UserLog条目时,您似乎明确提供了主键值。错误消息让我相信表UserLog中已存在一条记录,其中包含您尝试添加的相同主键值。
答案 1 :(得分:0)
修改强>
我最初的回答是错误的,因为它是基于对日志表架构的误解。鉴于Sheetal后来发布了这个模式(我意识到列的名称是UserLogId,而不是UserLoginID ......),这个假设无效。
因此,日志表是
CREATE TABLE USERLOG
( UserLogId int identity (1,1) CONSTRAINT pk_UserLogId primary key,
UserName nvarchar(50) not null,
LogInTime datetime CONSTRAINT dft_LogInTime default getdate()
)
--ADDING LOGOUT TIME ALTER TABLE USERLOG ADD LogOutTime datetime
让OP问题更令人费解......
如何通过标识列获取PK违规条件? (除非该表的INDENTITY_INSERT设置,以及包含PK列值的手动编辑/插入,也许Sheetal可以解释一下......?)
因此,Sheetal应该在用户通过身份验证之后,在完成登录的代码区域中查看应用程序的逻辑,并查找为UserLogId列指定值的查询实例(WHERE子句除外) ,当然)。 顺便说一句,我不确定为什么我们都这么努力?鉴于Sheetal自己设定问题的最小努力,即使考虑到可能存在英语语言障碍,并提供信息...... 和当然是他的录取率...... ;-)- 以下是错误的(基于错误的假设)----
问题似乎是 UserLoginId 被声明为日志表的主键。对于这样的表,这是一个奇怪的选择,因为我们希望给定用户有许多日志记录。
在SQL表中,主键约束实质上指示SQL拒绝对具有表中容易存在的主键值的记录的任何INSERT请求。 (并返回类似于问题中提到的错误条件)
很难建议不知道日志表架构和用例,但您可以完全删除pk约束或使用其他列。名为“EventId”的自动递增列可能是一个很好的选择。你会在日志表中得到类似的东西:
EventID (PK) DateTime UserLoginId EventType Details
1 01/02/2008 06:15:01 172 LogIn Stan
2 01/02/2008 06:15:21 321 LogIn Jeff
3 01/02/2008 06:15:24 172 FileDownload Report7.pdf
4 01/02/2008 06:15:54 172 FileDownload SalesTraining.pdf
5 01/02/2008 06:17:21 321 LogOut
等...