Я разрабатываю веб-приложение ASP.NET MVC с помощью SQL Server.
Я пытаюсь ВСТАВИТЬ новую запись в мою базу данных, и я не понимаю, что я делаю неправильно.
Я получаю исключение в строке:
command.ExecuteNonQuery();
Код:
try
{
SqlConnection connection = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=UniversityManager;Integrated Security=True");
using (connection)
{
//SqlCommand command = new SqlCommand(
// "INSERT INTO Students VALUES(@Id, @Name, @Surname, @Year, @PhoneNumber, @Cnp);",
// connection);
connection.Open();
String sql = "INSERT INTO Students(Id,Name,Surname,Year,PhoneNumber,Cnp) " +
"VALUES (@Id, @Name, @Surname, @Year, @PhoneNumber, @Cnp)";
SqlCommand command = new SqlCommand(sql, connection);
command.Parameters.Add("@Id", SqlDbType.Int);
command.Parameters["@Id"].Value = 5;
command.Parameters.Add("@Name", SqlDbType.VarChar);
command.Parameters["@Name"].Value = collection.Name;
command.Parameters.Add("@Surname", SqlDbType.VarChar);
command.Parameters["@Surname"].Value = collection.Surname;
command.Parameters.Add("@Year", SqlDbType.Int);
command.Parameters["@Year"].Value = collection.Year;
command.Parameters.Add("@PhoneNumber", SqlDbType.VarChar);
command.Parameters["@PhoneNumber"].Value = collection.PhoneNumber;
command.Parameters.Add("@Cnp", SqlDbType.VarChar);
command.Parameters["@Cnp"].Value = collection.Cnp;
command.ExecuteNonQuery();
connection.Close();
}
return RedirectToAction("Index");
}
catch
{
return View();
}
}
Спасибо!
YEAR - зарезервированное ключевое слово для Sql Server. Итак, если у вас действительно есть столбец с этим именем, тогда вам нужно заключить его в квадратные скобки каждый раз, когда вы ссылаетесь на него. Лучше измените это имя
String sql = "INSERT INTO Students(Id,Name,Surname,[Year],PhoneNumber,Cnp) " +
"VALUES (@Id, @Name, @Surname, @Year, @PhoneNumber, @Cnp)";
Другая возможность - столбец Id
. Если этот столбец имеет свойство IDENTITY
равное true, то вы не должны устанавливать для него значение. Он автоматически рассчитывается механизмом базы данных.
Если вы посмотрите на сообщение innerexception, кажется, проблема связана с тем, что один или несколько параметров содержат больше текста, чем разрешено размером поля базы данных.
Вы можете попробовать что-то вроде этого (для каждого параметра varchar)
// Assuming the Name field is defined as varchar(15)
command.Parameters.Add("@Name", SqlDbType.VarChar, 15);
command.Parameters["@Name"].Value = collection.Name;
String or binary data would be truncated
исключение означает, что вы пытаетесь вставить значение, которое слишком велико для одного из столбцов в таблице Student. Например, поле " Name
имеет максимальную длину 10, но вы пытаетесь вставить 15-значное имя.
Проверьте значения, которые вы вставляете, и посмотрите, слишком ли они для столбцов.