using System; using System.Data; using System.Data.OleDb; namespace ExercicioADOnet { /// /// Summary description for DAL. /// public class DAL { ... #region Typed DataSet public BDContas GetConta(int conta) { BDContas ds = new BDContas(); OleDbConnection cnx = OpenConnection(); //esta não é a maneira mais eficiente de ir buscar os dados já que vai necessitar de efectuar 2 SELECT //adicionalmente deveria limitar o numero de movimentos que traz OleDbDataAdapter da1 = new OleDbDataAdapter("SELECT * FROM contas WHERE id=" + conta.ToString(), cnx); OleDbDataAdapter da2 = new OleDbDataAdapter("SELECT * FROM movimentos WHERE conta=" + conta.ToString(), cnx); da1.Fill(ds, "contas"); da2.Fill(ds, "movimentos"); cnx.Close(); return ds; } public BDContas GetConta(string numeroConta) { BDContas ds = new BDContas(); OleDbConnection cnx = OpenConnection(); //esta não é a maneira mais eficiente de ir buscar os dados já que vai necessitar de efectuar 3 SELECT //adicionalmente deveria limitar o numero de movimentos que traz OleDbDataAdapter da1 = new OleDbDataAdapter("SELECT * FROM contas WHERE numero='" + numeroConta + "'", cnx); OleDbDataAdapter da2 = new OleDbDataAdapter("SELECT * FROM movimentos WHERE conta=(SELECT id FROM contas WHERE numero = '" + numeroConta + "')", cnx); da1.Fill(ds, "contas"); da2.Fill(ds, "movimentos"); cnx.Close(); return ds; } /// /// /// /// public void UpdateConta(BDContas dsConta) { // //apenas vai considerar os novos movimentos e a actualização do saldo é calculada // //obter linhas adicionadas DataSet ds = dsConta.GetChanges(DataRowState.Added); if (ds == null) return; //calcular diferencial do saldo decimal s = 0; foreach (BDContas.movimentosRow r in ds.Tables["movimentos"].Rows) s += r.montante; //abrir conexão e iniciar transacção OleDbConnection cnx = OpenConnection(); OleDbTransaction tx = cnx.BeginTransaction(); //construir DataAdpter e definir comandos SQL auxiliares vi OleDbCommandBuilder OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM movimentos", cnx); da.SelectCommand.Transaction = tx; OleDbCommandBuilder cb = new OleDbCommandBuilder(da); // actualziar tabela de movimentos da.Update(ds, "movimentos"); //actualizar saldo da conta OleDbCommand cmd2 = new OleDbCommand("UPDATE contas SET saldo=saldo+? WHERE id=?", cnx); cmd2.Transaction = tx; cmd2.Parameters.Add("mont", s); cmd2.Parameters.Add("conta", dsConta.contas[0].ID); cmd2.ExecuteNonQuery(); //terminar transacção e fechar conexão tx.Commit(); cnx.Close(); } #endregion ... } }