none
ExecuteNonQuery: La propiedad Connection no se ha inicializado.|| MSVS + SQLServer2008R2 (C# y Procedimiento Almacenado ) RRS feed

  • Pregunta

  • He creado estas 2 clases además estoy implementando el boton Guardar y estoy usando un procedimiento almacenado que ya lo he probado en SQL y si me funciona bien pero al momento de llenar el formulario y darle click en guardar me sale el error "ExecuteNonQuery: La propiedad Connection no se ha inicializado". Me ayudan...

    Clase Conexión

    ==================================================================================

    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Data.SqlClient;
    using System.Data;
    using System.Windows.Forms;

    namespace PracticaPrincipal.Clases
    {
        class ConexionSQL
        {
            SqlConnection oConnection = new SqlConnection("Data Source =DESKTOP-CARLOS; Initial Catalog = SRG; Integrated Security = True");

            public void ConectarSQL()
            {
                try
                {

                    oConnection.Open();
                }
                catch(Exception e)
                {
                    MessageBox.Show(e.Message);
                }
            }

            public void DesconectarSQL()
            {
                oConnection.Close();
            }

            public SqlConnection ObtenerConexionSQL()
            {
                return oConnection;
            }
        }
    }

    ==================================================================================

    Clase Usuario

    ==================================================================================

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace PracticaPrincipal.Clases
    {
        public class Usuario
        {
            int dni = 0;
            string nombre = "";
            string apellido = "";
            string direccion = "";
            int celular = 0;
            string email = "";
            string genero = "";
            DateTime fecharegistro = DateTime.Now;

            public Usuario()
            {
      
            }

            public Usuario(int dni, string nombre, string apellido, string direccion, int celular, string email, string genero, DateTime fecharegistro)
            {
                this.dni = dni;
                this.nombre = nombre;
                this.apellido = apellido;
                this.direccion = direccion;
                this.celular = celular;
                this.email = email;
                this.genero = genero;
                this.fecharegistro = fecharegistro;
            }

            public int Dni { get => dni; set => dni = value; }
            public string Nombre { get => nombre; set => nombre = value; }
            public string Apellido { get => apellido; set => apellido = value; }
            public string Direccion { get => direccion; set => direccion = value; }
            public int Celular { get => celular; set => celular = value; }
            public string Email { get => email; set => email = value; }
            public string Genero { get => genero; set => genero = value; }
            public DateTime Fecharegistro { get => fecharegistro; set => fecharegistro = value; }
        }
    }

    ==================================================================================

    Método del boton Gurdar

    ==================================================================================

    private void Btn_UGuardar_Click(object sender, EventArgs e)
            {
                try
                {
                    ConexionSQL oInsertar=new ConexionSQL();
                    oInsertar.ConectarSQL();

                    SqlCommand cmd = new SqlCommand();
                    Usuario oUsuario = new Usuario();
                    
                    oUsuario.Dni = Convert.ToInt32(this.txt_UDni.Text);
                    oUsuario.Nombre = Convert.ToString(this.txt_UNombres.Text);
                    oUsuario.Apellido = Convert.ToString(this.txt_UApellidos.Text);
                    oUsuario.Direccion = Convert.ToString(this.txt_UDireccion.Text);
                    oUsuario.Celular = Convert.ToInt32(this.txt_UCelular.Text);
                    oUsuario.Email = Convert.ToString(this.txt_UEmail.Text);
                    oUsuario.Genero = "";
                    if (rb_UMasculino.Checked) oUsuario.Genero = "M";
                    if (rb_UFemenino.Checked) oUsuario.Genero = "F";

     

                    cmd.CommandType = CommandType.StoredProcedure;
                    cmd.CommandText = "SP_AgregarNuevoUsuario";
                    cmd.Parameters.Add("@dni", SqlDbType.Int).Value = oUsuario.Dni;
                    cmd.Parameters.Add("@nombre", SqlDbType.Char).Value = oUsuario.Nombre;
                    cmd.Parameters.Add("apellido", SqlDbType.Char).Value = oUsuario.Apellido;
                    cmd.Parameters.Add("direccion", SqlDbType.Char).Value = oUsuario.Direccion;
                    cmd.Parameters.Add("celular", SqlDbType.Int).Value = oUsuario.Celular;
                    cmd.Parameters.Add("email", SqlDbType.Char).Value = oUsuario.Email;
                    cmd.Parameters.Add("genero", SqlDbType.Char).Value = oUsuario.Genero;
                    cmd.ExecuteNonQuery();


                    oInsertar.DesconectarSQL();

                    MessageBox.Show("Usuario Registrado con Exito");
                    
                }catch(Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
                
            }


    viernes, 26 de abril de 2019 21:52

Respuestas

  • Hola Carlos Azahuanche Leyva:

    Se ven varias cosas "raras" en la definición de tipos de datos del Parameters.

    dni es un int??? seguro que no tiene que admitir espacios, puntos u otros. (En españa los dnis son p.ej: 10.887.009-k)

    Nombre debería de ser sqlDbType.Varchar) y luego si quieres la longitud.

    lo mismo apellido, dir, email

    celular int??? y si el usuario ha puesto 625 15 68 78 (con espacios) o 625.15.68.78

    Pero sobre todo te falla por esto.

                    /* inicializa el comando con el procedure y la conexión */
                    SqlCommand cmd = new SqlCommand("SP_AgregarNuevoUsuario",oInsertar.ObtenerConexionSQL());
                    Usuario oUsuario = new Usuario();
    
    /* No te olvides de revisar estos parametros */
                 cmd.CommandType = CommandType.StoredProcedure;
                    
                    cmd.Parameters.Add("@dni", SqlDbType.Int).Value = oUsuario.Dni;
                    cmd.Parameters.Add("@nombre", SqlDbType.Char).Value = oUsuario.Nombre;
                    cmd.Parameters.Add("@apellido", SqlDbType.Char).Value = oUsuario.Apellido;
                    cmd.Parameters.Add("@direccion", SqlDbType.Char).Value = oUsuario.Direccion;
                    cmd.Parameters.Add("@celular", SqlDbType.Int).Value = oUsuario.Celular;
                    cmd.Parameters.Add("@email", SqlDbType.Char).Value = oUsuario.Email;
                    cmd.Parameters.Add("@genero", SqlDbType.Char).Value = oUsuario.Genero;
                    cmd.ExecuteNonQuery();
    

    viernes, 26 de abril de 2019 22:19
  • hola

    >>ExecuteNonQuery: La propiedad Connection no se ha inicializado

    Veo que instancias he invocas

    oInsertar.ConectarSQL();

    pero en que momento asignas la conecion al SqlCommand ? no lo haces nunca por eso el mensaje

    SqlCommand cmd = new SqlCommand("SP_AgregarNuevoUsuario", oInsertar.ObtenerConexionSQL());

    Igualmente veo muchos otros problemas en ese codigo

    - Para que defienes la clase ConexionSQL ? no tiene ningun sentido, solo agrega doficultad en el codigo

    - porque defines y asignas la clase Usuario si unas lineas debajo poner los datos directo a los parametros del SqlCommand, no tiene sentido

    Recomendaria cambies el codigo y programes en capas usando entidades de verdad como explico en el articulo

    [WinForms] Edición Empleados

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 26 de abril de 2019 23:29

Todas las respuestas

  • Hola Carlos Azahuanche Leyva:

    Se ven varias cosas "raras" en la definición de tipos de datos del Parameters.

    dni es un int??? seguro que no tiene que admitir espacios, puntos u otros. (En españa los dnis son p.ej: 10.887.009-k)

    Nombre debería de ser sqlDbType.Varchar) y luego si quieres la longitud.

    lo mismo apellido, dir, email

    celular int??? y si el usuario ha puesto 625 15 68 78 (con espacios) o 625.15.68.78

    Pero sobre todo te falla por esto.

                    /* inicializa el comando con el procedure y la conexión */
                    SqlCommand cmd = new SqlCommand("SP_AgregarNuevoUsuario",oInsertar.ObtenerConexionSQL());
                    Usuario oUsuario = new Usuario();
    
    /* No te olvides de revisar estos parametros */
                 cmd.CommandType = CommandType.StoredProcedure;
                    
                    cmd.Parameters.Add("@dni", SqlDbType.Int).Value = oUsuario.Dni;
                    cmd.Parameters.Add("@nombre", SqlDbType.Char).Value = oUsuario.Nombre;
                    cmd.Parameters.Add("@apellido", SqlDbType.Char).Value = oUsuario.Apellido;
                    cmd.Parameters.Add("@direccion", SqlDbType.Char).Value = oUsuario.Direccion;
                    cmd.Parameters.Add("@celular", SqlDbType.Int).Value = oUsuario.Celular;
                    cmd.Parameters.Add("@email", SqlDbType.Char).Value = oUsuario.Email;
                    cmd.Parameters.Add("@genero", SqlDbType.Char).Value = oUsuario.Genero;
                    cmd.ExecuteNonQuery();
    

    viernes, 26 de abril de 2019 22:19
  • hola

    >>ExecuteNonQuery: La propiedad Connection no se ha inicializado

    Veo que instancias he invocas

    oInsertar.ConectarSQL();

    pero en que momento asignas la conecion al SqlCommand ? no lo haces nunca por eso el mensaje

    SqlCommand cmd = new SqlCommand("SP_AgregarNuevoUsuario", oInsertar.ObtenerConexionSQL());

    Igualmente veo muchos otros problemas en ese codigo

    - Para que defienes la clase ConexionSQL ? no tiene ningun sentido, solo agrega doficultad en el codigo

    - porque defines y asignas la clase Usuario si unas lineas debajo poner los datos directo a los parametros del SqlCommand, no tiene sentido

    Recomendaria cambies el codigo y programes en capas usando entidades de verdad como explico en el articulo

    [WinForms] Edición Empleados

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 26 de abril de 2019 23:29
  • "ExecuteNonQuery: La propiedad Connection no se ha inicializado".

    Siempre que te salga este error significa lo siguiente: Has instanciado un SqlCommand, NO le has puesto nada en la propiedad Connection, y has intentado ejecutarlo.

    Remitiéndonos a tu código vemos que efectivamente es así: tienes código para abrir una conexión, pero luego esa conexión nunca se la entregas al SqlCommand, e intentas ejecutarlo. Como es lógico, el SqlCommand da un error diciendo que no puede ejecutarse porque no tiene conexión.

    sábado, 27 de abril de 2019 13:22
    Moderador
  • En mi país el documento nacional de identidad o también denominado DNI es un número de 8 dígitos seguidos y el número de celular es un número de 9 dígitos seguidos. El tema de los espacio o formato de muestra para por ejemplo mostrar los números de celular tengo entendido que se puede manejar con código en VS o en SQL.

    Sobre los parámetros he creado una clase Usuario que instancié en el método del botón guardar para mediante la instancia poder llamarlos con su método (set/get) y asignarlos a las variables de entrada de mi SP. 

    Por otro lado tu aporte me ayudó a solucionar mi problema, me faltaba agregar esos parámetros a la instancia del SqlCommand.


    SqlCommand cmd = new SqlCommand("SP_AgregarNuevoUsuario",oInsertar.ObtenerConexionSQL());

    Gracias por tu ayuda.!


    sábado, 27 de abril de 2019 14:49
  • - Para que defienes la clase ConexionSQL ? no tiene ningun sentido, solo agrega doficultad en el codigo

    Bueno leí que es lo mejor para en vez estar declarando la cadena de conexión solo llamar a los métodos.

    - porque defines y asignas la clase Usuario si unas lineas debajo poner los datos directo a los parametros del SqlCommand, no tiene sentido

    Es verdad, mejoraré mi código mediante el artículo que publicaste y programaré en capas

    Gracias por tu ayuda.!

    sábado, 27 de abril de 2019 15:00
  • De nada
    sábado, 27 de abril de 2019 15:01