【问题标题】:SQL update command with unique constraint asp.net具有唯一约束 asp.net 的 SQL 更新命令
【发布时间】:2011-09-07 03:20:28
【问题描述】:

如果您能帮帮我,我正在尝试更新具有唯一约束的表,该约束位于所有 4 个键 (Role_ID, Track_ID, Person_ID, Conference_ID) 上。

为什么不能更新?

错误:

描述:执行过程中发生了未处理的异常 当前的网络请求。请查看堆栈跟踪以获取更多信息 有关错误的信息以及它在代码中的来源。

异常详细信息:System.Data.SqlClient.SqlException:违反 唯一键约束“UK_conferenceRole”。无法插入重复键 在对象“dbo.ConferenceRole”中。声明已终止。

代码:

var sqlCon7 = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString);
string query7 = @"update ConferenceRole set Role_ID =" + 3 + ",Person_ID='" + idp + "'where Conference_ID ='" + conference + "'and Track_ID='" + TrackId + "'";

SqlCommand cmd7 = new SqlCommand(query7, sqlCon7);
cmd7.CommandType = CommandType.Text;

try
{
    sqlCon7.Open();
    cmd7.ExecuteNonQuery();
    sqlCon7.Close();
}
catch (Exception ee) 
{ 
    throw ee; 
}

提前致谢

【问题讨论】:

  • 首先,请停止直接使用ADO.NET,至少使用类似这个库的东西abstractsql.codeplex.com
  • 请,请,停止使用字符串连接来构建 sql 查询!您已经在使用 SqlCommand 对象,所以也要使用参数!

标签: c# asp.net sql sql-server


【解决方案1】:

您的代码应该如下所示 - 无论如何,避免只是将您的 SQL 语句串在一起!(这是 SQL 注入的大门!)。此外,对于 ADO.NET,您应该将您的连接和命令放入 using-blocks 中,以确保在不再需要时正确处理它们:

// define/read connection string and SQL statement
string connectionString = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
string sqlStatement = "UPDATE ConferenceRole SET Role_ID = @RoleID, " +
                      "Person_ID = @PersonID, " + 
                      "WHERE Conference_ID = @ConferenceID AND Track_ID = @TrackID";

// put your SqlConnection and SqlCommand into using blocks!
using(SqlConnection _con = new SqlConnection(connectionString))
using(SqlCommand _cmd = new SqlCommand(sqlStatement, _con))
{
   // define and set parameter values
   _cmd.Parameters.Add("@RoleID", SqlDbType.INT).Value = 3;
   _cmd.Parameters.Add("@PersonID", SqlDbType.INT).Value = idp;
   _cmd.Parameters.Add("@ConferenceID", SqlDbType.INT).Value = conference;
   _cmd.Parameters.Add("@TrackID", SqlDbType.INT).Value = trackId;

   // execute query 
   _con.Open();
   _cmd.ExecuteNonQuery();
   _con.Close();
}

这里的构造:

catch (Exception ee) 
{ 
    throw ee; 
}

绝对没有意义 - 它所做的只是破坏调用堆栈,例如您将无法再看到异常的真正来源 - 只需将其全部放在一起,或者如果必须 - 使用

catch (Exception ee) 
{ 
    throw;   // **DO NOT** specify the 'ee' exception object here! 
}

错误表明您正在尝试在表中创建一个重复条目 - 一个具有已存在的 (Role_ID, Track_ID, Person_ID, Conference_ID) 组合的条目。这就是唯一约束的全部意义:防止这种情况发生。因此,请检查您的表格 - 您的表格中必须已经有一个条目,该条目的四个值与您尝试将这一行更新为的值相同....

【讨论】:

    【解决方案2】:

    您将Role_ID 和/或Person_ID 定义为表中的主键,并且已经存在具有相同值的记录,并且该记录不是带有conference 的记录和Track_ID你作为参数传入

    您的 SQL 语句也容易受到 SQL 注入攻击。最好将您的查询参数化。

    【讨论】:

      【解决方案3】:

      您必须在数据库中查找该约束的定义,它会告诉您要查找哪些列,如果您有 Sql Management Studio 或类似的东西,请打开您的数据库,展开该表并查看约束,右键查看UK_conferenceRole约束的定义,如果你更新你的问题并在这里发布,它会更容易帮助你

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多