none
Usar Procedimiento almacenado desde mi Proyecto MVC RRS feed

  • Pregunta

  • Hola a todos muy buen dia.

    molestando un por por ayuda de antemano doy gracias a Dios por todos los que me colaboran.

    bueno estoy iniciando con esto de MVC y pues ya me tope con algunos inconvenientes.

    quiero usar mis procedimientos almacenandos que tengo en mi base de datos y no quiero hacerlo como ya me lo hace mvc, que desde mi controlador ya creo, deleto, update y list, estoy comenzando a aprender y quiero tener el control de lo que hago.

    tengo un pequeño ejemplo 

    como veran ya tengo conexion con mi BD, y ya consigo ver mis procedimientos almacenandos de prueba.

    tambien ya tengo mapeado mi modelo

    tengo mi clase tblCustomer

    public partial class tblCustomer
        {
            public int ID { get; set; }
            public string Name { get; set; }
            public string City { get; set; }
            public string Country { get; set; }
        }


    me llama mucho la atencion es esta parte de mi codigo que esta en mi modelContext, si alguien me la pudiera explicar un poquito le agradecere.

    namespace PruebasUnitariasMVC.Models
    {
        using System;
        using System.Data.Entity;
        using System.Data.Entity.Infrastructure;
        using System.Data.Entity.Core.Objects;
        using System.Linq;
        
        public partial class PruebasUnitariasMVCEntities : DbContext
        {
            public PruebasUnitariasMVCEntities()
                : base("name=PruebasUnitariasMVCEntities")
            {
            }
        
            protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                throw new UnintentionalCodeFirstException();
            }
        
            public virtual DbSet<tblCustomer> tblCustomers { get; set; }
        
            public virtual ObjectResult<tblCustomer> sp_Delete(Nullable<int> iD)
            {
                var iDParameter = iD.HasValue ?
                    new ObjectParameter("ID", iD) :
                    new ObjectParameter("ID", typeof(int));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tblCustomer>("sp_Delete", iDParameter);
            }
        
            public virtual ObjectResult<tblCustomer> sp_Delete(Nullable<int> iD, MergeOption mergeOption)
            {
                var iDParameter = iD.HasValue ?
                    new ObjectParameter("ID", iD) :
                    new ObjectParameter("ID", typeof(int));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tblCustomer>("sp_Delete", mergeOption, iDParameter);
            }
        
            public virtual ObjectResult<tblCustomer> sp_InsertCustomer(Nullable<int> iD, string name, string city, string country)
            {
                var iDParameter = iD.HasValue ?
                    new ObjectParameter("ID", iD) :
                    new ObjectParameter("ID", typeof(int));
        
                var nameParameter = name != null ?
                    new ObjectParameter("Name", name) :
                    new ObjectParameter("Name", typeof(string));
        
                var cityParameter = city != null ?
                    new ObjectParameter("City", city) :
                    new ObjectParameter("City", typeof(string));
        
                var countryParameter = country != null ?
                    new ObjectParameter("Country", country) :
                    new ObjectParameter("Country", typeof(string));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tblCustomer>("sp_InsertCustomer", iDParameter, nameParameter, cityParameter, countryParameter);
            }
        
            public virtual ObjectResult<tblCustomer> sp_InsertCustomer(Nullable<int> iD, string name, string city, string country, MergeOption mergeOption)
            {
                var iDParameter = iD.HasValue ?
                    new ObjectParameter("ID", iD) :
                    new ObjectParameter("ID", typeof(int));
        
                var nameParameter = name != null ?
                    new ObjectParameter("Name", name) :
                    new ObjectParameter("Name", typeof(string));
        
                var cityParameter = city != null ?
                    new ObjectParameter("City", city) :
                    new ObjectParameter("City", typeof(string));
        
                var countryParameter = country != null ?
                    new ObjectParameter("Country", country) :
                    new ObjectParameter("Country", typeof(string));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tblCustomer>("sp_InsertCustomer", mergeOption, iDParameter, nameParameter, cityParameter, countryParameter);
            }
        
            public virtual ObjectResult<Sp_SearchCustomers_Result> Sp_SearchCustomers(string city)
            {
                var cityParameter = city != null ?
                    new ObjectParameter("City", city) :
                    new ObjectParameter("City", typeof(string));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Sp_SearchCustomers_Result>("Sp_SearchCustomers", cityParameter);
            }
        
            public virtual ObjectResult<tblCustomer> sp_Update(Nullable<int> iD, string name, string city, string country)
            {
                var iDParameter = iD.HasValue ?
                    new ObjectParameter("ID", iD) :
                    new ObjectParameter("ID", typeof(int));
        
                var nameParameter = name != null ?
                    new ObjectParameter("Name", name) :
                    new ObjectParameter("Name", typeof(string));
        
                var cityParameter = city != null ?
                    new ObjectParameter("City", city) :
                    new ObjectParameter("City", typeof(string));
        
                var countryParameter = country != null ?
                    new ObjectParameter("Country", country) :
                    new ObjectParameter("Country", typeof(string));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tblCustomer>("sp_Update", iDParameter, nameParameter, cityParameter, countryParameter);
            }
        
            public virtual ObjectResult<tblCustomer> sp_Update(Nullable<int> iD, string name, string city, string country, MergeOption mergeOption)
            {
                var iDParameter = iD.HasValue ?
                    new ObjectParameter("ID", iD) :
                    new ObjectParameter("ID", typeof(int));
        
                var nameParameter = name != null ?
                    new ObjectParameter("Name", name) :
                    new ObjectParameter("Name", typeof(string));
        
                var cityParameter = city != null ?
                    new ObjectParameter("City", city) :
                    new ObjectParameter("City", typeof(string));
        
                var countryParameter = country != null ?
                    new ObjectParameter("Country", country) :
                    new ObjectParameter("Country", typeof(string));
        
                return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<tblCustomer>("sp_Update", mergeOption, iDParameter, nameParameter, cityParameter, countryParameter);
            }
        }
    }

    ahora en mi controlador cuando ya doy boton derecho agregar controlador, y elijo crear con MVC5 controller with views using entity frameworl  ya me crea los metodos de ingreso para mi tabla

    public class tblCustomersController : Controller
        {
            private PruebasUnitariasMVCEntities db = new PruebasUnitariasMVCEntities();
    
            // GET: tblCustomers
            public ActionResult Index()
            {
                return View(db.tblCustomers.ToList());
            }
    
            // GET: tblCustomers/Details/5
            public ActionResult Details(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                tblCustomer tblCustomer = db.tblCustomers.Find(id);
                if (tblCustomer == null)
                {
                    return HttpNotFound();
                }
                return View(tblCustomer);
            }
    
            // GET: tblCustomers/Create
            public ActionResult Create()
            {
                return View();
            }
    
            // POST: tblCustomers/Create
            // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
            // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "ID,Name,City,Country")] tblCustomer tblCustomer)
            {
                if (ModelState.IsValid)
                {
                    db.tblCustomers.Add(tblCustomer);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
    
                return View(tblCustomer);
            }
    
            // GET: tblCustomers/Edit/5
            public ActionResult Edit(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                tblCustomer tblCustomer = db.tblCustomers.Find(id);
                if (tblCustomer == null)
                {
                    return HttpNotFound();
                }
                return View(tblCustomer);
            }
    
            // POST: tblCustomers/Edit/5
            // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
            // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Edit([Bind(Include = "ID,Name,City,Country")] tblCustomer tblCustomer)
            {
                if (ModelState.IsValid)
                {
                    db.Entry(tblCustomer).State = EntityState.Modified;
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
                return View(tblCustomer);
            }
    
            // GET: tblCustomers/Delete/5
            public ActionResult Delete(int? id)
            {
                if (id == null)
                {
                    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                }
                tblCustomer tblCustomer = db.tblCustomers.Find(id);
                if (tblCustomer == null)
                {
                    return HttpNotFound();
                }
                return View(tblCustomer);
            }
    
            // POST: tblCustomers/Delete/5
            [HttpPost, ActionName("Delete")]
            [ValidateAntiForgeryToken]
            public ActionResult DeleteConfirmed(int id)
            {
                tblCustomer tblCustomer = db.tblCustomers.Find(id);
                db.tblCustomers.Remove(tblCustomer);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
    
            protected override void Dispose(bool disposing)
            {
                if (disposing)
                {
                    db.Dispose();
                }
                base.Dispose(disposing);
            }
        }
    }

    que facil que se nos hace es solo agregar datos porque practicamente lo hace todo, pero resulta que yo quiero usar mis procedimientos almacenandos que tengo en mi tabla, pero como no se hacerlo es que vengo a preguntar a uds. por ejemplo quiero reemplazar este codigo

    public ActionResult Create()
            {
                return View();
            }
    
            // POST: tblCustomers/Create
            // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
            // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
            [HttpPost]
            [ValidateAntiForgeryToken]
            public ActionResult Create([Bind(Include = "ID,Name,City,Country")] tblCustomer tblCustomer)
            {
                if (ModelState.IsValid)
                {
                    db.tblCustomers.Add(tblCustomer);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }
    
                return View(tblCustomer);
            }

    por el uso de mi procedimiento almacenando, por favor ayudenme a entenderlo que debo hacer. les agradezco de antemano por la ayuda prestada.

    gracias

    Roberto

    jueves, 16 de agosto de 2018 15:54

Respuestas

  • Estimados aqui mi respuesta ya consegui pasar datos a mi DB por procedimientos almacenados.

    PruebasEntities db = new PruebasEntities();
            public ActionResult Index()
            {
                return View();
            }
            [HttpPost]
            public ActionResult Index(Clientes cliente)
            {
                db.sp_InsertarCliente(cliente.NombreUsuario, cliente.Apellido, cliente.EstadoCivil);
                return View();
            }
    Gracias a todos

    martes, 20 de noviembre de 2018 18:52

Todas las respuestas

  • hola

    >>me llama mucho la atencion es esta parte de mi codigo que esta en mi modelContext, si alguien me la pudiera explicar un poquito

    Ese es codigo generado en base a un template que defines ef en el edmx, no hace falta entenderlo

    si quiees hacerlo deberias ir a EF Code First, entonces mapeas tu el acceso controlando el codigo

    >>pero resulta que yo quiero usar mis procedimientos almacenandos que tengo en mi tabla,

    podrias ir tocando el codigo para cambiar las llamadas, por ejemplo cuando hace

    tblCustomer tblCustomer = db.tblCustomers.Find(id);

    podrias cambiar ese tblCustomers por el nombre del procedure que se mapeo en el edmx

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 16 de agosto de 2018 17:19
  • Estimado Leandro muchas gracias, siempre colaborando de una manera desinteresada.

    cuando cambio me sale el siguiente error

    por favor que debo hacer con este error

    jueves, 16 de agosto de 2018 19:39
  • hola

    Cuando cambias por el procedure no aplicaria el Find() solo debes pasarle el id

    db.sp_Delete(id);

    tambien debes quitar el Remove()

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    jueves, 16 de agosto de 2018 21:00
  • Gracias estimado ahora aparece este mensaje.

    jueves, 16 de agosto de 2018 21:13
  • Leandro buen día en mi afán de querer aprender un poco mas estoy, ahora ya conseguí ingresar el dato con este codigo

    public ActionResult Create(tblCustomer tblCustomer)
            {
                if (ModelState.IsValid)
                {
                    db.sp_InsertCustomer(tblCustomer.ID, tblCustomer.Name, tblCustomer.City, tblCustomer.Country);
                    //db.SaveChanges();
                    return RedirectToAction("Index");
                }
    
                return View(tblCustomer);
            }

    pero ahora me sale este otro error pero aun asi consigo ingresar mi dato

    aparentemente es obvio el error pero todo esta en el orden, conforme a la base de datos, por favor alguna idea del porque mi error.

    gracias.

    Roberto

    martes, 21 de agosto de 2018 14:55
  • Estimados aqui mi respuesta ya consegui pasar datos a mi DB por procedimientos almacenados.

    PruebasEntities db = new PruebasEntities();
            public ActionResult Index()
            {
                return View();
            }
            [HttpPost]
            public ActionResult Index(Clientes cliente)
            {
                db.sp_InsertarCliente(cliente.NombreUsuario, cliente.Apellido, cliente.EstadoCivil);
                return View();
            }
    Gracias a todos

    martes, 20 de noviembre de 2018 18:52