J'ai vérifié google mais rien trouvé bon. Je cherche des requêtes traditionnelles SQL
dans MVC
au lieu du cadre Entity, etc. Ce serait donc bien si vous me fournissiez des exemples.
J'ai commencé à apprendre MVC
mais beaucoup d'exemples utilisent des variables linq
à SQL
et EF
etc. que je ne souhaite pas utiliser du tout. Je souhaite utiliser de vieilles requêtes SQL
simples dans la couche modèle.
Exemple le plus simple:
//Domain Class
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
namespace BanjoOnMyKnee.Models
{
public class DomainModel
{
public string connectionString = ".\\SQLEXPRESS; Initial-Catalog=YourDBName; Integrated-Security=true";
public void CreateSomething(ViewModel model)
{
using(SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand("",connection))
{
command.CommandText = "insert into Names values(@Name)";
command.Parameters.AddWithValue("@Name", model.Name);
command.ExecuteNonQuery();
}
}
public ViewModel FindSomething(int id)
{
var model = new ViewModel();
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand("", connection))
{
command.CommandText = "select * from Names where Id=@Id";
command.Parameters.AddWithValue("@Id",id);
SqlDataReader reader = command.ExecuteReader();
model.Id = id;
model.Name = reader["Name"].ToString();
}
return model;
}
public void DeleteSomething(ViewModel model)
{
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand("", connection))
{
command.CommandText = "delete from Names where Id=@Id";
command.Parameters.AddWithValue("@Id", model.Id);
command.ExecuteNonQuery();
}
}
public void EditSomething(ViewModel model)
{
using (SqlConnection connection = new SqlConnection(connectionString))
using (SqlCommand command = new SqlCommand("", connection))
{
command.CommandText = "Update Names set Name=@Name where Id=@Id";
command.Parameters.AddWithValue("@Name", model.Name);
command.Parameters.AddWithValue("@Id", model.Id);
command.ExecuteNonQuery();
}
}
}
}
Et voici ma classe de contrôleur
//My Controller class
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View();
}
//
// GET: /Home/Create
public ActionResult Create()
{
return View(new ViewModel());
}
//
// POST: /Home/Create
[HttpPost]
public ActionResult Create(ViewModel vm)
{
try
{
var domainModel = new DomainModel();
domainModel.CreateSomething(vm);
return RedirectToAction("Index");
}
catch
{
return View(new ViewModel());
}
}
//
// GET: /Home/Edit/5
public ActionResult Edit(int id)
{
ViewModel model = new DomainModel().FindSomething(id);
return View(model);
}
[HttpPost]
public ActionResult Edit(ViewModel editModel)
{
try
{
var dm = new DomainModel();
dm.EditSomething(editModel);
return RedirectToAction("Index");
}
catch
{
return View(new ViewModel());
}
}
}
Ma classe ViewModel
//My ViewModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace BanjoOnMyKnee.Models
{
public class ViewModel
{
public int Id { get; set; }
public string Name { get; set; }
}
}
Et ma vue "Créer"
//My view
@model BanjoOnMyKnee.Models.ViewModel
@{
ViewBag.Title = "Create";
}
<h2>Create</h2>
@using(Html.BeginForm()){
@Html.HiddenFor(m => m.Id);
<p> Name :
Html.EditorFor(m=>m.Name);</p>
<input type="submit" value="Create" />
}
que diriez-vous d’écrire des procédures stockées et de simplement les invoquer en tant que méthodes en ajoutant simplement un LinQ to Sql Class
dans votre projet, cela facilitera beaucoup le traitement de la base de données
après avoir effectué les procédures stockées nécessaires:
- faites un clic droit dans votre projet puis ajoutez un nouvel élément puis choisissez une classe LinQ to SQL et nommez-le
- faites glisser vos procédures stockées précédemment faites
- créer une instance de votre
linq to sql class
alors vous pouvez invoquer vos procédures stockées et les membres de cette classe
http://msdn.Microsoft.com/en-us/library/bb386946(v=vs.110).aspx ce lien peut également vous aider
Il suffit donc d'ajouter un Helper class
et d'écrire ce dont vous avez besoin (connexions SQL, commandes, requêtes ...), puis d'appeler ces méthodes d'assistance à partir de votre contrôleur. Ce n'est pas différent de l'ancien style
Classe d'assistance statique:
public static class HelperFunctions
{
private static string connString = "your connection string";
public static IEnumerable<User> GetAllUsers()
{
using (var conn = new SqlConnection(connString))
using (var cmd = new SqlCommand(connection:conn))
{
// set your command text, execute your command
// get results and return
}
}
Dans votre contrôleur:
public ActionResult Users()
{
// Get user list
IEnumerable<User> users = HelperFunctions.GetAllUsers();
// Return your view and pass it to your list
return View(users);
}
Dans votre vue, définissez votre modèle de vue:
@model IEnumerable<User>
Ensuite, vous pouvez accéder à votre liste d'utilisateurs à partir de votre vue, par exemple:
foreach(var user in Model)
{
<p> @user.Name </p>
}
Model
représente votre modèle de vue actuel. Si vous souhaitez accéder à plusieurs listes à partir de votre vue, vous pouvez utiliser ViewBag ou ViewData. Consultez cet article pour plus d'informations: http://www.codeproject.com/Articles/476967/WhatplusisplusViewData-2cplusViewBagplusandplusTem
En utilisant le cadre d'entité cela peut être fait
Entitiesdb db = new Entitiesdb();
string query="delete from tableA where id=@id"
db.Database.ExecuteSqlCommand(query, @id);