如果你能帮助我,我试图更新一个具有唯一约束的表,该约束在所有4个键上(Role_ID, Track_ID, Person_ID, Conference_ID
)。
为什么我不能更新它?
错误:
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息: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;
}
提前致谢
答案 0 :(得分:2)
你的代码应该是这样的 - 无论如何,避免只是将你的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)
已存在。这就是唯一约束的全部要点:防止这种情况发生。因此,请检查您的表格 - 您的表格中必须已有一个条目与您尝试将此行更新为相同的四个值....
答案 1 :(得分:1)
您已将Role_ID
和/或Person_ID
定义为表格中的主键,并且已经有一个具有相同值的记录,并且该记录不您作为参数传递的conference
和Track_ID
此外,您的SQL语句容易受到SQL注入攻击。最好参数化您的查询。
答案 2 :(得分:0)
您必须在数据库中查找该约束的定义,它将告诉您要查找的列,如果您有Sql Management Studio或类似的东西,请打开数据库,展开该表并查看约束,右键单击并查看UK_conferenceRole约束的定义,如果您更新问题并在此处发布,将更容易为您提供帮助