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

时间:2011-09-07 03:20:28

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

如果你能帮助我,我试图更新一个具有唯一约束的表,该约束在所有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; 
}

提前致谢

3 个答案:

答案 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定义为表格中的主键,并且已经有一个具有相同值的记录,并且该记录您作为参数传递的conferenceTrack_ID

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

答案 2 :(得分:0)

您必须在数据库中查找该约束的定义,它将告诉您要查找的列,如果您有Sql Management Studio或类似的东西,请打开数据库,展开该表并查看约束,右键单击并查看UK_conferenceRole约束的定义,如果您更新问题并在此处发布,将更容易为您提供帮助