none
foraneas asp.net RRS feed

  • Pregunta

  • estoy registrando dos tablas tipo_unidad y producto  pero tengo la id de tipo unidad en producto  pero en c# guardo los registro de  las dos tablas al  mismo tiempo en un boton pero esa foranea no me enlaza en producto 

    tengo esto pero naa 

    int id  = Guid.NewGuid();


    • Editado Figueroa97 sábado, 27 de agosto de 2016 21:42
    • Cambiado Sergio Parra lunes, 29 de agosto de 2016 6:52 Pregunta sobre acceso a datos y relaciones entre tablas
    sábado, 27 de agosto de 2016 21:39

Todas las respuestas

  • Figueroa97,

    ¿Por qué utilizas una estructura GUID?

    El procedimiento que debes de seguir es bastante simple:

    1. Insertas una fila en la tabla Tipo_Unidad
    2. Recuperas el id generado (en caso tengas una PK auto-numérica). Para obtener el ID autogenerado debes usar la función SCOPE_IDENTITY().
    3. Pasas como valor de inserción de la tabla Producto el id generado.

    /*Consulta de acción de la primera tabla*/
    INSERT INTO T1
            (Col1, Col2, Col3)
    VALUES
            (@Col1, @Col2, @Col3)
    
    SELECT SCOPE_IDENTITY(); /*retornas el id generado*/

    En tu aplicación podrías recuperar el id generado para pasarlo como valor de parámetro a la segunda inserción:

    /*Primera inserción*/
    cmd.CommandText = "INSERT INTO T (Col1, Col2) VALUES(@Col1, @Col2); SELECT SCOPE_IDENTITY()"; 
    cmd.Parameters.AddWithValue(...)
    int id = cmd.ExecuteScalar();
    
    /*Segunda inserción*/
    /*...*/
    cmd.Parameters...
    cmd.Parameters.AddWithValue(@ParamFK, id)
    
    cmd.ExecuteNonQuery();


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 27 de agosto de 2016 21:55
  • no entiendo el select scope_identity me haces llegar informacion basado de eso 

    domingo, 28 de agosto de 2016 3:07
  • Figueroa97,

    Muéstranos el diseño de ambas tablas (estructura) e indícanos si ambas PK son auto-generadas (IDENTITY)

    domingo, 28 de agosto de 2016 3:10
  • create table bd
    use bd

    create table insumo 
    (
    id_insumo int primary key identity (1,1),
    unidad_id int foreign key references unidad (unidad_id),
    valor_unitario numeric (37),
    valor_compra numeric (37)
    )

    create table unidad
    (
    unidad_id int primary key identity (1,1),
    peso_kl numeric (37),
    ml numeric (37);
    )
    domingo, 28 de agosto de 2016 3:18
  • Figueroa97,

    ¿No se trataba de las tablas [tipo_unidad] y [producto]?, bueno, este caso es el mismo:

    Cuando insertas una fila en una tabla cuya clave primaria tiene el atributo IDENTITY el valor se auto-genera, no es un valor predecible, por tanto debes de buscar una forma de obtener dicho valor, esa forma es la función SCOPE_IDENTITY(), si requieres mayor información puedes referirte a los boletines on-line de SQL Server. Dicho valor debe capturarse en el contexto de la inserción, por tanto, tu consulta de inserción debería ser la siguiente:

    try 
    {
    	using (SqlConnection cn = new SqlConnection("<Colocar cadena de conexión>")) 
    	{
    		cn.Open();
    		
    		string ConsultaSQL = @"INSERT INTO tipo_unidad (peso_kl, ml) 
    			VALUES (@peso_kl, @ml); SELECT SCOPE_IDENTITY();";
    		
    		SqlCommand cmd = new SqlCommand(ConsultaSQL, cn);
    
    		cmd.Parameters.AddWithValue("@peso_kl", TextBox1.Text);
    		cmd.Parameters.AddWithValue("@ml", TextBox2.Text);		
    
    		//Se ejecuta la consulta sql y se recuperá el ID generado
    		int unidad_id = cmd.ExecuteScalar();
    	}
    } 
    catch (Exception ex) 
    {
    	MessageBox.Show(ex.Message);
    }

    Está primera parte muestra la primera inserción y la manera como podrías obtener el valor generado de la columna [unidad_id], la segunda parte del código será insertar la segunda tabla agregando como valor de la columna referencia la variable unidad_id: (código completo)

    try 
    {
    	using (SqlConnection cn = new SqlConnection("<Colocar cadena de conexión>")) 
    	{
    		cn.Open();
    		
    		//Insertar tabla tipo_unidad
    		string ConsultaSQL = @"INSERT INTO tipo_unidad (peso_kl, ml) 
    			VALUES (@peso_kl, @ml); SELECT SCOPE_IDENTITY();";
    		
    		SqlCommand cmd = new SqlCommand(ConsultaSQL, cn);
    
    		cmd.Parameters.AddWithValue("@peso_kl", TextBox1.Text);
    		cmd.Parameters.AddWithValue("@ml", TextBox2.Text);		
    
    		//Se ejecuta la consulta sql y se recuperá el ID generado
    		int unidad_id = cmd.ExecuteScalar();
    		
    		
    		//Insertar tabla insumo
    		ConsultaSQL = @"INSERT INTO insumo (unidad_id, valor_unitario, valor_compra) 
    			VALUES (@unidad_id, @valor_unitario, @valor_compra)";
    		
    		cmd.CommandText = ConsultaSQL;
    
    		cmd.Parameters.AddWithValue("@unidad_id", unidad_id);
    		cmd.Parameters.AddWithValue("@valor_unitario", TextBox3.Text);		
    		cmd.Parameters.AddWithValue("@valor_compra", TextBox4.Text);		
    
    		cmd.ExecuteNonQuery();
    	}
    } 
    catch (Exception ex) 
    {
    	MessageBox.Show(ex.Message);
    }

    Es todo, analiza el código, depura si hay algún error de sintaxis y si tienes alguna duda sobre el código lo comentas.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 28 de agosto de 2016 3:31
  • te voy a hacer franco no entiendo tu codigo bueno si la primera parte cuando haces el isnert bueno cre q tu lo haces la conexion de otra forma esta es mi conexion 

      public DataTable Consultas(string scriptConsulta)
            {
                SqlConnection conex = new SqlConnection(conection());
                SqlCommand lector = new SqlCommand(scriptConsulta, conex);
                SqlDataAdapter VistaRespuesta = new SqlDataAdapter(lector);
                DataTable tabla1 = new DataTable();
    
                conex.Open();
                VistaRespuesta.Fill(tabla1);
                conex.Close();
                lector.Dispose();
    
                return tabla1;
            }

    y de esta forma inserto los registro 

            public string registar_cantida(int cantida,  int valor_unitario,string fecha,int valor_compra_total) 
            {
                string sql = string.Format(@"INSERT INTO insumo  (cantidad,propiedades_id, unidad_id,valor_unitario, fecha ,valor_compra_total)values ('" + cantida + "','" + valor_unitario + "','" + fecha + "','" + valor_compra_total + "')");
                string tabla1 = cbd.CRUD(sql);
                return tabla1;
            }
            public string registar_tipo_unidad(int  peso_kilos, int v_litros, int unidad)
            {
                string sql = string.Format(@"INSERT INTO tipo_unidad  (peso_kilos,v_litros,unidad )values ('" + peso_kilos + "','" + v_litros + "','" + unidad + "'SELECT SCOPE_IDENTITY())");
                string tabla1 = cbd.CRUD(sql);
                return tabla1;
            }
           
    


    domingo, 28 de agosto de 2016 3:39
  • hola

    Un primer consejo, sino usas parametros en el codigo entonces consideralo incorrecto, unir en un string los valores esta mal

    ese metodo cbd.CRUD() es una pesima implementacion sino lo adaptas para permitir parametros

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 29 de agosto de 2016 4:12
  • Lo que noto es que en ningun momento recuperas el id que genera la base de datos, o sea los campos de la tabla los defines como IDENTITY o sea al insertar la tabla genera el id que nunca recuperas desde tu codigo

    El guid no tiene ninguna utilidad en este caso, ya que es la db al realizar el insert quien la genera.

    public int registar_cantidad(int cantidad, int unidad, int valor_unitario,string fecha, int total)
    {
    	using (SqlConnection conn = new SqlConnection(conection()))  
    	{  
    		conn.Open();  
    	 
    		string query = "INSERT INTO insumo  (cantidad, unidad_id,valor_unitario, fecha ,valor_compra_total) values (@cantidad, @unidad, @valor_unitario, @fecha, @total)
    						SELECT SCOPE_IDENTITY()";  
    		SqlCommand cmd = new SqlCommand(query, conn);  
    		cmd.Parameters.AddWithValue("@cantidad", cantidad);  
    		cmd.Parameters.AddWithValue("@unidad", unidad); 
    		cmd.Parameters.AddWithValue("@valor_unitario", valor_unitario);  
    		cmd.Parameters.AddWithValue("@fecha", fecha); 
    		cmd.Parameters.AddWithValue("@total", total); 
    	 
    		return Convert.ToInt32(cmd.ExecuteScalar());  
    	 
    	} 
    }	
    
    public int registar_tipo_unidad(int  peso_kilos, int v_litros, int unidad)
    {
    	using (SqlConnection conn = new SqlConnection(conection()))  
    	{  
    		conn.Open();  
    	 
    		string query = "INSERT INTO tipo_unidad  (peso_kilos,v_litros,unidad) values (@peso_kilos, @v_litros, @unidad)
    						SELECT SCOPE_IDENTITY()";  
    		SqlCommand cmd = new SqlCommand(query, conn);  
    		cmd.Parameters.AddWithValue("@peso_kilos", peso_kilos);  
    		cmd.Parameters.AddWithValue("@v_litros", v_litros);  
    		cmd.Parameters.AddWithValue("@v_litros", unidad); 
    	 
    		return Convert.ToInt32(cmd.ExecuteScalar());  
    	 
    	} 
    }

    para usar estos metodos seria

    int unidadId = registar_tipo_unidad(...);
    
    int insumoId = registar_cantidad(.., unidadId, ....);

    la idea es que retornes el id generado cuando insertas para eso esta el SCOPE_IDENTITY y el ExecuteScalar()

    [ADO.NET] –  Campos autonumericos

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 29 de agosto de 2016 5:02