none
Insertar datos de Datagridview en una tabla de Access RRS feed

  • Pregunta

  • Hola buenos dias quisiera que me ayuden a desarollar el siguiente codigo que les voy a compartir. Lo que intento hacer es insertar filas de un datagridview sin estar enlazado a datos a una tabla de una base de datos en access


    private void button3_Click_3(object sender, EventArgs e)
            {

    //Cadena de conexion a la base de datos

    OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\StockControl\\DataStock.accdb");

    //pruebo si la conexion se realizo           

               try
                {
                    con.Open();
                    MessageBox.Show("Conexion establecida");
                }
                finally
                {


                }

    //realizo el insert a la tabla llamada Caja

                for (int i = 0; i < GridCarro.Rows.Count - 1; i++)
                {
                    OleDbCommand cmd = new OleDbCommand("INSERT INTO Caja (Detalle, Entrada, Fecha, Salida, Producto, Codigo)VALUES('"+GridCarro.Rows[i].Cells[0].Value+"','"+GridCarro.Rows[i].Cells[1].Value+"')", con);
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                    GridCarro.Rows.Clear();
                }
                
            }

    Como veran ese es mi codigo pero cuando le hago click en el button no me hace nada ni tampo me da error. Quisiera saber que es lo que me esta faltando. Muchas gracias


    • Editado JoacoFro viernes, 14 de febrero de 2020 11:54
    viernes, 14 de febrero de 2020 11:53

Respuestas

  • hola

    Porque usas la linea

    GridCarro.Rows.Clear();

    dentro del for ? de esta forma en la primer iteracion ya estas eliminando las rows que estas recorriendo, eso no tiene sentido

    Tu codigo deberia ser como este

    private void button3_Click_3(object sender, EventArgs e)
    {
    
       try
    	{
    		string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\StockControl\\DataStock.accdb";
    		using(OleDbConnection con = new OleDbConnection(connstring))
    		{
    			con.Open();
    			
    			string query = "INSERT INTO Caja (Detalle, Entrada, Fecha, Salida, Producto, Codigo)VALUES(@detalle, @entrada, ....)";
    			OleDbCommand cmd = new OleDbCommand(query, con);
    				
    
    			for (var row in GridCarro.Rows)
    			{
    				cmd.Parameters.Clear();
    				cmd.Parameters.AddWithValue("@detalle", row.Cells[0].Value.ToString());
    				cmd.Parameters.AddWithValue("@entrada", row.Cells[1].Value.ToString());
    				
    				//y el resto de los parametro ?
    				
    				cmd.ExecuteNonQuery();
    			}
    		}
    		
    	}
    	catch(Exception ex)
    	{
    		Messagebox.Show(ex.Message);
    	}
    	
    	GridCarro.Rows.Clear();
    	
    }

    pero alli veo que solo defines solo dos valores del insert y el resto ?

    donde estan los valores para Fecha, Salida, Producto,etc

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 14 de febrero de 2020 14:52
  • hola

    ya edite el ejemplo y corregi el codigo

    recuerda que debes asignar los parametros en el tipo de dato correcto, si el tipo de campo en la db es string entonces lo debes asignar con ese tipo, pero si es numerico debes convertir a ese tipo de dato


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 14 de febrero de 2020 16:46

Todas las respuestas

  • Hola buenos dias quisiera que me ayuden a desarollar el siguiente codigo que les voy a compartir. Lo que intento hacer es insertar filas de un datagridview sin estar enlazado a datos a una tabla de una base de datos en access


    private void button3_Click_3(object sender, EventArgs e)
            {

    //Cadena de conexion a la base de datos

    OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\StockControl\\DataStock.accdb");

    //pruebo si la conexion se realizo           

               try
                {
                    con.Open();
                    MessageBox.Show("Conexion establecida");
                }
                finally
                {


                }

    //realizo el insert a la tabla llamada Caja

                for (int i = 0; i < GridCarro.Rows.Count - 1; i++)
                {
                    OleDbCommand cmd = new OleDbCommand("INSERT INTO Caja (Detalle, Entrada, Fecha, Salida, Producto, Codigo)VALUES('"+GridCarro.Rows[i].Cells[0].Value+"','"+GridCarro.Rows[i].Cells[1].Value+"')", con);
                    con.Open();
                    cmd.ExecuteNonQuery();
                    con.Close();
                    GridCarro.Rows.Clear();
                }
                
            }

    Como veran ese es mi codigo pero cuando le hago click en el button no me hace nada ni tampo me da error. Quisiera saber que es lo que me esta faltando. Muchas gracias


    hola joaco pon un punto de control en 

    cmd.ExecuteNonQuery();

    ubica el puntero del cursor en cmd y mira que te muestra, ademas coloca el for todo el código en el try{

    y trata de atrapar la excepción con un catch Exception e { MessageBox.Show("Error al insertar columna." +e);}

    si quieres obtener la excepción de oledb utiliza OleDbException e

    además te hacen falta columnas en el value para lo que expones en el insert


    viernes, 14 de febrero de 2020 12:34
  • hola

    Porque usas la linea

    GridCarro.Rows.Clear();

    dentro del for ? de esta forma en la primer iteracion ya estas eliminando las rows que estas recorriendo, eso no tiene sentido

    Tu codigo deberia ser como este

    private void button3_Click_3(object sender, EventArgs e)
    {
    
       try
    	{
    		string connstring = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\StockControl\\DataStock.accdb";
    		using(OleDbConnection con = new OleDbConnection(connstring))
    		{
    			con.Open();
    			
    			string query = "INSERT INTO Caja (Detalle, Entrada, Fecha, Salida, Producto, Codigo)VALUES(@detalle, @entrada, ....)";
    			OleDbCommand cmd = new OleDbCommand(query, con);
    				
    
    			for (var row in GridCarro.Rows)
    			{
    				cmd.Parameters.Clear();
    				cmd.Parameters.AddWithValue("@detalle", row.Cells[0].Value.ToString());
    				cmd.Parameters.AddWithValue("@entrada", row.Cells[1].Value.ToString());
    				
    				//y el resto de los parametro ?
    				
    				cmd.ExecuteNonQuery();
    			}
    		}
    		
    	}
    	catch(Exception ex)
    	{
    		Messagebox.Show(ex.Message);
    	}
    	
    	GridCarro.Rows.Clear();
    	
    }

    pero alli veo que solo defines solo dos valores del insert y el resto ?

    donde estan los valores para Fecha, Salida, Producto,etc

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 14 de febrero de 2020 14:52
  • Muchas griacias por tu respuesta ya agregue los valores que faltaban del insert lo unico que me esta saliendo 2 errores en las siguientes lineas

    OleDbCommand cmd = new OleDbCommand(, con);

    El error en la linea de arriba es el siguiente: Falta un argumento   

    cmd.Parameters.AddWithValue("@detalle", row.Cells[0].Value); cmd.Parameters.AddWithValue("@entrada", row.Cells[1].Value);

     El error en la linea de arriba es el siguiente: "object" no contiene una definición para "Cells" ni un método de extensión accesible "Cells" que acepte un primer argumento del tipo "object" (¿falta alguna directiva using o una referencia de ensamblado?)  

    viernes, 14 de febrero de 2020 15:54
  • hola

    ya edite el ejemplo y corregi el codigo

    recuerda que debes asignar los parametros en el tipo de dato correcto, si el tipo de campo en la db es string entonces lo debes asignar con ese tipo, pero si es numerico debes convertir a ese tipo de dato


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    viernes, 14 de febrero de 2020 16:46