Не удалось вставить данные в SQL Server 2014 с помощью Asp.net MVC4

#asp.net-mvc-4

#asp.net-mvc-4

Вопрос:

Я совершенно новичок в .net, я попытался перейти по следующей ссылке

https://www.youtube.com/watch?v=WLD6DvLI35Yamp;list=PLx7nFxMa-ZcIz2VBKC8FyMjQNmlIvrAi9

но, как и во втором видео, не добавляя данные в базу данных. Я не могу найти ошибку. Я использую VS Express 2012, ASP.NET MVC4 и SQL Server 2014.

Вот мой код:

Index.cshtml

 @model MyApp.Models.StudentModel

@{
ViewBag.Title = "Index";
}

<h2>Hi @ViewBag.message</h2>
@using (Html.BeginForm("SaveDataStudent", "Student", new { @id = "Form" },  FormMethod.Post))
{
@Html.ValidationSummary();
@Html.AntiForgeryToken();`

@Html.LabelFor(m=>m.productname)
@Html.TextAreaFor(m=>m.productname)
@Html.ValidationMessageFor(m => m.productname)

@Html.LabelFor(m=>m.quantity)
@Html.TextAreaFor(m=>m.quantity)
@Html.ValidationMessageFor(m => m.quantity)

@Html.LabelFor(m=>m.price)
@Html.TextAreaFor(m=>m.price)
@Html.ValidationMessageFor(m => m.price)

 <input type="submit" value ="Save" name ="Save" />

 }
 @section Scripts{
    @Scripts.Render("~/bundles/jqueryval")

}
  

StudentCotroller

 using MyApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace MyApp.Controllers
{
    public class StudentController : Controller
    {
         // GET: /Student/
         protected CodeDB d = new CodeDB();

         public ActionResult Index()
         {
            return View();
         }

         [HttpPost]
         [ValidateAntiForgeryToken]
         public ActionResult SaveDataStudent(StudentModel f) 
         {
             if (ModelState.IsValid)
             {
                 d.Open();
                 int i = d.DataInsert("INSERT INTO tblproduct(productname,price,quantity)VALUES('"   f.productname   "','"   f.price   "','"   f.quantity   "')");

                 //here getting i=0
                 if (i > 0)
                 {
                      ModelState.AddModelError("Success", "Save Success");
                 }
                 else
                 {
                     ModelState.AddModelError("Error", "Save Error");
                 }

                 d.Close();
             }
             else 
             {
                 var errors = ModelState.Values.SelectMany(v => v.Errors);
             }

             return View("Index");
         }
     }
 }
  

CodeDB.cs

  using System;
 using System.Collections.Generic;
 using System.Data.SqlClient;
 using System.Linq;
 using System.Web;
 using System.Web.Configuration;`

 namespace MyApp.Models
 {
     public class CodeDB
     {
        protected SqlConnection con;`

        public bool Open(string Connection = "DefaultConnection")
        {
            con = new     SqlConnection(@WebConfigurationManager.ConnectionStrings[Connection].ToString());

            try
            {
                bool b = true;

                if (con.State.ToString() != "Open")
                {
                    con.Open();
                }

                return b;
             }
             catch (SqlException ex)
             {
                 return false;
             }
        }
        //end Open Connection 

        //close connection
        public bool Close()
        {
            try
            {
                con.Close();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        public int ToInt(Object s)
        {
             try
             {
                 return Int32.Parse(s.ToString());
             }
             catch
             {
                 return 0;
             }
        }

        //Insert Data
        public int DataInsert(String sql)
        {
            int lastID = 0;
            String query = sql   ";SELECT@@Identity;";

            try
            {
               if (con.State.ToString() == "Open")
               {
                    SqlCommand cmd = new SqlCommand(query, con);
                    cmd.ExecuteNonQuery();
                    lastID = this.ToInt(cmd.ExecuteScalar());
                }

                return this.ToInt(lastID);
             }
             catch
             {
                return 0;
             }
          }
        }
     }
}
  

Student.cs

 using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;`

namespace MyApp.Models
{
    public class StudentModel
    {
        [StringLength(5)]
        [Required]
        [Display(Name = "Name:")]
        public string productname { get; set; }`

        [StringLength(3,MinimumLength=2,ErrorMessage="Min 5 max 10")]
        [Required]
        [Display(Name = "Quantitys:")]
        public string quantity { get; set; }

        [Required(ErrorMessage = "Please enter price.")]
        public string price { get; set; }
    }
}
  

Web.config

 <connectionStrings>
    <add name="DefaultConnection" 
         connectionString="Data Source=DESKTOP-VC6FUTVSQLEXPRESS;Initial Catalog=MVC4;Persist Security Info=True;User ID=sa;Password=root" 
         providerName="System.Data.SqlClient" />
</connectionStrings>
  

введите описание изображения здесь

В чем моя ошибка?

Ответ №1:

Я не тестировал это, но я думаю, что вам нужен пробел между SELECT и @@Identity здесь: String query = sql ";SELECT@@Identity;";

Я думаю, вы получаете 0 из блока catch внутри метода DataInsert.

Кроме того, вы выполняете запрос дважды; удалите cmd.ExecuteNonQuery(); .

В качестве дополнительного замечания, возможно, вам захочется пересмотреть способ добавления ошибок в ModelState. Я бы удалил имя свойства из этого оператора ModelState.AddModelError("Error", "Save Error"); , поскольку «Ошибка» не является свойством вашей модели (так что сделайте это ModelState.AddModelError(string.Empty, "Save Error"); ). Вам понадобится сводка проверки в вашем представлении для отображения ошибок, не связанных с свойствами (например, «Ошибка сохранения»).