ASP.NET без Entity Framework не может сохранить в БД - PullRequest
0 голосов
/ 27 ноября 2018

Я пытаюсь реализовать свой проект с ASP.NET MVC без сущностной структуры.Я получаю свои значения для индексации нормально, однако мои функции создания и редактирования не работают.Я нажал кнопку «Создать или изменить», и в моем блоке перехвата он оказался с исключением пустой ссылки.

Я настроил свои хранимые процедуры следующим образом:

 CREATE PROCEDURE [Project].[AddStudent]  
(  
   @FirstName NVARCHAR(32),  
   @LastName  NVARCHAR(32),  
   @Email     NVARCHAR(32)  
)  
AS
INSERT INTO Project.Student
VALUES
(   @FirstName,
    @LastName,
    @Email
)

    CREATE PROCEDURE [Project].[UpdateStudent]  
(  
   @StudentId INT,  
   @FirstName NVARCHAR(32),  
   @LastName NVARCHAR(32),  
   @Email NVARCHAR(32)  
)  
AS   
   UPDATE Student  
   SET FirstName = @FirstName,  
   LastName = @LastName,  
   Email = @Email  
   WHERE StudentId = @StudentId

КакойЯ считаю, что это должно работать самостоятельно.Значение StudentId в первой процедуре должно быть заполнено, поскольку оно является идентификатором.

Затем я создал класс дескриптора db:

 public class StudentDBHandle
{
    private SqlConnection con;
    private void Connection()
    {
        string constring = ConfigurationManager.ConnectionStrings["studentconn"].ToString();
        con = new SqlConnection(constring);
    }

    // **************** ADD NEW STUDENT *********************
    public bool AddStudent(Student smodel)
    {
        Connection();
        SqlCommand cmd = new SqlCommand("AddStudent", con)
        {
            CommandType = CommandType.StoredProcedure
        };

        cmd.Parameters.AddWithValue("@FirstName", smodel.FirstName);
        cmd.Parameters.AddWithValue("@LastName", smodel.LastName);
        cmd.Parameters.AddWithValue("@Email", smodel.Email);

        con.Open();
        int i = cmd.ExecuteNonQuery();
        con.Close();

        if (i >= 1)
            return true;
        else
            return false;
    }

    // ********** VIEW STUDENT DETAILS ********************
    public List<Student> GetStudent()
    {
        Connection();
        List<Student> studentlist = new List<Student>();

        SqlCommand cmd = new SqlCommand("Project.GetStudentDetails", con)
        {
            CommandType = CommandType.StoredProcedure
        };
        SqlDataAdapter sd = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable();

        con.Open();
        sd.Fill(dt);
        con.Close();

        foreach (DataRow dr in dt.Rows)
        {
            studentlist.Add(
                new Student
                {
                    StudentId = Convert.ToInt32(dr["StudentId"]),
                    FirstName = Convert.ToString(dr["FirstName"]),
                    LastName = Convert.ToString(dr["LastName"]),
                    Email = Convert.ToString(dr["Email"])
                });
        }
        return studentlist;
    }

    // ***************** UPDATE STUDENT DETAILS *********************
    public bool UpdateDetails(Student smodel)
    {
        Connection();
        SqlCommand cmd = new SqlCommand("UpdateStudent", con)
        {
            CommandType = CommandType.StoredProcedure
        };

        cmd.Parameters.AddWithValue("@StudentId", smodel.StudentId);
        cmd.Parameters.AddWithValue("@FirstName", smodel.FirstName);
        cmd.Parameters.AddWithValue("@LastName", smodel.LastName);
        cmd.Parameters.AddWithValue("@Email", smodel.Email);

        con.Open();
        int i = cmd.ExecuteNonQuery();
        con.Close();

        if (i >= 1)
            return true;
        else
            return false;
    }

, который, кажется, там, где возникает проблема, на int i = cmd.ExecuteNonQuery ();

итогда у меня есть мой контроллер следующим образом:

 // GET: Student/Create
    public ActionResult Create()
    {
        return View();
    }

    // POST: Student/Create
    [HttpPost]
    public ActionResult Create(Student smodel)
    {
        try
        {
            if (ModelState.IsValid)
            {
                StudentDBHandle sdb = new StudentDBHandle();
                if (sdb.AddStudent(smodel))
                {
                    ViewBag.Message = "Student Added Successfully";
                    ModelState.Clear();
                }
            }
            return View();
        }
        catch
        {
            return View();
        }
    }

    // GET: Student/Edit/5
    public ActionResult Edit(int id)
    {
        StudentDBHandle sdb = new StudentDBHandle();
        return View(sdb.GetStudent().Find(smodel => smodel.StudentId == id));
    }

    // POST: Student/Edit/5
    [HttpPost]
    public ActionResult Edit(int id, Student smodel)
    {
        try
        {
            StudentDBHandle sdb = new StudentDBHandle();
            sdb.UpdateDetails(smodel);
            return RedirectToAction("Index");
        }
        catch
        {
            return View();
        }
    }

Я новичок в этом, особенно без структуры лица.Так что я не уверен, где я иду не так.Буду очень признателен за любую помощь в выяснении или предоставлении мне рекомендаций по передовому опыту.

1 Ответ

0 голосов
/ 27 ноября 2018

Удалить параметр ID из-за перегрузки. Редактировать метод, например

[HttpPost]
public ActionResult Edit(Student smodel)
{
    try
    {
        StudentDBHandle sdb = new StudentDBHandle();
        sdb.UpdateDetails(smodel);
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...