Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有唯一约束asp.net的SQL update命令_C#_Asp.net_Sql_Sql Server - Fatal编程技术网

C# 具有唯一约束asp.net的SQL update命令

C# 具有唯一约束asp.net的SQL update命令,c#,asp.net,sql,sql-server,C#,Asp.net,Sql,Sql Server,如果您能帮我一个忙,我正在尝试用一个唯一的约束更新一个表,该约束位于所有4个键上(角色ID、跟踪ID、人员ID、会议ID) 为什么我不能更新它 错误: 描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源 异常详细信息:System.Data.SqlClient.SqlException:违反 唯一关键约束“UK_conferenceRole”。无法插入重复的密钥 在对象“dbo.ConferenceRole”中。声明已终止 代码:

如果您能帮我一个忙,我正在尝试用一个唯一的约束更新一个表,该约束位于所有4个键上(
角色ID、跟踪ID、人员ID、会议ID

为什么我不能更新它

错误:

描述:在执行过程中发生未处理的异常 当前的web请求。请查看堆栈跟踪以了解更多信息 有关错误的信息及其在代码中的来源

异常详细信息:System.Data.SqlClient.SqlException:违反 唯一关键约束“UK_conferenceRole”。无法插入重复的密钥 在对象“dbo.ConferenceRole”中。声明已终止

代码:


提前感谢

您将
角色ID
和/或
个人ID
定义为表中的主键,并且已经有一条记录具有相同的值,并且该记录不是作为参数传递的
会议
跟踪ID
的记录


您的SQL语句也容易受到SQL注入攻击。最好对查询进行参数化。

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

您的代码应该是这样的-无论如何,避免将SQL语句串在一起(这为SQL注入打开了大门!)。此外,使用ADO.NET,您应该将连接和命令放入使用块中,以确保在不再需要时正确处理它们:

// 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! 
}

错误说明您试图在表中创建一个重复的条目,该条目的组合
(角色ID、曲目ID、人物ID、会议ID)
已经存在。这就是唯一约束的全部要点:防止这种情况发生。因此,请检查您的表-您的表中必须已经有一个条目,该条目的四个值与您试图将此行更新为的条目的四个值相同。…

首先,请停止直接使用ADO.NET,至少使用类似于此库的内容请,请停止使用字符串连接来生成sql查询!!您已经在使用SqlCommand对象,所以也要使用参数!
catch (Exception ee) 
{ 
    throw;   // **DO NOT** specify the 'ee' exception object here! 
}