📜  c# sql 重复键异常 - C# (1)

📅  最后修改于: 2023-12-03 14:59:40.875000             🧑  作者: Mango

C# SQL 重复键异常

在使用 C# 连接 SQL 数据库时,可能会遇到重复键异常。这通常发生在插入或修改数据时,由于与数据库中已有的记录具有相同的键值,导致插入或修改操作失败。

解决方法

重复键异常通常会抛出 System.Data.SqlClient.SqlException 异常。在捕获异常后,可以根据异常信息提供的具体错误代码来判断是哪种类型的重复键异常,如下所示:

try
{
    // 执行插入或修改操作
}
catch (SqlException ex)
{
    if (ex.Number == 2601 || ex.Number == 2627) // 重复键异常代码
    {
        // 处理重复键异常
    }
    else
    {
        // 其他异常处理
    }
}

其中,2601 和 2627 都是重复键异常的错误代码,分别代表唯一约束和主键约束引发的异常。

当遇到重复键异常时,可以根据具体情况进行以下处理:

  • 如果是插入操作,则可以判断是否已存在该记录,避免重复插入;
  • 如果是修改操作,则可以先查询目标记录是否已存在,如果不存在再进行修改操作。
示例代码

以下示例代码演示如何通过使用 try-catch 语句捕获重复键异常,并根据异常类型进行特定处理。

try
{
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();

        SqlCommand command = new SqlCommand("INSERT INTO Persons (PersonID, LastName, FirstName) VALUES (@PersonID, @LastName, @FirstName);", connection);

        command.Parameters.AddWithValue("@PersonID", 1);
        command.Parameters.AddWithValue("@LastName", "Smith");
        command.Parameters.AddWithValue("@FirstName", "John");

        int result = command.ExecuteNonQuery();

        Console.WriteLine("插入成功,受影响的行数:{0}", result);
    }
}
catch (SqlException ex)
{
    if (ex.Number == 2601 || ex.Number == 2627)
    {
        Console.WriteLine("插入失败,已经存在该记录!");
    }
    else
    {
        Console.WriteLine("出现异常:{0}", ex.Message);
    }
}

在上述示例中,我们使用 SqlCommand 对象执行一个插入语句,向 Persons 表中插入一条记录。如果执行成功,将输出受影响的行数;如果遇到重复键异常,将输出插入失败的提示信息。