C# 更新时违反C应用程序中的唯一密钥约束
我在SQL Server数据库中有一个名为Contact的表。唯一的主键是contactID。以下是用于创建此表的脚本部分:C# 更新时违反C应用程序中的唯一密钥约束,c#,sql-server,ado.net,C#,Sql Server,Ado.net,我在SQL Server数据库中有一个名为Contact的表。唯一的主键是contactID。以下是用于创建此表的脚本部分: CREATE TABLE [dbo].[contact] ( [contactID] [int] IDENTITY(1,1) NOT NULL, [lName] [varchar](45) NOT NULL, [fName] [varchar](45) NOT NULL, [dob] [date] NOT NULL, [mailin
CREATE TABLE [dbo].[contact]
(
[contactID] [int] IDENTITY(1,1) NOT NULL,
[lName] [varchar](45) NOT NULL,
[fName] [varchar](45) NOT NULL,
[dob] [date] NOT NULL,
[mailingAddressStreet] [varchar](100) NOT NULL,
[mailingAddressCity] [varchar](100) NOT NULL,
[mailingAddressState] [char](2) NOT NULL,
[mailingAddressZip] [char](5) NOT NULL,
[phoneNumber] [varchar](20) NOT NULL,
[gender] [char](1) NULL,
[SSN] [char](9) NOT NULL,
[userType] [int] NOT NULL,
PRIMARY KEY CLUSTERED ([contactID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
以下是我在C中用于执行更新的方法:
public static bool UpdatePatient(int contactID, string lastName, string firstName, DateTime DOB, string street, string city, string state,
string ZIP, string phone, string gender, string SSN)
{
bool isUpdated = false;
string updateStmt = "UPDATE contact SET lName = @lastName, fName = @firstName, dob = @DOB, mailingAddressStreet = @street, " +
"mailingAddressCity = @city, mailingAddressState = @state, mailingAddressZip = @ZIP, phoneNumber = @phone, gender = @gender, ssn = @SSN " +
"WHERE contactID = @contactID";
try
{
using (SqlConnection connect = DBConnection.GetConnection())
{
connect.Open();
using (SqlCommand cmd = new SqlCommand(updateStmt, connect))
{
cmd.Parameters.AddWithValue("@contactID", contactID);
cmd.Parameters.AddWithValue("@lastName", lastName);
cmd.Parameters.AddWithValue("@firstName", firstName);
cmd.Parameters.AddWithValue("@DOB", DOB);
cmd.Parameters.AddWithValue("@street", street);
cmd.Parameters.AddWithValue("@city", city);
cmd.Parameters.AddWithValue("@state", state);
cmd.Parameters.AddWithValue("@ZIP", ZIP);
cmd.Parameters.AddWithValue("@phone", phone);
cmd.Parameters.AddWithValue("@gender", gender);
cmd.Parameters.AddWithValue("@SSN", SSN);
isUpdated = (cmd.ExecuteNonQuery() > 0);
}
connect.Close();
}
return isUpdated;
}
catch (SqlException sqlex)
{
throw sqlex;
}
catch (Exception ex)
{
throw ex;
}
}
我知道视图正在传入正确的参数,所以这不是问题。但是,当我运行应用程序并尝试更新某人的联系信息时,会出现如下错误:
违反唯一密钥约束UQ_contact_CA1E8E3C4CEC5645。无法在对象“dbo.contact”中插入重复的密钥。重复的键值是333222112
当然,这个数字333222112是完全为了测试目的而组成的SSN。当作为测试运行更新时,我实际上保持SSN不变。但是,如果输入错误后需要更正,则包含SSN的功能非常重要。更新表单中已预先填充了所有联系信息,用户可以在单击按钮进行更新之前进行任何更改,这将调用此方法。SSN上是否有唯一索引?是的,有。SSN应该是唯一的,但它也应该是在需要更正时可以更新的。您可以在数据库上运行SELECT*FROM contact,其中SSN='333222112'?它肯定已经存在了?它确实存在。它是唯一的,但不是主键,所以它仍然应该是可以更新的,对吗?你知道唯一意味着唯一,对吗?嗯,唯一的限制。通过这种方式,主键不仅仅是唯一的: