2013-06-01 2 views
1

У меня есть страница входа, у пользователей есть идентификаторы, а ID - первичный ключ в таблице. У меня также есть учетная запись администратора, и администратор может создавать пользователей. Но когда я создаю учетную запись пользователя с существующим идентификатором, веб-страница выходит из строя. Я хочу обработать эту ситуацию и дать предупреждение о том, что этот идентификатор существует и не может быть создан. Вот мой код:Как справиться с нарушением ограничений первичного ключа в asp.net?

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

+4

Непосредственный ответ, пожалуйста, пожалуйста, пожалуйста, изучите и ** используйте ** терминированные запросы **, особенно **, так как вы разрабатываете веб-приложение. Ваш код как есть широко открыт для SQL Injection. – Tim

+0

Чтобы получить более прямой ответ на ваш вопрос, я бы использовал хранимую процедуру для вставки. SP проверит наличие существующего идентификатора, и если он найдет один возвращаемый код, указывающий, что идентификатор уже существует, в противном случае он завершит вставку. – Tim

+0

@ Тит, что я слышал одно и то же много раз, можете ли вы написать тот же запрос, что и параметризованный запрос, чтобы я мог понять, как его использовать? – yrazlik

ответ

0

Я сделал атрибут электронной почты в качестве первичного ключа, а затем проверил базу данных, существует ли тот же адрес электронной почты и

+0

. Какое это имеет отношение к оригинальному вопросу? Модификация первичного ключа таким образом - БОЛЬШАЯ ДЕЛА. Я не понимаю твое решение. – OzrenTkalcecKrznaric

0

Вместо того чтобы связываться с обработкой ошибки, возникающей при попытке добавить пользователя с тем же идентификатором, было бы лучше сначала проверить наличие пользователя и создать новую учетную запись, если сможете. Хотя вам все равно нужно обработать исключение, чтобы удовлетворить случай, когда два человека пытаются создать одну и ту же запись.

Таким образом, вы бы иметь следующий SQL:

select * from StudentTable where ID = @newID 

и если это нашли запись вы можете сообщить об ошибке. Если он ничего не найдет, вы можете пойти вперед и создать новую запись.

Хотя, если вы используете идентификатор в качестве первичного ключа, было бы лучше иметь это как столбец Identity на столе и автоматически увеличивать его при создании новой строки. Вам все равно нужно проверить, существует ли студент, - используйте электронную почту как условие удобочитаемости человека.

Если вы добавите ограничение уникальности в столбец электронной почты, вы сможете уловить случай двух людей, пытающихся создать одну и ту же запись.

+0

Это игнорирует параллелизм. Другой пользователь может создать один и тот же идентификатор после выбора, но перед вставкой. Исключение вставки следует обрабатывать в любом случае, даже если выбор сделан для лучшего удобства пользователя. –

+0

@BrankoDimitrijevic - это действительно так. – ChrisF

1

Существует несколько способов. Вы можете поймать исключение и отобразить сообщение об ошибке. Это также поможет в других сценариях ошибок, таких как потерянное соединение.

Однако, если это ситуация, которую вы ожидаете при нормальной работе, вы должны обращаться с ситуацией без исключения. Один из способов сделать это, чтобы ваш insert только вставить строку с новым id:

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

параметры Pass на ваш запрос как:

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

Спасибо, но я новичок в asp.net и не знаю, как использовать параметризованные запросы, поэтому у меня есть вопрос о вашем ответе: есть ли вставка ... где не существует ... оператор строковой переменной? – yrazlik

+0

Да, вы должны сохранить этот запрос в виде строки в 'command.CommandText'. '@ Varname' - это параметры, которые, среди прочего, защитят вас от SQL-инъекции. – Andomar

Смежные вопросы