2015-09-04 1 views
0

Использование MVC 2, MySQLПрием "Duplicate enty для первичного ключа"

public ActionResult Register() 
    {   
     string name = Request.Form["name"]; 
     string password = Request.Form["password"]; 

     ViewData["name"] = name; 
     ViewData["password"] = password; 
     // Pasa los datos al ViewData, hace el insert 
     MySqlCommand cmd = new MySqlCommand("INSERT INTO tbl_alumnos(Nombre, Apellido) values('"+name+"','"+password+"')", cn); 
     try 
     { 
      // Intenta conectarse e insertar los datos 
      cn.Open(); 
      cmd.ExecuteNonQuery(); 
      return View("~/Views/Inicial/Inicial.aspx"); 
     } 
     catch (Exception ex) 
     { 
      // si no puede, error 
      ViewData["ex"] = ex; 
      System.Diagnostics.Debug.WriteLine(ex); 
      return View("Error"); 
     } 
    } 

Это мой код из контроллера И мой код ошибки:

Lo sentimos; se produjo un error al procesar la solicitud. MySql.Data.MySqlClient.MySqlException (0x80004005): Дублировать запись '' для ключа 'PRIMARY' на MySql.Data.MySqlClient.MySqlStream.ReadPacket() в MySql.Data.MySqlClient.NativeDriver.GetResult (Int32 & affectedRow, Int64 & insertId) в MySql.Data.MySqlClient.Driver.GetResult (Int32 statementId, Int32 & affectedRows, Int64 & insertedId) в MySql.Data.MySqlClient.Driver.NextResult (Int32 statementId, Boolean force) в MySql.Data.MySqlClient.MySqlDataReader.NextResult() в MySql.Data.MySqlClient.MySqlCommand.ExecuteReader (поведение CommandBehavior) в MySql.Data.MySqlClient.MySqlCommand.ExecuteReader() в MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery() в MvcApplication1.Controllers.ValidarController.Register() в E: \ Proyecto \ TestsDByAjax \ MvcApplication1 \ Controllers \ ValidarController.cs: строка 61

линия 61 говорит cmd.ExecuteNonQuery()

+0

Во-первых, пожалуйста, не храните пароли в открытом виде. Это приложение может быть только тем, с чем вы учитесь, и, возможно, никогда не введете его в производство, но быстро сломайте эту очень плохую привычку. Во-вторых, дезинфицируйте свои входы. Используйте параметры, а не создавайте операторы SQL путем конкатенации, чтобы избежать инъекции SQL. Наконец, я предполагаю, что «Nombre» является вашим основным ключом, и поэтому вы пытаетесь вставить дубликат, следовательно, сообщение об ошибке на этот счет. –

+0

Да, это тестовое приложение, мм, у меня есть первичный ключ под названием DNI, а не Nombre. – MiGu3X

+0

Вы помещаете значение в 'DNI'? Уникальный для каждой записи? –

ответ

0

Я имею в виду, у меня есть ответ уже, что это неправильно, я просто не знаю, что вы хотите с ним делать?

"INSERT INTO tbl_alumnos(Nombre, Apellido) values('"+name+"','"+password+"')" 

В приведенном выше утверждении вы вставляете имя и пароль в таблицу. И вы утверждаете, что другое поле, а именно DNI, является основным ключом в таблице. Вы, очевидно, ничего не вставляете в DNI. Если поле DNI имеет идентификационную вставку, вы не имеете проблемы с вышеприведенным утверждением. Но вы, вероятно, этого не делаете, и поэтому он жалуется. Итак, если вы поставите уникальные DNI, вы будете в порядке

+0

"INSERT INTO tbl_alumnos (DNI, Nombre, Apellido) значения ('" + DNI + "', '" + name + "', '" + password + "')" // сделал это, поскольку DNI является первичным ключом и ему необходимо иметь ценность! :) – MiGu3X

+0

Да @ MiGu3X Но в современных системах, все больше и больше, вы видите семя идентичности как значение PK и уникальный ключ в каком-то специальном поле. Например, 'pkUsers, userName'. 'pkUsers' будет использоваться для соединений. Например, в таблице 'Log' у вас будет поле' LoggedBy'. 'LoggedBy' будет внешним ключом к' pkUsers'. Это поле будет иметь автоматически генерируемый последовательный номер в нем, как 1,2,3 ... В то время как 'userName' будет иметь уникальный ключ, так что у двух пользователей не будет одинакового имени. И он не будет использоваться в соединениях, только в разделе 'Where'. Здесь вы можете позволить системе создать свой ПК, если сможете. Тогда утверждение без DNI w –

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