public SavedEventArgs(Member member) { Member = member; }
protected void SaveButton_Click(object sender, EventArgs e) { // Om valideringen är OK så... if (Page.IsValid) { try { // ...skapa ett nytt Member-objekt och initiera det // med värdena från textfälten och... Member member = new Member { MemberId = MemberId, Name = Name, Username = Username, Mail = Mail, Password = Password }; // ...veriferera att objektet uppfyller affärsreglerna... if (!member.IsValid) { // ...visa felmeddelanden om vad som // orsakade att valideringen misslyckades. AddErrorMessage(member); return; } // ...spara objektet. Service service = new Service(); service.SaveMember(member); // Om någon abbonerar på händelsen Saved... if (Saved != null) { // ...utlöses händelsen Saved och skickar med // en referens till kunduppgifterna som sparats. Saved(this, new SavedEventArgs(member)); } } catch { // ...visas ett felmeddelande. AddErrorMessage(Strings.Member_Saving_Error); } } }
/// <summary> /// Uppdaterar en kunds kunduppgifter i tabellen Member. /// </summary> /// <param name="member">Kunduppgifter som ska uppdateras.</param> public void UpdateMember(Member member) { // Skapar och initierar ett anslutningsobjekt. using (MySqlConnection conn = CreateConnection()) { try { // Skapar och initierar ett SqlCommand-objekt som används till att // exekveras specifierad lagrad procedur. MySqlCommand cmd = new MySqlCommand("app.uspUpdateMember", conn); cmd.CommandType = CommandType.StoredProcedure; //@TODO: Kolla så att längden är rätt // Lägger till de paramterar den lagrade proceduren kräver. Använder här det effektiva sätttet att // göra det på - något "svårare" men ASP.NET behöver inte "jobba" så mycket. cmd.Parameters.Add("@MemberId", MySqlDbType.Int32, 4).Value = member.MemberId; cmd.Parameters.Add("@Name", MySqlDbType.VarChar, 30).Value = member.Name; cmd.Parameters.Add("@Mail", MySqlDbType.VarChar, 50).Value = member.Mail; cmd.Parameters.Add("@Username", MySqlDbType.VarChar, 20).Value = member.Username; cmd.Parameters.Add("@Password", MySqlDbType.VarChar, 30).Value = member.Password; // Öppnar anslutningen till databasen. conn.Open(); // Den lagrade proceduren innehåller en UPDATE-sats och returnerar inga poster varför metoden // ExecuteNonQuery används för att exekvera den lagrade proceduren. cmd.ExecuteNonQuery(); } catch { // Kastar ett eget undantag om ett undantag kastas. throw new ApplicationException(GenericErrorMessage); } } }
/// <summary> /// Spara en kunds kunduppgifter i databasen. /// </summary> /// <param name="member">Kunduppgifter som ska sparas.</param> public void SaveMember(Member member) { // Klarar objektet validering i affärslogiklagret? if (member.IsValid) { // Member-objektet sparas antingen genom att en ny post // skapas eller genom att en befintlig post uppdateras. if (member.MemberId == 0) // Ny post om MemberId är 0! { MemberDAL.InsertMember(member); } else { MemberDAL.UpdateMember(member); } } else { // Uppfyller inte objektet affärsreglerna kastas ett undantag med // ett allmänt felmeddelande samt en referens till objektet som // inte klarade valideringen. ApplicationException ex = new ApplicationException(member.Error); ex.Data.Add("Member", member); throw ex; } }
/// <summary> /// Skapar en ny post i tabellen Member. /// </summary> /// <param name="member">Kunduppgifter som ska läggas till.</param> public void InsertMember(Member member) { // Skapar och initierar ett anslutningsobjekt. using (MySqlConnection conn = CreateConnection()) { try { // Skapar och initierar ett SqlCommand-objekt som används till att // exekveras specifierad lagrad procedur. MySqlCommand cmd = new MySqlCommand("app.uspInsertMember", conn); //@TODO: Kolla proceduren cmd.CommandType = CommandType.StoredProcedure; //@TODO: kolla så att längden stämmer // Lägger till de paramterar den lagrade proceduren kräver. Använder här det effektiva sätttet att // göra det på - något "svårare" men ASP.NET behöver inte "jobba" så mycket. cmd.Parameters.Add("@Name", MySqlDbType.VarChar, 30).Value = member.Name; cmd.Parameters.Add("@Mail", MySqlDbType.VarChar, 50).Value = member.Mail; cmd.Parameters.Add("@Username", MySqlDbType.VarChar, 30).Value = member.Username; cmd.Parameters.Add("@Password", MySqlDbType.VarChar, 20).Value = member.Password; // Den här parametern är lite speciell. Den skickar inte något data till den lagrade proceduren, // utan hämtar data från den. (Fungerar ungerfär som ref- och out-prameterar i C#.) Värdet // parametern kommer att ha EFTER att den lagrade proceduren exekverats är primärnycklens värde // den nya posten blivit tilldelad av databasen. cmd.Parameters.Add("@MemberId", MySqlDbType.Int32, 4).Direction = ParameterDirection.Output; // Öppnar anslutningen till databasen. conn.Open(); // Den lagrade proceduren innehåller en INSERT-sats och returnerar inga poster varför metoden // ExecuteNonQuery används för att exekvera den lagrade proceduren. cmd.ExecuteNonQuery(); // Hämtar primärnyckelns värde för den nya posten och tilldelar Member-objektet värdet. member.MemberId = (int)cmd.Parameters["@MemberId"].Value; } catch { // Kastar ett eget undantag om ett undantag kastas. throw new ApplicationException(GenericErrorMessage); } } }