C# 具有唯一约束asp.net的SQL update命令
如果您能帮我一个忙,我正在尝试用一个唯一的约束更新一个表,该约束位于所有4个键上(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”中。声明已终止 代码:
角色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!
}