Dentro del mundo del desarrollo de aplicaciones es casi una necesidad poder acceder a un repositorio de datos donde almacenar y consultar la información que se requiere en el negocio, y por tal razón existen varias formas de resolver esa situación.

 

                El caso que voy a exponer a continuación es la utilización de las funciones "stored procedures" de Microsoft SQL Server a través de Entity Framework.

 

                Al revisar la documentación existente, se puede decir que existen dos formas predominantes para hacer el llamado de "stored procedures" desde "Entity Framework".

  • Agregar el "stored procedure" al EDM y utilizar la funcionalidad "Add Function Import" tal como se explica en este artículo.
  • Hacer el llamado de los "stored procedures" bajo la estrategia "Entity Framework Code First"  explicado en este artículo.

 

Hay mucho material sobre la discusión de usar Entity Framework Query y Direct raw SQL Execution, lo cual podemos ver en los siguientes enlaces:

 

https://stackoverflow.com/questions/35445373/entity-framework-query-performance-differs-extrem-with-raw-sql-execution

 

https://www.mikesdotnetting.com/article/299/entity-framework-code-first-and-stored-procedures

 

http://www.binaryintellect.net/articles/30738a7c-5176-4333-aa83-98eab8548da5.aspx

 

En mi experiencia personal he usado los "stored procedures" para operaciones del tipo CRUD en escenarios como tablas maestros/detalles, en donde para generar  los registros en la tabla de detalles necesitas  previamente uno o varios valores del registro de la tabla maestra; todo esto bajo la estrategia de "Direct raw SQLExecution", ya que en el pasado al utilizar tratar de manejar el "stored procedure" en el EDM y utilizar la función de importación, te tenido que "ajustar" el "stored procedure" para que cuando Visual Studio ejecute la detección de los parámetros estos retornen unos valores "dummy" y así los pueda visualizar y utilizar en el entorno de desarrollo, lo cual es un trabajo adicional que no considero necesario. Parte de esta realidad que comento se puede leer en este enlace.

 

Dado esa situación, me inclino por el uso del Direct raw SQL Execution, en donde ya con una conexión establecida a la base de datos por Entity Framework, simplemente hago el llamado a un "stored procedure" para el envío y recepción  de los parámetros de la función sin problemas, esto sin agregar código adicional que no se requiere.

 

A continuación indico los pasos  para el uso de un "stored procedure" en una aplicación C# con Entity Framework. Aun cuando se realizó el esfuerzo de detallar este procedimiento, existe la precondición de que el lector tenga conocimientos previos en Visual Studio, C#, T-SQL y Server Server, etc. para poder entender el ejemplo.

 

PasosImagen
Procedemos a entrar a SQL Server  Management Studio imagen1.jpg

El siguiente paso es conectarse a una instancia de SQL Server, ingresando nombre de servidor y "Login" y "Password" Imagen2.jpg
Se crea una base de datos dentro de la instancia de SQL Server con la cual se va a trabajar imagen3.jpg
Creación de base de datos imagen4.jpg
Dentro de la base de datos recientemente creada, se procede a crear una nueva tabla con los campos a utilizar: Campo1 y Campo2 tal cual se muestra en la imagen

 

 imagen5.jpg

Dentro de la misma base de datos se busca el item "Programmability"

 Y se procede a la creación de un "stored Procedure" que recibe y retorna parámetros.

Los parámetros:

@parametro1 y @parametro2 reciben información y el @parametro3 retorna información

 

imagen6.jpg
Ahora procedemos a entrar a Visual Studio imagen7.jpg
Al entrar al Visual Studio selecionamos "New Project" imagen8.jpg
En Visual Studio creamos un proyecto ASP.NET MVC para poder realizar el ejemplo imagen9.jpg
Al crearse el proyecto de Visual Studio, se selecciona la carpeta Model y se marca click derecho, se elige la opción "AddèNew item" imagen10.jpg
Aparece una nueva pantalla en donde nos ubicamos en "ADO.NET Entity Model" para agregar la instancia de "Entity Framework" imagen11.jpg
Se crea una instancia Entity FrameWork para que sirva de entorno de trabajo para el llamado del "Stored Procedure"

 

 imagen12.jpg

