Nisam bio tu par dana pa malo kasne odgovori.
Citat:
AMD guy: @Pharos
Prvo sam ovo uradio(ovo je samo deo DAL) za delete
Code:
private String BuildDeleteString(BOCustomer cus)
{
deleteStr = String.Format("Delete from {0} where {1} = '{2}' AND {3} = '{4}' ",thisTable, cus_FName, cus.FName, cus_LName, cus.LName);
return deleteStr;
}
Do sada nisam video da neko ovako radi. Nema potrebe za pravljenjem metode BuildDeleteString jer bi to trebalo direktno da ide u tvoju metodu Delete.
Funkcija ti ponovo nije dobra.
Stavi nekom customer-u ime
Test' i probaj da ga izbrišeš iz baze. Pucaće ti program u Delete metodi na petoj liniji, odnosno na cmd.ExecuteNonQuery();
Znači, radi sa parametrima kao što sam ti pokazao par postova iznad.
Još jedna mana tvog pristupa je u sledećem.
Zamisli da imaš neki komplikovan SELECT od 100ak linija i da si u WHERE stavio 20ak nekih uslova sa {7},{8},{9},{10},{11}...
I ako sad taj SELECT negde pukne, koliko meni treba vremena da otkrijem bug, tako što ću provaljivati da li se cus.FName odnosi na {8} ili {11}...?
Konstante thisTable, cus_FName i cus_LName su ne samo nepotrebne, nego pod hitno moraš da ih ukloniš jer je kod jako nepregledan.
Citat:
AMD guy:
pa onda ...
Code:
public void Delete(BOCustomer cus)
{
String str = BuildDeleteString(cus);
OpenConn(); //Moja metoda za uspostavljanje veze na Sql server
using (SqlCommand cmd = new SqlCommand(str, conn)) //public SqlConnection conn; sam inicijalizovao na pocetku klase
{
cmd.ExecuteNonQuery();
}
CloseConn();
}
//Moja metoda za konekciju
private void OpenConn()
{
String constr = Properties.Settings.Default.Rent_a_carConnectionString;
conn = new SqlConnection(constr);
conn.Open();
}
Ako ti pukne upit, odnosno cmd.ExecuteNonQuery(); baci neki exception, ništa ti neće zatvoriti konekciju.
Znači, nije dobro.
Citat:
AMD guy:
Code:
moj BLL
/// <summary>
/// Function delete customer. Calls
/// the function in Data Layer.
/// </summary>
public void Delete()
{
cusData.Delete(this);
}
// Ovde sam jos i definisao properties za Firstname, lastname, itd ...
//nesto tipa ovako
private string fname
public String FName
{
get
{
return this.fName;
}
set
{
try
{
this.fName = value;
if (this.fName == "")
{
throw new Exception("Please provide first name ...");
}
}
catch (Exception e)
{
throw new Exception(e.Message.ToString());
}
}
}
Delete opet "nije dobar". Stavih pod navodnike, a objasniću zašto.
Ako imaš neki DataGridView u kome imaš listu nekih Customer-a i ako hoćeš da izbrišeš jednog od njih, ti moraš da instanciraš novog Customer-a, da ga napuniš sa gomilom nekih nepotrebnih podataka i onda radiš brisanje.
Mnogo bolji pristup je da imaš public static DeleteCustomer(customerId), pa na klijentskoj strani samo da pozoveš BOCustomer.Delete(nekiId).
Citat:
AMD guy:
i na kraju GUI
Code:
private void btnObrisi_Click(object sender, EventArgs e)
{
cus = new BOCustomer();
cus.cusID = Convert.ToInt32(mibTextBox.Text);
cus.FName = imeTextBox.Text.ToString();
cus.LName = prezimeTextBox.Text.ToString();
cus.Address = adresaTextBox.Text.ToString();
cus.Tel = broj_telefonaTextBox.Text.ToString();
cus.Grad = gradTextBox.Text.ToString();
cus.Drzava = drzavaTextBox.Text.ToString();
cus.Datum_iznajmljivanja = datum_iznajmljivanjaDateTimePicker.Value.ToString() ;
cus.Datum_vracanja = datum_vracanjaDateTimePicker.Value.ToString();
DialogResult dr = MessageBox.Show("Brisanje?", "Are you sure", MessageBoxButtons.OKCancel,MessageBoxIcon.Question,MessageBoxDefaultButton.Button2);
if (dr == DialogResult.OK)
{
cus.Delete();
MessageBox.Show("Brisanje uspesno");
}
}
Koja je svrha baze, ako objekat puniš preko nevalidiranih podataka sa forme?
Gore sam ti već odgovorio da ne treba da puniš objekat da bi ga izbrisao (nekada je to preskupo), dovoljno je da pozoveš Factory method kome ćeš samo proslediti ID.
77 77 77 2E 65 73 6E 69 70 73 2E 63 6F 6D