Я пытаюсь реализовать свой проект с 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();
}
}
Я новичок в этом, особенно без структуры лица.Так что я не уверен, где я иду не так.Буду очень признателен за любую помощь в выяснении или предоставлении мне рекомендаций по передовому опыту.