//Médodo de inserção de dados na tabela itens_venda e atualização // do valor da venda na tabela vendas. public void inserirItensVenda(ModeloVendas venda, ModeloItensVendas itens) { string sqlItensVenda, sqlAtualizarVenda; MySqlTransaction t = null; try { // Inserção da tabela itens_Venda cmdItensVenda.Connection = conn; sqlItensVenda = @"insert into itens_venda(idvenda, idproduto, valor_produto, quantidade)values(@idvenda, @idproduto, @valor_produto, @quantidade)"; cmdItensVenda.CommandText = sqlItensVenda; // Atualização do valor da venda na tabela vendas cmdAtualizaVendas.Connection = conn; sqlAtualizarVenda = @"update vendas set valor = @quantidade * @preco where idvenda = @idvenda"; cmdAtualizaVendas.CommandText = sqlAtualizarVenda; // Abertura do banco conn.Open(); // Configuração da transação t = conn.BeginTransaction(IsolationLevel.Serializable); cmdItensVenda.Transaction = t; cmdAtualizaVendas.Transaction = t; // Parâmetros de Inserção da tabela itens_venda cmdItensVenda.Parameters.Clear(); cmdItensVenda.Parameters.AddWithValue("@idvenda", venda.Idvenda); cmdItensVenda.Parameters.AddWithValue("@idproduto", itens.Idproduto); cmdItensVenda.Parameters.AddWithValue("@valor_produto", itens.ValorProduto); cmdItensVenda.Parameters.AddWithValue("@quantidade", itens.Quantidade); // Parâmetros de Atualização do valor da venda cmdAtualizaVendas.Parameters.AddWithValue("@idvenda", venda.Idvenda); cmdAtualizaVendas.Parameters.AddWithValue("@quantidade", itens.Quantidade); cmdAtualizaVendas.Parameters.AddWithValue("@preco", itens.ValorProduto); // Execução das transações cmdItensVenda.ExecuteNonQuery(); cmdAtualizaVendas.ExecuteNonQuery(); t.Commit(); } catch (MySqlException ex) { t.Rollback(); throw new Exception(ex.StackTrace); } finally { conn.Close(); } }
public void InserirItensVenda(ModeloVendas venda, ModeloItensVendas itens) { try { objVendasDal.inserirItensVenda(venda, itens); } catch (Exception ex) { throw new Exception(ex.Message); } }
// O método inserir fará operações que afetarão mais de uma tabela, // ou seja, inserção na tabela vendas e atualização na tabela produtos. public void inserir(ModeloVendas venda, ModeloItensVendas itens) { string sqlInserirVenda, sqlAtualizarEstoqueProduto; // Transação é uma operação que afeta duas ou mais tabelas simultâneas // no banco de dados. Neste caso, ocorrerão quatro operações: // A primeira fará inserção de dados na tabela vendas; // A segunda atualizará o estoque da tabela produtos; // A terceira armazenará dados (inserir) na tabela itens_venda; // A quarta calcula e atualiza o valor da venda. // Inicializa-se o objeto t com um valor nulo. MySqlTransaction t = null; try { // inserção de vendas. Modificar os parâmetros com prefixo p para @, porque // o .NET reconhece apenas o @ como configuração de parâmetro. Já as // stored procedures do MySql somente aceitam os parâmetros com prefixo p // ou qualquer letra do alfabeto exceto caracteres especiais como o @. cmdVendas.Connection = conn; sqlInserirVenda = @"insert into vendas(idcliente, data, valor)values (@idcliente, @data, @valor); select idvenda from vendas where idvenda = LAST_INSERT_ID();"; cmdVendas.CommandText = sqlInserirVenda; // Atualização do estoque cmdProdutos.Connection = conn; sqlAtualizarEstoqueProduto = @"update produtos set estoque = estoque - @quantidade where idproduto = @idproduto and estoque >= @quantidade"; cmdProdutos.CommandText = sqlAtualizarEstoqueProduto; conn.Open(); // O objeto Command inicia a primeira transação, configurando o ínicio // da transação com o nivel de isolamento serializable. Este é o tipo // mais restrito, não permite a leitura, a atualização, inclusão ou // exclusão de algum registro da tabela que está sendo lido, até que // se encontre o comando commit ou rollback. t = conn.BeginTransaction(IsolationLevel.Serializable); // O objeto t é vinculado à propriedade transaction do objeto command // cmdVendas. cmdVendas.Transaction = t; cmdProdutos.Transaction = t; // Parâmetros de inserção da tabela vendas cmdVendas.Parameters.Clear(); cmdVendas.Parameters.AddWithValue("@idcliente", venda.Idcliente); cmdVendas.Parameters.AddWithValue("@data", venda.Data); cmdVendas.Parameters.AddWithValue("@valor", venda.Valor); // Parâmetros de atualização do produto cmdProdutos.Parameters.Clear(); cmdProdutos.Parameters.AddWithValue("@idproduto", itens.Idproduto); cmdProdutos.Parameters.AddWithValue("@quantidade", itens.Quantidade); // O metodo ExecuteScalar retorna um único valor, no caso, idvenda // gerado automaticamente pelo banco. venda.Idvenda = Convert.ToInt32(cmdVendas.ExecuteScalar()); // O método ExecuteNomQuery executa o comando update na tabela produtos. // Ele não efetua nenhum retorno do banco de dados. cmdProdutos.ExecuteNonQuery(); // Validação da transação através do método Commit. Executa-se // a transação nas duas tabelas simultaneamente(vendas e produtos) t.Commit(); } catch (MySqlException ex) { t.Rollback(); throw new Exception(ex.StackTrace); } finally { conn.Close(); } }