Shop
Notas de implementação
[Exercício da Disciplina de ADAV]
1
Componente
Componente – Class Library
Entidades de negócio
Customer
Product
Sale
Classes implementadas
Customer.cs
Product.cs
Sale.cs
Factory.cs
UtilDB.cs
User.cs
ShopSatatusEnum.cs
3
Utilização do componente
Acrescentar referência ao Componente no
projecto (Windows Form, Web Site ou
Interfaces e Classes
Códigos de ‘Status’ – Retorno de alguns métodos
//
// Definição dos códigos de ‘status’ que poderão ser retornados
public enum ShopStatusEnum
{
OK = 1,
NOT_OK = 0,
INVALID_LOGIN = -1,
INVALID_KEY = -2,
INVALID_CUSTOMER_ID = -3,
INVALID_PRODUCT_ID = -4,
INSUFICIENT_STOCK = -5,
ERROR = -6
}
User
public interface IUser
{
5
Interfaces e Classes
Customer
public interface ICustomer
{
// devolve os dados do cliente com um dado id
DataSet GetByID(string user, string pass, long clientID);
// devolve os dados de todos os clientes cujo nome obedeça ao padrão de pesquisa
DataSet FindByName( string user, string pass, string namePattern);
// Adiciona um novo cliente e retorna o respectivo ID gerado automaticamente na BD
long Add( string user, string pass, string name, string address,string phone, string fax, string email, out ShopStatusEnum status);
// actualiza os dados do cliente identificado pelo id
ShopStatusEnum Update( string user, string pass, long custumerID, string name, string address, string phone, string fax, string eMail); }
7
UtilDB
Código comum: usado pelas outras classes
para acesso à base de dados
Cliente do componente
1 - ) Usar Classe Customer do componente
…
//Instanciar classe Customer
ShopClassLibrary.ICustomer customer=
new ShopClassLibrary.Customer();
// chamada ao método GetByID da classe Customer.cs
DataSet ds = customer.GetByID(user, pass,
idcustomer);
// método devolve null se não encontrar
If ( ds!=null )
9
2 - ) Usar Classe Customer do componente através
da classe Factory
ICustomer customer= Factory.CreateCustomerService();
public class factory {
public static ICustomer CreateCustomerService()
{ return new Customer();
}
public static ISale CreateSaleService()
{
return new Sale();
}
public static ISale2 CreateSale2Service()
{
return new Sale();
}
DAL - Classe Customer.cs
public DataSet GetByID(string user, string pass,
long clientID)
{
OleDbConnection conn = null;
DataSet ds = null;
try
{
// criar objecto de conexão à base de dados e abrir a conexão
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
// validar utilizador
ShopStatusEnum status = UtilDB.ValidateUser(conn, null,
user, pass);
if (status != ShopStatusEnum.OK)
return null;
// efectuar pesquisa
ds =
UtilDB.GetByID
(conn, null, "Customers",
"CustomerID", clientID);
}
11
Classe Customer.cs - GetByID (cont.)
catch(OleDbException ex)
{
// tratar a excepção!!!!
System.Console.WriteLine("EXCEPÇÃO no método
<GetByID> da classe 'Customer': " + ex.Message);
}
finally
{
// fechar a conexão
if (conn.State == ConnectionState.Open)
conn.Close();
}
return ds;
}
Classe UtilDB.cs - GetByID
static public DataSet GetByID(string table, string keyName, long key)
{
DataSet ds = null; try{ // criar objecto DataSet ds = new DataSet();
// criar um Datadapter para executar o comando e devolver o dataset string sSqlCmd = "Select * From "+ table + " Where “ +
keyName + " = "+ key.ToString();
OleDbDataAdapter oAdapter = new OleDbDataAdapter(sSqlCmd, conn); oAdapter.SelectCommand.Transaction = tx;
// executar o comando e preencher um Dataset oAdapter.Fill(ds, table);
}
catch(OleDbException ex) {
// tratar a excepção!!!!
System.Console.WriteLine("EXCEPÇÃO no método 'UtilDB.GetByID': " + ex.Message);
ds = null; }
13
UtilDB
Código genérico para pesquisa por Chave
/// <summary>
/// Obtem um dataset resultante de uma pesquisa por chave
/// </summary>
/// <param name="table">tabela a pesquisar</param>
/// <param name="field">campo chave a usar</param>
/// <param name="key">valor da chave a pesquisar</param>
/// <returns>um dataset do tipo pedido</returns>
static public DataSet GetByID(string table,
string keyName, long key)
{
…
Inserir novo cliente
Validar dados de entrada
Criar objecto de conexão à base de dados
Validar utilizador
Criar comando SQL com parâmetros
Definir parâmetros
Executar comando
Verificar resultado
Determinar ID gerado para o novo registo
Devolver novo ID
15
Inserir novo cliente
public long Add(string user,string pass,
string name, …,out ShopStatusEnum status)
{
long customerID = -1;
OleDbConnection conn = null;
// validar dados de entrada
if (name == null || name.Trim().Length == 0)
{
status = ShopStatusEnum.INVALID_ARGUMENT;
return -1;
}
…
Inserir novo cliente
try
{
// criar objecto de conexão à base de dados
e abrir a conexão
conn = new OleDbConnection(UtilDB.CONN);
conn.Open();
// validar o utilizador
//
status = UtilDB.ValidateUser(conn, null,
user, pass);
if (status != ShopStatusEnum.OK)
return -1;
17
Inserir novo cliente
// criar comando SQL a executar
//
string sqlCmd = "INSERT INTO Customers (Name,
Address, PhoneNb, FaxNb, EMail)
Values (?, ?, ?, ?, ?)";
OleDbCommand cmd = new OleDbCommand(sqlCmd,conn);
// definir parâmetros
cmd.Parameters.AddWithValue("name", name);
if (address.Length == 0)
cmd.Parameters.AddWithValue("address",
DBNull.Value);
else
cmd.Parameters.AddWithValue("address", address);
…
Inserir novo cliente
//
// executar o comando
//
int insRows = cmd.ExecuteNonQuery();
//
// verificar o resultado
//
if (insRows == 0)
// não inseriu registo
status = ShopStatusEnum.NOT_OK;
else
19
Inserir novo cliente
else
{
//
// inseriu registo
// obter novo código de id gerado pela BD
OleDbCommand idCmd = new
OleDbCommand("SELECT @@IDENTITY", conn);
customerID = (int)idCmd.ExecuteScalar();
status = ShopStatusEnum.OK;
}
Inserir novo cliente
catch (OleDbException ex)
{
//
tratar a excepção!!!!
System.Console.WriteLine("EXCEPÇÃO no método
<AddCustomer> da classe 'Customer': " +
ex.Message);
status = ShopStatusEnum.ERROR;
}
finally
{
// fechar a conexão
if (conn!= null && conn.State==
ConnectionState.Open)
conn.Close();
21
public class User : IUser
{
…
public ShopStatusEnum Validate(string user, string pass)
{
return UtilDB.ValidateUser(user, pass);
}
…
// validar Login
IUser c = new User();
if (c.Validate(txtUsername.Text, txtPassword.Text) ==
ShopStatusEnum.OK)
public interface IUser{
ShopStatusEnum Validate(string user, string pass); }