none
Procedimiento almacenado Mysql y programacion 3 CAPAS RRS feed

  • Pregunta

  • Hola , tengo un codigo para asignar los datos por ejemplo:

     

    provincias prov = new provincias();
    
    prov.cp = "03333";
    prov.nombre = "nombreprov";
    
    prov.InsertarProvincia(prov);
    
    
    
    

     

    Esta es la clase provincias:

     

    public class provincias
      {
        public string cp { get; set; }
        public string nombre { get; set; }
    
    
        public DataTable Listar()
        { return Conexion.GDatos.TraerDataTable("TodasProvincias"); }
    
        public DataSet ListarDataSet()
        { return Conexion.GDatos.TraerDataSet("TodasProvincias"); }
    
        public void InsertarProvincia(provincias provincia)
        {
          MessageBox.Show(provincia.cp + " " + provincia.nombre);
          Conexion.GDatos.Ejecutar( "insertarprovincia" , provincia.cp , provincia.nombre , 2);
        }
    
      }
    

     

    Si os dais cuenta en el metodo insertar provincia tengo un mensageBox, aqui si que me muestra los datos anteriores correctamente pero cuando le paso los parametros al procedimiento almacenado "insertarprovincia" este no los detecta y me dice que el campo cp es nulo,

    Este es mi procedimiento almacenado:

     

     

    CREATE DEFINER=`root`@`localhost` PROCEDURE `insertarprovincia`(
     IN cpostal varchar(5),
     IN nom   varchar(50)
    )
    BEGIN
     INSERT INTO provincias (cp , nombre) VALUES (cpostal , nom);
    END
    

     

    Este es el codigo de Ejecutar

    public int Ejecutar(string procedimientoAlmacenado, params Object[] args)
        {
          var com = Comando(procedimientoAlmacenado);
          CargarParametros(com, args);
          var resp = com.ExecuteNonQuery();
          for (var i = 0; i < com.Parameters.Count; i++)
          {
            var par = (IDbDataParameter)com.Parameters[i];
            if (par.Direction == ParameterDirection.InputOutput || par.Direction == ParameterDirection.Output)
              args.SetValue(par.Value, i - 1);
          }// end for
          return resp;
        } // end Ejecutar
    
    Gracias

     


    Fran
    jueves, 2 de junio de 2011 9:09

Respuestas

  • Efectivamente los parametros no los cogia bien , este codigo es el que me daba fallo

    protected override void CargarParametros(System.Data.IDbCommand com, Object[] args)
        {
          for (int i = 1; i < com.Parameters.Count; i++)
          {
            var p = (MySqlParameter)com.Parameters[i];
            p.Value = i <= args.Length ? args[i - 1] : null;
          } // end for
        } // end CargarParametros
    

    Y este es el codigo que ya me funciona bien:

     

    protected override void CargarParametros(System.Data.IDbCommand com, Object[] args)
        {
          for (int i = 0; i < com.Parameters.Count; i++)
          {
            var p = (MySqlParameter)com.Parameters[i];
            p.Value = i <= args.Length ? args[i] : null;
          } // end for
        } // end CargarParametros
    
    Gracias a los dos


    Fran
    • Marcado como respuesta Fran Alicante jueves, 2 de junio de 2011 15:47
    jueves, 2 de junio de 2011 15:47

