SoloCodigo

CLR: .Net / Mono / Boo / Otros CLR => C# => Mensaje iniciado por: Rafa_Code en Miércoles 27 de Julio de 2011, 20:31

Título: REFERECIA A OBJETO NO ESTABLECIDA COMO INSTANCIA A UN OBJETO
Publicado por: Rafa_Code en Miércoles 27 de Julio de 2011, 20:31
Buenas Tardes! estoy intentando guardar unos DATOS(CODIGO, DESCRIPCION,CANTIDAD,PRECIO) Y UNA FOTO. pero luego de llenar los datos y seleccionar la foto al presionar el BotonGuardar me aparece un MessageBox que dice "REFERECIA A OBJETO NO ESTABLECIDA COMO INSTANCIA A UN OBJETO" y no guarda el Registro

Aqui les dejo el codigo http://chopapp.com/#5rw3jefl 

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace GuardaImagenEnBD
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();

            DialogResult result = dialog.ShowDialog();

            if (DialogResult == DialogResult.OK)
            {
                pictureBox1.Image = Image.FromFile(dialog.FileName);

            }
        }

        private void button1_Click(object sender, EventArgs e)
        {

            try
            {
                System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Data Source=R-PORTATIL;Initial Catalog=ProductosEjemplo;Integrated Security=True");
                using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
                {
                    cmd.Connection = con;
                    cmd.CommandText = "INSERT INTO ProductosEjemplo VALUES (@CODIGO,@DESCRIPCION,@CANTIDAD,@PRECIO,@FOTO)";
                    cmd.Parameters.Add("@CODIGO", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@DESCRIPCION", System.Data.SqlDbType.NVarChar);
                    cmd.Parameters.Add("@CANTIDAD", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@PRECIO", System.Data.SqlDbType.SmallMoney);
                    cmd.Parameters.Add("@FOTO", System.Data.SqlDbType.Image);


                    // Asignando los valores a los atributos
                    cmd.Parameters["@CODIGO"].Value = int.Parse(txtCodigo.Text);
                    cmd.Parameters["@DESCRIPCION"].Value = txtDescripcion.Text;
                    cmd.Parameters["@CANTIDAD"].Value = int.Parse(txtCantidad.Text);
                    cmd.Parameters["@PRECIO"].Value = float.Parse(txtPrecio.Text);


                    //Asignando el valor de la imagen
                    // Stream usado como buffer
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                    {
                        // Se guarda la imagen en el buffer
                        pictureBox1.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        // Se extraen los bytes del buffer para asignarlos como valor para el
                        // parámetro.
                        cmd.Parameters["@FOTO"].Value = ms.GetBuffer();
                    }
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
                con.Close();
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            MessageBox.Show("Registro Guardado Correctamente");
        }
    }
}
(http://img199.imageshack.us/img199/882/errorreferenciaaobjeto2.png)
 :ayuda: :ayuda: :ayuda: :ayuda: :ayuda: :ayuda: :ayuda: :ayuda: :ayuda:
Título: Re:REFERECIA A OBJETO NO ESTABLECIDA COMO INSTANCIA A UN OBJETO
Publicado por: gabio2 en Miércoles 27 de Julio de 2011, 21:39
Seria muyyyy pero muyyy bueno que pongas un punto de interrupción en el evento del botón Guardar y ejecutes paso a paso con la tecla F10 tú código, para saber exactamente en que línea falla, le heche una mirada rápida y pues hasta ahorita mi única duda que me surgio es por que usas esto:

using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
{
....
...
..
.
}

En vez de usarlo así:

System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();


Primera vez que veo que usen algo así no digo que no sea correcto, simplemente curiosidad nunca había visto ese tipo de código..

Bueno, en todo caso.. primero verífica en que linea te envia al Catch ...  por que hasta donde ví lo estás haciendo bien, salvo esa duda que me surgio ...


Saludos. :)
Título: Re:REFERECIA A OBJETO NO ESTABLECIDA COMO INSTANCIA A UN OBJETO
Publicado por: Rafa_Code en Miércoles 27 de Julio de 2011, 22:02
Hola mi pana por constumbre escribo eso asi porque algunas vces se me olvida poner el using en la parte primaria. Hice lo que me dijiste con el punto de interrupcion y aqui lo arroja o se para (http://img221.imageshack.us/img221/3457/errorluegodepuntointerr.png)
Título: Re:REFERECIA A OBJETO NO ESTABLECIDA COMO INSTANCIA A UN OBJETO
Publicado por: Rafa_Code en Miércoles 27 de Julio de 2011, 22:15
i pana aqui le puse breakpoint y mira

(http://[img]http://img109.imageshack.us/img109/4224/errorluegodesugerenciam.png)[/img]
Título: Re:REFERECIA A OBJETO NO ESTABLECIDA COMO INSTANCIA A UN OBJETO
Publicado por: gabio2 en Jueves 28 de Julio de 2011, 08:48
no se ve tu imagen... vuelve a intentarlo.. :)....
Título: Re:REFERECIA A OBJETO NO ESTABLECIDA COMO INSTANCIA A UN OBJETO
Publicado por: Amilius en Miércoles 3 de Agosto de 2011, 23:43
Me parece que esta tratando de acceder al objeto que guarda la imagen "cmd.ExecuteNonQuery()" cuando dicho objeto ya no está disponible.

Trata metiendo esto:
Código: [Seleccionar]
con.Open();
cmd.ExecuteNonQuery();


Dentro de:
Código: [Seleccionar]
using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
{
...
}
Título: Re:REFERECIA A OBJETO NO ESTABLECIDA COMO INSTANCIA A UN OBJETO
Publicado por: zeed.ca en Jueves 3 de Noviembre de 2011, 17:40
hey, qe tal estaba viendo el  código y finalmente esta listo para guardar las imágenes.

solo he cambiado esta linea
donde se establece la cadena de conexion: (@"Data Source=(local);Initial Catalog=EJEMPLO;Integrated Security=SSPI");
y picFoto por picImage, solo trabaje con otro nombre hehe bueno suerte.......

"EJEMPLO" ES EL NOMBRE DE LA BD QUE HE CREADO
Tambien adjunto un zip donde hay imagenes de la BD

 System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Data Source=(local);Initial Catalog=EJEMPLO;Integrated Security=SSPI");




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Error_Guardar_Imagen
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnExaminar_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            DialogResult result = dialog.ShowDialog();
            if (result == DialogResult.OK)
                {
                    picImagen.Image = Image.FromFile(dialog.FileName);
                }

        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {

              {

            try
            {
                System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(@"Data Source=(local);Initial Catalog=EJEMPLO;Integrated Security=SSPI");
                using (System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand())
                {
                    cmd.Connection = con;
                    cmd.CommandText = "INSERT INTO Productos VALUES (@CODIGO,@DESCRIPCION,@CANTIDAD,@PRECIO,@FOTO)";
                    cmd.Parameters.Add("@CODIGO", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@DESCRIPCION", System.Data.SqlDbType.NVarChar);
                    cmd.Parameters.Add("@CANTIDAD", System.Data.SqlDbType.Int);
                    cmd.Parameters.Add("@PRECIO", System.Data.SqlDbType.SmallMoney);
                    cmd.Parameters.Add("@FOTO", System.Data.SqlDbType.Image);


                    // Asignando los valores a los atributos
                    cmd.Parameters["@CODIGO"].Value = int.Parse(txtCodigo.Text);
                    cmd.Parameters["@DESCRIPCION"].Value = txtDescripcion.Text;
                    cmd.Parameters["@CANTIDAD"].Value = int.Parse(txtCantidad.Text);
                    cmd.Parameters["@PRECIO"].Value = float.Parse(txtPrecio.Text);


                    //Asignando el valor de la imagen
                    // Stream usado como buffer
                    using (System.IO.MemoryStream ms = new System.IO.MemoryStream())
                    {
                        // Se guarda la imagen en el buffer
                        picImagen.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                        // Se extraen los bytes del buffer para asignarlos como valor para el
                        // parámetro.
                        cmd.Parameters["@FOTO"].Value = ms.GetBuffer();
                    }
                    con.Open();
                    cmd.ExecuteNonQuery();
                }
                con.Close();
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            MessageBox.Show("Registro Guardado Correctamente");
        }
    }
}                                       

        }