具有唯一约束的SQL更新命令

本文关键字:SQL 更新 命令 约束 唯一 | 更新日期: 2023-09-27 18:07:42

如果你能帮助我,我正试图更新一个表与一个唯一的约束,这是在所有4个键(Role_ID, Track_ID, Person_ID, Conference_ID)。

为什么我不能更新它?

错误:

描述:在执行过程中发生未处理的异常当前的web请求。请查看堆栈跟踪了解更多信息有关错误及其在代码中的起源的信息。

异常详细信息:System.Data.SqlClient.SqlException: Violation of唯一键约束'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; 
}

Thanks in advance

具有唯一约束的SQL更新命令

您的代码应该看起来像这样-无论如何,避免只是将SQL语句串在一起!(这是SQL注入的大门打开器!)还有ADO。. NET中,您应该将连接和命令放入using-block中,以确保它们在不再需要时得到正确处理:

// 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)。这就是唯一约束的全部意义:防止这种情况发生。检查一下表,表中必须有一个条目它的四个值与要更新这一行的值相同....

您定义了Role_ID和/或Person_ID作为表中的主键,并且已经有一个具有相同值的记录,该记录是而不是,您将conferenceTrack_ID作为参数传入

你的SQL语句也容易受到SQL注入攻击。最好对查询进行参数化。

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