Todas las respuestas

  • Buenas Fran.

    ¿Has validado depurando la aplicación que el Array args de la función Ejecutar contiene efectivamente los 2 parametros?

    Un saludo.


    Antonio López Atienza
    .NET Developer
    BackgroundWorker example
    http://www.lopezatienza.es
    jueves, 2 de junio de 2011 10:02
  • Prueba a llamar a la función de la siguiente manera.

     

    Conexion.GDatos.Ejecutar( "insertarprovincia" , new Object[] {provincia.cp, provincia.nombre});
    

     

    Un saludo.


    Antonio López Atienza
    .NET Developer
    BackgroundWorker example
    http://www.lopezatienza.es
    jueves, 2 de junio de 2011 10:12
  • hola

    pero porque es que armas de esta forma tu diseño en capas

    cuando lo ahces asi no armas metodo genericos sino que modleas tu negocio

    [N-Tier] – Desarrollo en capas - Ejemplo Facturacion - parte 3

    mas all que alli no uso mysql, la estructura aplcia para cualquier db

    pero veras que se obtiene entidades del negocio y se eejcuta la query en la capa de datos especifica para esa entidad

    no se le pasa a un metodo el nombre del sp y los parametros en un array

     

    veo algo fragil ese codigo, esta queriendo descubrir los parametros de forma dinamica y asignarle los valores, no aportando mucha estabilidad, define los parametros de forma fija

    y pasa la entidad al metodo insertar no cada valor individual, esto hara que puedas modelar tu dominion y aportar estabilidad a la aplicacion

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 2 de junio de 2011 11:53
  • Buenas Fran.

    ¿Has validado depurando la aplicación que el Array args de la función Ejecutar contiene efectivamente los 2 parametros?

    Un saludo.


    Antonio López Atienza
    .NET Developer
    BackgroundWorker example
    http://www.lopezatienza.es
    Si que lo contiene

    Fran
    jueves, 2 de junio de 2011 14:30
  • Prueba a llamar a la función de la siguiente manera.

     

     

    Conexion.GDatos.Ejecutar( "insertarprovincia" , new Object[] {provincia.cp, provincia.nombre});
    

     

     

    Un saludo.


    Antonio López Atienza
    .NET Developer
    BackgroundWorker example
    http://www.lopezatienza.es

    Gracias pero sigue tirando el mismo error

    Fran
    jueves, 2 de junio de 2011 14:31
  • Buenas Fran.

    Comprueba lanzando el procedimiento almacenado desde el Management Studio a ver si va correctamente.

     

    EXEC dbo.insertarprovincia '11011', 'Cadiz';
    GO
    

     

    Un saludo.


    Antonio López Atienza
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    jueves, 2 de junio de 2011 14:45
  • hola

    un consejo reemplza los var por los obhjetos que verdaderamente usas, no es bueno hacer uso intensivo del var para todo

    - luego deberias se deberia ver que hace los metodos Comando() y CargarParametros() porque alli aparecen pero nos e sabe que hacen

    seguramente el CargarParametros() no este asignando del todo bien el parametro


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 2 de junio de 2011 14:50
  • Buenas Fran.

    Comprueba lanzando el procedimiento almacenado desde el Management Studio a ver si va correctamente.

     

     

    EXEC dbo.insertarprovincia '11011', 'Cadiz';
    GO
    

     

     

    Un saludo.


    Antonio López Atienza
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    Si te refieres que lo ejecute desde el gestor de la base de datos , ya lo he hecho varias veces y funciona correctamente

    Fran
    jueves, 2 de junio de 2011 15:27
  • Buenas Fran.

    El problema debe estar ocasionado como comenta nuestro compañero Leandro en la obtención de los parámetros en la función.

    Comprueba en depuración dentro de la función los valores del Array args.

    Además comprueba también la función "CargarParametros(com, args);" que no se pase args por referencia y se modifiquen de alguna manera.

    Un saludo.


    Antonio López Atienza
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    jueves, 2 de junio de 2011 15:32
  • Efectivamente los parametros no los cogia bien , este codigo es el que me daba fallo

    protected override void CargarParametros(System.Data.IDbCommand com, Object[] args)
        {
          for (int i = 1; i < com.Parameters.Count; i++)
          {
            var p = (MySqlParameter)com.Parameters[i];
            p.Value = i <= args.Length ? args[i - 1] : null;
          } // end for
        } // end CargarParametros
    

    Y este es el codigo que ya me funciona bien:

     

    protected override void CargarParametros(System.Data.IDbCommand com, Object[] args)
        {
          for (int i = 0; i < com.Parameters.Count; i++)
          {
            var p = (MySqlParameter)com.Parameters[i];
            p.Value = i <= args.Length ? args[i] : null;
          } // end for
        } // end CargarParametros
    
    Gracias a los dos


    Fran
    • Marcado como respuesta Fran Alicante jueves, 2 de junio de 2011 15:47
    jueves, 2 de junio de 2011 15:47