繁体   English   中英

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

[英]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您要作为参数传递的conferenceTrack_ID记录。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM