0

Tengo dos tablas personas y mediciones. idPersona es la llave primaria de personas. Y mediciones está relacionada a esta con idPersona. Estoy haciendo una carga masiva desde excel y los datos deben insertarse en estas dos tablas.

SqlConnection conn = new SqlConnection(.......);
conn.Open();

string query = "Insert into personaFisica (curp,nombre,apellidoPaterno,apellidoMaterno,fechaNacimiento,idGenero,idEscolaridad,idEstatusEscolaridad,idNivelMarginacion,idEstado,anio,mes)";
query += "values('" + columns[0] + "','" + columns[1] + "','" + columns[2] + "','" + columns[3] + "','" + Convert.ToDateTime(columns[4]).ToString("dd/MM/yyyy") + "','" + columns[5] + "','" + columns[6] + "','" + columns[7] + "','" + columns[8] + "','" + columns[9] + "','" + columns[10] + "','" + columns[11]+ "')";


query += "Insert into diagnosticoFisico (idPersona,activacion,medicion,presionSistolica,presionDiastolica,pulsoEnReposo,pulsoEnEsfuerzo,tiempo,consumoOxigeno,peso,estatura,cadera,cintura,porcentajeGraso,abdominales,lagartijas)";
query += "values( '" + columns[12] + "','" + columns[13] + "','" + columns[14] + "','" + columns[15] + "','" + columns[16] + "','" + columns[17] + "','" + columns[18] + "','" + columns[19] + "','" + columns[20] + "','" + columns[21] + "','" + columns[22] + "','" + columns[23] + "','" + columns[24] + "','" + columns[25] + "','" + columns[26] + "')";
SqlCommand comm = new SqlCommand(query, conn);
filas = comm.ExecuteNonQuery();

El problema con hacerlo con el código arriba es que inserta datos en la primera tabla. Pero en la segunda ya no lo permite, pues el valor de idPersona lo lleva vacío y no sé cómo pasarle ese valor.

sstan
  • 16,591
  • 2
  • 21
  • 45

1 Answers1

1

Me imagino que idPersona es una columna identity. De ser el caso, puedes usar scope_identity() para recuperar el valor de idPersona del registro insertado en la tabla personaFisica.

Aquí te dejo un ejemplo con código de cómo se puede usar esta técnica. Pero, por no conocer la estructura de tu tabla, voy a usar una versión simplificada de tus tablas. Pero la idea general del ejemplo es lo que cuenta.

Asumiendo las 2 tablas siguientes:

create table personaFisica (
  idPersona int identity not null primary key,
  nombre varchar(50) not null
);
go

create table diagnosticoFisico (
  idDiagnostico int identity not null primary key,
  idPersona int not null,
  constraint diagnosticoFisicoFk
  foreign key (idPersona)
  references personaFisica (idPersona)
);
go

Ejemplo de insert en las 2 tablas:

using (var conn = new SqlConnection("..."))
{
    conn.Open();

    int idPersona;

    using (var cmd = new SqlCommand(
        "insert into personaFisica (nombre) values (@nombre); select cast(scope_identity() as int);",
        conn))
    {
        cmd.Parameters.AddWithValue("@nombre", "John Doe");
        idPersona = (int)cmd.ExecuteScalar();
    }

    using (var cmd = new SqlCommand(
        "insert into diagnosticoFisico (idPersona) values (@idPersona)",
        conn))
    {
        cmd.Parameters.AddWithValue("@idPersona", idPersona);
        cmd.ExecuteNonQuery();
    }
}

Nota adicional

Notarás que uso parámetros para incluir los valores en el insert, mas bien que concatenar los valores directamente en la cadena SQL. Te sugiero de adoptar esta práctica. Tiene muchas ventajas, y te protege de inyección SQL.

Edición: Usando OUTPUT en vez de scope_identity()

Una alternativa, que es un poco mejor que usar scope_identity(), es la de usar OUTPUT. Ambas opciones son muy similares y sirven el mismo propósito en esta situación. Pero en casos mas especiales envolviendo ciertos triggers, puede que scope_identity() no funcione correctamente.

Aquí tienes el código equivalente al anterior, pero usando OUTPUT:

using (var conn = new SqlConnection("..."))
{
    conn.Open();

    int idPersona;

    using (var cmd = new SqlCommand(
        "insert into personaFisica (nombre) output inserted.idPersona values (@nombre)",
        conn))
    {
        cmd.Parameters.AddWithValue("@nombre", "John Doe");
        idPersona = (int)cmd.ExecuteScalar();
    }

    using (var cmd = new SqlCommand(
        "insert into diagnosticoFisico (idPersona) values (@idPersona)",
        conn))
    {
        cmd.Parameters.AddWithValue("@idPersona", idPersona);
        cmd.ExecuteNonQuery();
    }
}
sstan
  • 16,591
  • 2
  • 21
  • 45