[英]SQL update command with unique constraint asp.net
如果您能帮助我,我将尝试更新具有唯一约束的所有四个键( Role_ID, Track_ID, Person_ID, Conference_ID
)的表。
为什么我不能更新它?
错误:
描述:执行当前Web请求期间发生未处理的异常。 请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。
异常详细信息:System.Data.SqlClient.SqlException:违反UNIQUE KEY约束'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;
}
提前致谢
您的代码应如下所示-一定要避免只将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)
。 这就是唯一约束的全部要点:防止这种情况发生。 因此,请检查您的表-您的表中必须已经有一个条目,该条目的四个值与您试图将该行更新为...的值相同。
您Role_ID
和/或Person_ID
定义为表中的主键,并且已经有一条具有相同值的记录,并且该记录已不 Track_ID
您要作为参数传递的conference
和Track_ID
记录。
另外,您的SQL语句容易受到SQL注入攻击。 最好参数化您的查询。
您必须在数据库上查找该约束的定义,它将告诉您要查找的列,如果您具有Sql Management Studio或类似的东西,请打开数据库,展开该表并在约束下查看,右键单击并查看UK_conferenceRole约束的定义,如果您更新问题并将其发布在此处,将更容易为您提供帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.