2013-09-19 2 views
3

в моем проекте Я установил имя клиента как первичный ключ, и если я введу то же значение, я получу исключение, теперь я хочу написать подтверждение, то есть, если я повторно введите значение первичного ключа, тогда я должен получить сообщение как «Data уже существует», Пожалуйста, помогите мне сделать это, код, я использую для вставки значения является:Как избежать ввода повторяющихся значений в таблицу через winform?

 private void btnInsert_Click(object sender, EventArgs e) 
     { 
     if (txtName.Text == string.Empty) 
     { 
      MessageBox.Show("Please enter a value to Project Name!"); 
      txtName.Focus(); 
      return; 
     } 
     if (txtContactPerson.Text == string.Empty) 
     { 
      MessageBox.Show("Please enter a value to Description!"); 
      txtContactPerson.Focus(); 
      return; 
     } 
     SqlConnection con = Helper.getconnection(); 
     con.Open(); 
     string commandText = "InsertClient"; 
     SqlCommand cmd = new SqlCommand(commandText, con); 
     cmd.Parameters.AddWithValue("@Name", txtName.Text); 
     cmd.Parameters.AddWithValue("@ContactPerson", txtContactPerson.Text); 
     cmd.CommandType = CommandType.StoredProcedure; 
     MessageBox.Show("Client details are inserted successfully"); 
     txtName.Clear(); 
     txtContactPerson.Clear(); 
     object Name = cmd.ExecuteNonQuery(); 
     con.Close(); 
     BindData();    
    } 
+0

Какое сообщение об ошибке вы получаете? – user2749421

+0

Ваша процедура 'InsertClient' не содержит никакого« первичного ключа », похоже, что« первичный ключ »автоматически увеличивается, например, используя' auto_increment'? В противном случае, каков фактический «первичный ключ» в вашей вставленной записи? –

+0

Имя клиента - это первичный ключ. Автоинкремент устанавливается на идентификатор клиента другого объекта, который не является первичным ключом. –

ответ

2

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

try 
{ 
    object Name = cmd.ExecuteNonQuery(); 
    MessageBox.Show("Client details are inserted successfully"); 
    txtName.Clear(); 
    txtContactPerson.Clear(); 
    BindData(); 
} 
catch(Exception ex) 
{ 
    //Handle exception, Inform User 
} 
finally 
{ 
    con.Close(); 
}  
1

Я предпочитаю использовать Entity Framework, как он будет бросать исключение в этом случае, однако, я полагаю, вы можете запустить sql-запрос сначала, чтобы проверить, существует ли он или нет, или хотя может быть значительная служебная нагрузка с этим

+0

Прошу прощения, это невозможно проверить с SQL-сервера, обычно у клиента нет доступа к базе данных, он может только знать, что это первичный ключ, когда он получает эту ошибку. Требование Mt - клиент должен получить валидацию или исключение во время выполнения только до ввода на кнопку вставки. –

+1

Извините, я не имел в виду, что клиент должен проверить, я имел в виду sqlcmd, который ищет таблицу на этом первичном ключе, тогда вы можете проверить, были ли возвращены какие-либо строки, и если это так бросает ваше собственное исключение. (должно быть, было более ясно! :-)) –

+0

Да, спасибо. Я попробую это. –

3

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

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

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

private void btnInsert_Click(object sender, EventArgs e) 
    { 
    if (txtName.Text == string.Empty) 
    { 
     MessageBox.Show("Please enter a value to Project Name!"); 
     txtName.Focus(); 
     return; 
    } 
    if (txtContactPerson.Text == string.Empty) 
    { 
     MessageBox.Show("Please enter a value to Description!"); 
     txtContactPerson.Focus(); 
     return; 
    } 
    SqlConnection con = Helper.getconnection(); 
    con.Open(); 
    string commandText = "InsertClient"; 
    SqlCommand cmd = new SqlCommand(commandText, con); 
    cmd.Parameters.AddWithValue("@Name", txtName.Text); 
    cmd.Parameters.AddWithValue("@ContactPerson", txtContactPerson.Text); 
    cmd.CommandType = CommandType.StoredProcedure; 

try 
{ 
    object Name = cmd.ExecuteNonQuery(); 
    MessageBox.Show("Client details are inserted successfully"); 
    txtName.Clear(); 
    txtContactPerson.Clear(); 
    BindData(); 
} 
catch(Exception ex) 
{ 
     //Handle exception, Inform User 
} 
finally 
{ 
     con.Close(); 
}  
} 
+1

Я не получаю ошибку, но после ввода двойного значения сначала я получаю MessageBox.Show («Детали клиента вставлены успешно»); а затем «Deails уже существующее сообщение», которое я ввел в блок catch. –

+0

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

2

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

вы могли бы проверить наличие записей и вставить или обновить вручную:

create procedure MyProcedure 
(
    @Name nvarchar(100), 
    ... 
) 
as 

    if not exists (select * from MyTable where Name = @Name) 
    begin 
     insert into MyTable (Name,...) values (@Name,...) 
    end 
    else 
    begin 
      update MyTable 
      set ... 
      where Name = @Name 
    end 
Смежные вопросы