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

问题描述:

如果您请帮我解决问题,我正尝试使用所有4个键(Role_ID, Track_ID, Person_ID, Conference_ID)上的唯一约束来更新表。具有唯一约束条件的SQL更新命令asp.net

为什么我不能更新它?

错误:

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.SqlClient.SqlException: Violation of UNIQUE KEY constraint 'UK_conferenceRole'. Cannot insert duplicate key in object 'dbo.ConferenceRole'. The statement has been terminated.

代码:

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; 
} 

在此先感谢

+1

首先,请停止直接使用ADO.NET ,至少使用像这样的库http://abstractsql.codeplex.com – BlackTigerX

+2

请,请停止使用字符串连接来建立SQL查询!你已经使用了一个SqlCommand对象,所以也使用参数! –

您的代码应该看起来像这样 - 通过所有方法,避免只需将你的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! 
} 

什么错误说,你想创建一个副本进入表 - 一个组合(Role_ID, Track_ID, Person_ID, Conference_ID)已经存在。这就是独特约束的要点:防止这种情况发生。因此,请检查您的表格 - 您的表格中必须已经有与您尝试更新此行的值相同的四个值。

您定义Role_ID和/或Person_ID在你的表的主键,已经有与记录相同的值和记录是不是conferenceTrack_ID你正在通过参数

另外你的SQL语句很容易出现SQL注入攻击。最好是参数化你的查询。

您必须查看数据库中关于该约束的定义,它会告诉您要查找哪些列(如果您拥有Sql Management Studio或类似的东西),请打开数据库,展开该表并查看约束,右键单击并查看UK_conferenceRole约束的定义,如果您更新问题并在此处发帖,则会更容易帮助您