C# 更新时违反C应用程序中的唯一密钥约束

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

我在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,
    [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'?它肯定已经存在了?它确实存在。它是唯一的,但不是主键,所以它仍然应该是可以更新的,对吗?你知道唯一意味着唯一,对吗?嗯,唯一的限制。通过这种方式,主键不仅仅是唯一的: