具有唯一约束的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注入的大门打开器!)还有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
作为表中的主键,并且已经有一个具有相同值的记录,该记录是而不是,您将conference
和Track_ID
作为参数传入
你的SQL语句也容易受到SQL注入攻击。最好对查询进行参数化。
你需要在数据库中查找约束的定义,它会告诉你要查找哪些列,如果你有Sql Management Studio或类似的工具,打开数据库,展开表格查看约束,右键单击查看UK_conferenceRole约束的定义,如果你更新问题并在这里发布,它会更容易帮助你