none
Como Guardar los datos de un gridview en una base de datos sql server? RRS feed

  • Pregunta

  • Hola gente estoy desarrollando un tipo de carrito de compras que pueda almacenar en una base de datos los pedidos y cuando quiero guardar sale este un error que dice asi  "Se produjo una excepción de tipo 'System.ArgumentOutOfRangeException' en mscorlib.dll pero no se controló en el código del usuario

    Información adicional: El índice estaba fuera del intervalo. Debe ser un valor no negativo e inferior al tamaño de la colección." el error sale en la variable referencia
      protected void Button2_Click(object sender, EventArgs e)
            {
                string usu = (string)Session["usu"];
                int cliente = Convert.ToInt32(DropDownList1.SelectedValue.ToString());
                int cant_item = Convert.ToInt32(GridView2.Rows.Count.ToString());
    
    
                foreach (GridViewRow row in GridView1.Rows)
                {
                    string referencia = GridView2.Rows[2].ToString();
                    string descripcion = GridView2.Rows[3].ToString();
                    int cantidad = Convert.ToInt32(GridView2.Rows[4].ToString());
    
    
    
    
                    con.Open();
    
                    string query = "insert into pedido_lite (idcliente,iduser,ref_item,desc_item,cant_item,cant_total_item) values(@usu,@cliente,@referencia,@descrípcion,@cantidad,@cant_item) ";
                    SqlCommand cmd = new SqlCommand(query, con);
                    cmd.Parameters.AddWithValue("@usu", usu);
                    cmd.Parameters.AddWithValue("@cliente", cliente);
                    cmd.Parameters.AddWithValue("@referencia", referencia );
                    cmd.Parameters.AddWithValue("@descrípcion", descripcion);
                    cmd.Parameters.AddWithValue("@cantidad", cantidad);
                    cmd.Parameters.AddWithValue("@cant_item", cant_item);
    
    
                    Response.Write("Pedido realizado papu");
                    con.Close();
    
                }
    
    
    
            }
    la cantidad y el cliente los capturo en un formulario 
    viernes, 9 de septiembre de 2016 21:54

Respuestas

  • Juan Camilo Narvaez,

    El índice que colocas entre corchetes luego de la propiedad Rows es el índice que referencia a una fila de la colección de filas, no representa el índice de la celda, te recomiendo tomar la siguiente estructura:

    protected void Button2_Click(object sender, EventArgs e)
    {
    	using (SqlConnection con = new SqlConnection("<Colocar cadena de conexión>")) 
    	{
    		string usu = (string)Session["usu"];
    		int cliente = Convert.ToInt32(DropDownList1.SelectedValue);
    		int cant_item = Convert.ToInt32(GridView2.Rows.Count);
    
    		con.Open();
    		
    		string query = "INSERT INTO ...";
    		
    		foreach (GridViewRow row in GridView1.Rows)
    		{
    			if (row != null)
    			{
    				string referencia = row.Cells[2].ToString();
    				string descripcion = row.Cells[3].ToString();
    				int cantidad = Convert.ToInt32(row.Cells[4]);
    				
    				SqlCommand cmd = new SqlCommand(query, con);
    				
    				cmd.Parameters.AddWithValue("@usu", usu);
    				cmd.Parameters.AddWithValue("@cliente", cliente);
    				cmd.Parameters.AddWithValue("@referencia", referencia );
    				cmd.Parameters.AddWithValue("@descrípcion", descripcion);
    				cmd.Parameters.AddWithValue("@cantidad", cantidad);
    				cmd.Parameters.AddWithValue("@cant_item", cant_item);
    
    				cmd.ExecuteNonQuery();
    			}		
    		}	
    	}
    	
    	Response.Write("Pedido realizado papu");
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 9 de septiembre de 2016 22:36
  • Hola Juan Camilo Narvaez,

    Debes de tomar atención a la respuesta propuesta. Además deberías limpiar los parámetros.

                foreach (GridViewRow row in GridView1.Rows)
                {
                    cmd.Parameters.Clear();
    
                    cmd.Parameters.AddWithValue("@ref_item", row.Cells[0].Text);
                    cmd.Parameters.AddWithValue("@referencia", row.Cells[1].Text);
                    //demás parámetros ...
    
                    //Ejecutas la consulta
                    cmd.ExecuteNonQuery();
                }


    Dónde Cells[valor] representa las columnas, ten en cuenta que comienzan de 0 (primera columna), 1 (segunda columna), etc.

    Además, no debes usar el Response para mandar el mensaje, podrías hacer :

     ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alert",
                        "alert('Pedido realizado papu')", true);

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 12 de septiembre de 2016 21:44

