2016-08-19 3 views
-3

Я хочу, чтобы пользователь вводил все данные, которые отображаются (столбцы из базы данных), заполнять их и отправлять. Но я не могу заставить свой код работать, что я сделал неправильно здесь? Я получаю ошибку:Создайте запись в базе данных SQL Server с помощью HTML-помощника MVC

System.Data.SqlClient.SqlException: Incorrect syntax near 'Contact'.

Модель:

namespace Project.Models 
{ 
    public class Contact 
    { 
     public int Id { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public string Email { get; set; } 
     public int Phone { get; set; } 
     public int CompanyID { get; set; } 
    } 
} 

Вид:

@model Project.Contact 

<h2>Create Contact</h2> 

<table> 
    <tr> 
     <th>First name</th> 
     <th>Last name</th> 
     <th>Email</th> 
     <th>Phone</th> 
    </tr> 
    <tr> 
     <td>@Html.TextBoxFor(m => m.FirstName)</td> 
     <td>@Html.TextBoxFor(m => m.LastName)</td> 
     <td>@Html.TextBoxFor(m => m.Email)</td> 
     <td>@Html.TextBoxFor(m => m.Phone)</td> 
    </tr> 
    @Html.HiddenFor(m => m.Id) 
    @Html.HiddenFor(m => m.CompanyID) 
</table> 
<br /> 
@using (Html.BeginForm()) 
{ 
    <input type="button" name="button" class="button1" value="Create" /> 
} 

Контроллер:

using Project.Models; 
using System.Collections.Generic; 
using System.Data.SqlClient; 
using System.Web.Mvc; 

namespace Project.Controllers 
{ 
    public class HomeController : Controller 
    { 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     public ActionResult Create(List<Contact> model) 
     { 
      string query = "INSERT INTO Contact"; 

      using (var connection = new SqlConnection(@"Data Source=.\SQLExpress;Initial Catalog=Sublime;Integrated Security=True")) 
      { 
       using (var command = new SqlCommand(query, connection)) 
       { 
        connection.Open(); 

        using (var dr = command.ExecuteReader()) 
        { 
         if (dr.HasRows) 
         { 
          while (dr.Read()) 
          { 
           var contact = new Contact(); 
           contact.Id = dr.GetInt32(dr.GetOrdinal("Id")); 
           contact.FirstName = dr.GetString(dr.GetOrdinal("FirstName")); 
           contact.LastName = dr.GetString(dr.GetOrdinal("LastName")); 
           contact.Email = dr.GetString(dr.GetOrdinal("Email")); 
           contact.Phone = dr.GetInt32(dr.GetOrdinal("Phone")); 
           contact.CompanyID = dr.GetInt32(dr.GetOrdinal("CompanyID")); 
           model.Add(contact); 
          } 
         } 
        } 
       } 
      } 

      return View(model); 
     } 
    } 
} 

Я также не уверен, что мои TextBoxes правильно подключены к моему действию ...

+4

Существует много плохого кода. Вам нужно попасть в некоторые учебники и изучить некоторые базовые T-SQL, а также ASP.NET MVC, прежде чем у вас будет какая-либо деловая публикация на SO. – Jakotheshadows

+3

Узнайте, как [Заявление о вводе SQL Server] (https://technet.microsoft.com/en-us/library/dd776381 (v = sql.105) .aspx) работает первым. – ekad

+0

Что в этом плохого? – Malphai

ответ

1

Вы используете ExecuteReader, который является методом получения данных, пытаясь выполнить вставку.

Вместо этого вам необходимо использовать ExecuteNonQuery; и наилучшей практикой является добавление данных через параметры.

Вторая проблема заключается в том, что ваша команда INSERT не завершена.

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

https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.executenonquery(v=vs.110).aspx

public ActionResult Create(List<Contact> model) 
    { 
     string query = "INSERT INTO Contact (Id, FirstName, LastName, Email, " 
        + "Phone, CompanyId) values (@Id,@FirstName,@LastName" 
        + ",@Email,@Phone,@CompanyID)"; 

     using (var connection = new SqlConnection(@"Data Source=.\SQLExpress;Initial Catalog=Sublime;Integrated Security=True")) 
     { 
      connection.Open(); 
      foreach(Contact modelElement in model) 
      { 
       SqlCommand command = new SqlCommand(queryString, connection); 
       command.Parameters.AddWithValue("@Id", modelElement.Id); 
       command.Parameters.AddWithValue("@FirstName", modelElement.FirstName); 
       command.Parameters.AddWithValue("@LastName", modelElement.LastName); 
       command.Parameters.AddWithValue("@Email", modelElement.Email); 
       command.Parameters.AddWithValue("@Phone", modelElement.Phone); 
       command.Parameters.AddWithValue("@CompanyID", modelElement.CompanyID); 
       command.ExecuteNonQuery(); 
      } 
     } 
    } 
+0

Я пробовал свой код, я получаю «System.NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта» – Malphai

+3

Не используйте '?' В качестве заполнителей параметров для SQL Сервер - используйте * named * параметры, такие как '@ Id',' @ FirstName' и т. Д. В вашем заявлении SQL-запроса –

+0

Malphai, где вы получили исключение? (Строка) –