Se establecen los parámetros de conexión a la base de datos previamente creada.

 

 imagen13.jpg

Una vez establecida la conexión a base de datos, se procede a seleccionar la tabla "Tabla1" la cual utilizaremos en este ejemplo. Se selecciona con el check box y se finaliza el proceso imagen14.jpg
Ya creada la instancia de Entity Framework, se procede a crear una clase controlador desde la sección de "Solution Explorer" del proyecto que estamos trabajando en Visual Studio imagen15.jpg
Se crea una clase "Controlador" de MVC para escribir el código para realizar el llamado al "Stored Procedure". En la sección de Model Class se selecciona la tabla agregada anteriormente al crear la instancia de Entity Framework. En la sección "Data context class" se selecciona el nombre del contexto creado al añadirla instancia de Entity Framework, que en este caso es: "BDPruebasEntities (MvcApplication1.Models)" imagen16.jpg
Al crear el controlador, se crea un archivo ."cs" donde están las distintas funciones nativas de una clase controlador MVC, las funciones ActionResult

 

 imagen17.jpg

Se procede a crear un método privado el cual se puede llamar desde cualquier función del controlador.

 

 imagen18.jpg
Se crea una función del tipo "ActionResult" para mostrar la forma que ejecutará el llamado al "Stored Procedure" imagen19.jpg
Luego se procede a crear una vista para esta función

 

 imagen20.jpg

A la vista creada se le agrega un botón HTML del tipo "Submit", adicionalmente se incorpora la instrucción Html.BeginForm() para procesar el submit.
 imagen21.jpg
Luego se crea una función "ActionResult" para recibir el "Submit" generado desde la vista "Ejecución". En esta sección se hace el llamado a la función "CrearRegistro" mostrada anteriormente, la cual se encarga de enviar dos parámetros al "Stored Procedure" y recibe un parámetro de el. Se utiliza la instrucción ViewBag.Resultado para enviarle el valor del parámetro recibido a la vista que se llama desde esta función. imagen22.jpg
Se crea una vista siguiento el procedimiento anterior, en donde se muestra el resultado del parámetro devuelto por el "stored procedure"

 

 imagen23.jpg

Ya con todos los pasos indicados, se procede a ejecutar la vista "Ejecucion" creada anteriormente, visualizamos la misma con el boton de "Submit", el cual se procede a marcar. imagen24.jpg
Este botón dispara el llamado a la función que envía y recibe parámetros del "Stored Procedure", mostrando como resultado la vista "resultado" con  el valor de retorno del "Stored Procedure", en este caso el valor del campo ID, y en la tabla los valores de los parámetros al insertar el registro en la tabla. imagen25.jpg

 

 

Se definió una variable del tipo "SQLParameter"  llamada "parametro3" la cual utilizo para recibir un parámetro desde el "stored procedure", y que al final  asigno el valor de retorno a una variable local para su posterior utilización en el envío a una vista. En esta fase ese valor puede ser utilizado por el desarrollador para cubrir cualquier necesidad, como por ejemplo crear registros de en otra tabla que dependen del campo ID registrada en la tabla del ejemplo.

La instrucción "db.Database.ExecuteSqlCommand" permite realizar el llamado al "stored procedure" y se asignan los valores a los parámetros de entrada que se solicitan y la variable para recibir el valor de retorno.

 

Un punto importante en este secuencia de comandos, es la utilización del parámetro "TransactionalBehavior.DoNotEnsureTransaction" en la instrucción "ExecuteSQLCommand", el cual  afecta el funcionamiento del "stored procedure" si se está manejando dentro de la función el concepto de transacciones ("BEGIN TRAN",  "COMMIT TRAN","ROLLBACK TRANS ). Para mayor información consulte aquí.

               

Espero que este artículo les sea de utilidad, si quieren aprender más sobre desarrollo de aplicaciones,  desarrollo en SharePoint o de SharePoint en general por favor visita nuestro site de Eigo Academy para conocer nuestra oferta de cursos.