Todas las respuestas

  • Juan Camilo Narvaez,

    El índice que colocas entre corchetes luego de la propiedad Rows es el índice que referencia a una fila de la colección de filas, no representa el índice de la celda, te recomiendo tomar la siguiente estructura:

    protected void Button2_Click(object sender, EventArgs e)
    {
    	using (SqlConnection con = new SqlConnection("<Colocar cadena de conexión>")) 
    	{
    		string usu = (string)Session["usu"];
    		int cliente = Convert.ToInt32(DropDownList1.SelectedValue);
    		int cant_item = Convert.ToInt32(GridView2.Rows.Count);
    
    		con.Open();
    		
    		string query = "INSERT INTO ...";
    		
    		foreach (GridViewRow row in GridView1.Rows)
    		{
    			if (row != null)
    			{
    				string referencia = row.Cells[2].ToString();
    				string descripcion = row.Cells[3].ToString();
    				int cantidad = Convert.ToInt32(row.Cells[4]);
    				
    				SqlCommand cmd = new SqlCommand(query, con);
    				
    				cmd.Parameters.AddWithValue("@usu", usu);
    				cmd.Parameters.AddWithValue("@cliente", cliente);
    				cmd.Parameters.AddWithValue("@referencia", referencia );
    				cmd.Parameters.AddWithValue("@descrípcion", descripcion);
    				cmd.Parameters.AddWithValue("@cantidad", cantidad);
    				cmd.Parameters.AddWithValue("@cant_item", cant_item);
    
    				cmd.ExecuteNonQuery();
    			}		
    		}	
    	}
    	
    	Response.Write("Pedido realizado papu");
    }


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    viernes, 9 de septiembre de 2016 22:36
  • Hola william mira aplique el Cells en ves de Rows y me salio este error: "Gridview no contiene una deficion para 'cells' ni se encuentran en ningun metodo de extencion cells que acepte un primer argumento de gridview(¿falta una directiva using o una referencia de ensamblado?)"

    aca una vista de mi codigo completo

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Data;
    using System.Data.SqlClient;
    using clases;
    
    
    
    
    namespace pcp
    
    {
        public partial class items : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
                    grid();
                }
                if (Session["usu"] == null) {
                    Response.Redirect("login.aspx");
                }
                bindtoddl();
    
    
    
            }
            SqlConnection con = new SqlConnection(@"Data Source=SERPS1ESA;Initial Catalog=Pruebas;Persist Security Info=True;User ID=soporteprim;Password=Sprima2016");
    
            protected void chkselect_CheckedChanged(object sender, EventArgs e)
            {
                selectrow();
                bindgrid();
    
            }
          
            protected void grid()
            {
                con.Open();
                SqlDataAdapter da = new SqlDataAdapter("select * from t120_mc_items",con);
                DataTable dt = new DataTable();
                da.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();
                con.Close();
    
            }
            protected void bindgrid()
            {
                DataTable dt = (DataTable)ViewState["GetRecords"];
                GridView2.DataSource = dt;
                GridView2.DataBind();
    
            }
            private DataTable createtable()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("f120_id");
                dt.Columns.Add("f120_referencia");
                dt.Columns.Add("f120_descripcion");
                dt.AcceptChanges();
                return dt;
            }
            private DataTable addrow(GridViewRow gvrow,DataTable dt)
            {
                DataRow[] dr = dt.Select("f120_id='"+gvrow.Cells[1].Text+"'");
                if (dr.Length <= 0)
                {
                    dt.Rows.Add();
                    int rowscount = dt.Rows.Count - 1;
                    dt.Rows[rowscount]["f120_id"] = gvrow.Cells[1].Text;
                    dt.Rows[rowscount]["f120_referencia"] = gvrow.Cells[2].Text;
                    dt.Rows[rowscount]["f120_descripcion"] = gvrow.Cells[3].Text;
                    dt.AcceptChanges();
    
                    
                }
                return dt;
            }
            private DataTable remove(GridViewRow gvrow, DataTable dt)
            {
                DataRow[] dr = dt.Select("f120_id='" + gvrow.Cells[1].Text + "'");
                if (dr.Length > 0)
                {
                    dt.Rows.Remove(dr[0]);
                    dt.AcceptChanges();
                }
                return dt;
            }
            private void selectrow()
            {
                DataTable dt;
                if (ViewState["GetRecords"] != null)
                    dt = (DataTable)ViewState["GetRecords"];
                else
                    dt = createtable();
                for(int i =0;i <GridView1.Rows.Count; i++)
                {
                    CheckBox chk = ((CheckBox)GridView1.Rows[i].Cells[0].FindControl("chkselect"));
                    if (chk.Checked)
                    {
                        dt = addrow(GridView1.Rows[i], dt);
                    }
                    else
                    {
                        dt = remove(GridView1.Rows[i], dt);
                    }
    
                }
                ViewState["GetRecords"]= dt;
            }
           
    
            protected void Button1_Click(object sender, EventArgs e)
            {
             
                
                con.Open();
                SqlDataAdapter da = new SqlDataAdapter("select  * from t120_mc_items where f120_id = '" + TextBox1.Text+ "'and f120_id_cia <> 1", con);
                DataTable dt = new DataTable();
                da.Fill(dt);
                GridView1.DataSource = dt;
                GridView1.DataBind();
                con.Close();
    
    
            }
    
            protected void Home_Click(object sender, EventArgs e)
            {
                Response.Redirect("index.aspx");
            }
    
            protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
            {
                GridView1.PageIndex = e.NewPageIndex;
            }
    
            protected void Button2_Click(object sender, EventArgs e)
            {
                string usu = (string)Session["usu"];
                int cliente = Convert.ToInt32(DropDownList1.SelectedValue.ToString());
                int cant_item = Convert.ToInt32(GridView2.Rows.Count.ToString());
                con.Open();
    
                string query = "insert into pedido_lite (idcliente,iduser,ref_item,desc_item,cant_item,cant_total_item) values(@usu,@cliente,@referencia,@descrípcion,@cantidad,@cant_item) ";
                SqlCommand cmd = new SqlCommand(query, con);
    
                cmd.Parameters.AddWithValue("@usu", usu);
                cmd.Parameters.AddWithValue("@cliente", cliente);
    
                foreach (GridViewRow row in GridView2.Rows)
              
                    {
                        cmd.Parameters.AddWithValue("@ref_item", GridView2.Cells[1].ToString());
                        cmd.Parameters.AddWithValue("@referencia", GridView2.Rows[2].ToString());
                        cmd.Parameters.AddWithValue("@descrípcion", GridView2.Rows[3].ToString());
                        cmd.Parameters.AddWithValue("@cantidad", Convert.ToInt32(GridView2.Rows[4].ToString()));
                        cmd.Parameters.AddWithValue("@cant_item", Convert.ToInt32(GridView2.Rows.Count.ToString()));
                    }
                    cmd.ExecuteNonQuery();
                
                Response.Write("Pedido realizado papu");
                con.Close();
    
    
    
    
            }
            private void bindtoddl()
            {
    
                con.Open();
                SqlCommand cmd = new SqlCommand("SELECT  f215_rowid_tercero, f215_descripcion FROM t215_mm_puntos_envio_cliente", con);
                SqlDataAdapter sda = new SqlDataAdapter(cmd);
                DataSet ds = new DataSet();
                sda.Fill(ds);
                DropDownList1.DataSource = ds;
                DropDownList1.DataTextField = "f215_descripcion";
                DropDownList1.DataValueField = "f215_rowid_tercero";
                DropDownList1.DataBind();
                con.Close();
    
              
              
               
                con.Close();
             
                 }
              
                
    
            }
    
            
        }
       


    lunes, 12 de septiembre de 2016 19:53
  • Hola Juan Camilo Narvaez,

    Debes de tomar atención a la respuesta propuesta. Además deberías limpiar los parámetros.

                foreach (GridViewRow row in GridView1.Rows)
                {
                    cmd.Parameters.Clear();
    
                    cmd.Parameters.AddWithValue("@ref_item", row.Cells[0].Text);
                    cmd.Parameters.AddWithValue("@referencia", row.Cells[1].Text);
                    //demás parámetros ...
    
                    //Ejecutas la consulta
                    cmd.ExecuteNonQuery();
                }


    Dónde Cells[valor] representa las columnas, ten en cuenta que comienzan de 0 (primera columna), 1 (segunda columna), etc.

    Además, no debes usar el Response para mandar el mensaje, podrías hacer :

     ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "alert",
                        "alert('Pedido realizado papu')", true);

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 12 de septiembre de 2016 21:44
  • oye muchas gracias me ayudo mucho tu aporte ahora salio otro error pero ya intentare arreglarlo gracias 
    miércoles, 14 de septiembre de 2016 14:52