How to update two tables

Asked

Viewed 61 times

0

Good night! I’m having trouble updating two tables at once in C#.

Obs. in this way it updates the CONTACT table, if I invert the UPDATE sequence it updates the CLIENT table, but never the two together. Follows the code:

//Edit Method

    public string Editar(DCadastro cadastro)
    {
        string resp = "";
        SqlCommand cmd = new SqlCommand();
        SqlConnection con = new SqlConnection();

        try
            {
            con.ConnectionString = Conexao.Cn;
            con.Open();
            cmd.Connection = con;
            //// Inicia o escopo de transação
            SqlTransaction transaction = con.BeginTransaction("SampleTransaction");

            //// Informa o SqlCommand em qual escopo que se passará a transação de dados
            cmd.Transaction = transaction;
            cmd.CommandText = "UPDATE CLIENTE SET CLIENTE.nome = @nome  WHERE CLIENTE.idCliente = @idCliente";
            cmd.Parameters.AddWithValue("@nome", cadastro.Nome);
            cmd.Parameters.AddWithValue("@idCliente", cadastro.IdCliente);
            // Segunda consulta.
            cmd.CommandText = "UPDATE CONTATO SET CONTATO.idTipoContato = @idTipoContato, CONTATO.conteudo = @conteudo WHERE CONTATO.idCliente = @idCliente";
            cmd.Parameters.AddWithValue("@idTipoContato", cadastro.IdTipoContato);
            cmd.Parameters.AddWithValue("@conteudo", cadastro.Conteudo);


            resp = cmd.ExecuteNonQuery() == 1 ? "OK" : "Registro não foi inserido";
            // Encerra o escopo de transação passando as operações para Banco de Dados.
            transaction.Commit();
        }
        catch (Exception erro)
        {
            throw erro;
        }
        finally
        {
            if (con.State == System.Data.ConnectionState.Open) con.Close();
        }
        return resp;
    }
  • If this action has to be done ALWAYS in both tables to make sense, you should use a transaction.

  • Cool, I’ll research more and thanks for the tip!

2 answers

1

Looking at the example in the documentation, the recommended would be to call the Executenonquery method to each registered command. It would look like this:

command.CommandText ="Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";
command.ExecuteNonQuery();
command.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";
command.ExecuteNonQuery();

transaction.Commit();
Console.WriteLine("Both records are written to database.");

Source: https://docs.microsoft.com/pt-br/dotnet/api/system.data.sqlclient.sqltransaction?view=netframework-4.7.2

  • It worked with the call of Executenonquery in each UPDATE ... Thanks spartanroger!!

1


Combine the two tables with JOIN using your primary and foreign keys.

The appointment will stay like this:

UPDATE
  CLIENTE 
INNER JOIN
  CONTATO 
ON
  CLIENTE.idCliente = CONTATO.idCliente
SET
  CLIENTE.nome = @nome, CONTATO.idTipoContato = @idTipoContato, CONTATO.conteudo = @conteudo 
WHERE
  CLIENTE.idCliente = @idCliente

Your code will look like this:

          try
          {
            con.ConnectionString = Conexao.Cn;
            con.Open();
            cmd.Connection = con;
            //// Inicia o escopo de transação
            SqlTransaction transaction = con.BeginTransaction("SampleTransaction");

            //// Informa o SqlCommand em qual escopo que se passará a transação de dados
            cmd.Transaction = transaction;

            cmd.CommandText = @"UPDATE
                                  CLIENTE 
                                INNER JOIN
                                  CONTATO 
                                ON
                                  CLIENTE.idCliente = CONTATO.idCliente
                                SET
                                   CLIENTE.nome = @nome, CONTATO.idTipoContato = @idTipoContato, CONTATO.conteudo = @conteudo 
                                WHERE
                                   CLIENTE.idCliente = @idCliente";

            cmd.Parameters.AddWithValue("@nome", cadastro.Nome);
            cmd.Parameters.AddWithValue("@idCliente", cadastro.IdCliente);
            cmd.Parameters.AddWithValue("@idTipoContato", cadastro.IdTipoContato);
            cmd.Parameters.AddWithValue("@conteudo", cadastro.Conteudo);


            resp = cmd.ExecuteNonQuery() == 1 ? "OK" : "Registro não foi inserido";
            // Encerra o escopo de transação passando as operações para Banco de Dados.
            transaction.Commit();
        }
        catch (Exception erro)
        {
            throw erro;
        }
        finally
        {
            if (con.State == System.Data.ConnectionState.Open) con.Close();
        }
  • 1

    Very good!! I will test here! Once again Thanks Augusto!!

Browser other questions tagged

You are not signed in. Login or sign up in order to post.