如何处理违反asp.net中的主键约束?

时间:2013-06-01 21:56:02

标签: asp.net database

我有一个登录页面,用户有ID,ID是表中的主键。我还有一个管理员帐户,管理员可以创建用户。但是当我创建具有现有ID的用户帐户时,网页崩溃了。我想处理这种情况并发出警告,指出此ID存在且无法创建。这是我的代码:

  public void CreateStudent(int ID, String status, String email, String firstName, String lastName, String password, String level, String program)
{
    SqlConnection con = new SqlConnection(GetConnectionString());


    string query1 = "insert into StudentTable(Name,Surname,ID,email,level,program,status,password,Type) values(@firstName,@lastName,@ID,@email,@level,@program,@status,@password,'Student')";


    SqlCommand command = new SqlCommand(query1,con);

    command.Parameters.AddWithValue("@firstName", firstName);
    command.Parameters.AddWithValue("@lastName", lastName);
    command.Parameters.AddWithValue("@ID", ID);
    command.Parameters.AddWithValue("@email", email);
    command.Parameters.AddWithValue("@level", level);
    command.Parameters.AddWithValue("@program", program);
    command.Parameters.AddWithValue("@status", status);
    command.Parameters.AddWithValue("@password", password);

    int result;
    con.Open();
    result = command.ExecuteNonQuery();
    con.Close();


}

任何人都可以帮我吗? Thanls

3 个答案:

答案 0 :(得分:1)

有多种方法。您可以捕获异常并显示错误消息。这也有助于其他错误情况,例如丢失连接。

但是,如果您希望在正常操作期间出现这种情况,则应该在没有异常的情况下处理该情况。一种方法是让您的insert仅插入一行新的id

insert  YourTable
        (id, col1, col2, ...)
select  @id
,       @col1
,       @col2
,       ...
where   not exists
        (
        select  *
        from    YourTable
        where   id = @id
        )

将参数传递给您的查询,如:

command.Parameters.AddWithValue("@id", 42);
command.Parameters.AddWithValue("@col1", "value1");
command.Parameters.AddWithValue("@col2", "value2");

现在ExecuteNonQuery()返回受影响的行数。您可以使用它来检查insert是否实际向表中添加了新行:

var result = command.ExecuteNonQuery();
if (result == 1)
{
    lblResult.Text = "New row inserted!";
    lblResult.Color = Color.Green;
}
else
{
    lblResult.Text = "Failed to insert new row.";
    lblResult.Color = Color.Red;
}

答案 1 :(得分:0)

不是试图处理尝试添加具有相同ID的用户而返回的错误,而是最好首先检查用户是否存在,如果可以,只创建新帐户。虽然您仍然需要处理异常以满足两个人尝试创建相同记录的情况。

所以你有以下SQL:

select * from StudentTable where ID = @newID

如果找到记录,您可以报告错误。如果找不到任何内容,那么您可以继续创建新记录。

虽然如果您使用ID作为主键,最好将其作为表中的Identity列,并在创建新行时自动增加。您仍然需要检查学生是否已经存在 - 使用电子邮件作为人类可读的唯一性条件。

如果您在电子邮件列中添加唯一性约束,那么您将能够捕获两个人尝试创建相同记录的情况。

答案 2 :(得分:0)

我已将电子邮件属性作为主键,然后检查数据库是否存在相同的电子邮件