C# Tutorial MSM_Murach chapter-20-slides

57
Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 1 C hapter20 How to use A D O .NET to w rite yourow n data access code

Transcript of C# Tutorial MSM_Murach chapter-20-slides

Page 1: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 1

Chapter 20

How to use ADO.NET to write your own data access code

Page 2: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 2

Objectives Applied 1. Use a data reader to retrieve data from a database. 2. Use data commands to execute action queries or queries that

return a scalar value. 3. Use parameters to limit the data that’s processed by a data

command.

Knowledge 1. Describe the use of parameters with SQL statements. 2. Describe the use of a data reader. 3. Describe the use of the two types of queries that don’t return

result sets.

Page 3: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 3

Two constructors for the SqlConnection class new SqlConnection() new SqlConnection(connectionString)

Common properties and methods of the SqlConnection class ConnectionString Open() Close()

Page 4: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 4

Common values used in the ConnectionString property for SQL Server Data source/Server Initial catalog/Database Integrated security User ID Password/Pwd Persist security info Workstation ID

Page 5: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 5

A connection string for the SQL Server provider Data Source=localhost\\SqlExpress; Initial Catalog=MMABooks; Integrated Security=True

A connection string for the Jet OLE DB provider Provider=Microsoft.Jet.OLEDB.4.0; Data Source=C:\\Databases\\MMABooks.mdb

Page 6: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 6

Code that creates, opens, and closes a SQL connection

string connectionString = "Data Source= localhost\\SqlExpress; Initial Catalog=MMABooks;" + "Integrated Security=True"; SqlConnection connection = new SqlConnection(connectionString); connection.Open(); ... connection.Close();

Page 7: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 7

Three constructors for the SqlCommand class new SqlCommand() new SqlCommand(commandText) new SqlCommand(commandText, connection)

Page 8: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 8

Common properties of the SqlCommand class Connection CommandText CommandType Parameters

Common methods of the SqlCommand class ExecuteReader() ExecuteNonQuery() ExecuteScalar()

Page 9: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 9

CommandType enumeration members Text StoredProcedure TableDirect

Page 10: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 10

Code that creates a SqlCommand object that executes a Select statement SqlConnection connection = new SqlConnection(connectionString); string selectStatement = "SELECT CustomerID, Name, Address, City, State, ZipCode " + "FROM Customers"; SqlCommand selectCommand = new SqlCommand(selectStatement, connection);

Page 11: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 11

A SQL Server Select statement that uses a parameter

SELECT CustomerID, Name, Address, City, State, ZipCode FROM Customers WHERE CustomerID = @CustomerID

An Oracle Select statement that uses a parameter SELECT CustomerID, Name, Address, City, State, ZipCode FROM Customers WHERE CustomerID = :CustomerID

An OLE DB or ODBC Select statement that uses a parameter

SELECT CustomerID, Name, Address, City, State, ZipCode FROM Customers WHERE CustomerID = ?

Page 12: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 12

A SQL Server Insert statement that uses parameters

INSERT INTO Customers (Name, Address, City, State, ZipCode) VALUES (@Name, @Address, @City, @State, @ZipCode)

Page 13: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 13

Four constructors for the SqlParameter class new SqlParameter() new SqlParameter(name, value) new SqlParameter(name, type) new SqlParameter(name, type, size)

Common properties of the SqlParameter class DbType ParameterName Size SqlDbType Value

Page 14: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 14

Code that creates a parameter SqlParameter customerIDParm = new SqlParameter(); customerIDParm.ParameterName = "@CustomerID"; customerIDParm.Value = customerID;

Another way to create a parameter SqlParameter customerIDParm = new SqlParameter("@CustomerID", customerID);

Page 15: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 15

Common indexers of the Parameters collection [parametername] [index]

Common methods of the Parameters collection Add(parameter) Add(name, type) Add(name, type, size) AddWithValue(name, value)

Page 16: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 16

A statement that adds a parameter to the Parameters collection

selectCommand.Parameters.Add(customerIDParm);

A statement that creates a parameter and adds it to the Parameters collection

selectCommand.Parameters.AddWithValue( "@CustomerID", customerID);

A statement that changes the value of an existing parameter

selectCommand.Parameters["@CustomerID"]. Value = customerID;

Page 17: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 17

Two ways to create a SqlDataReader object sqlCommand.ExecuteReader() sqlCommand.ExecuteReader(behavior)

Common CommandBehavior enumeration members CloseConnection Default SingleRow

Page 18: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 18

Common indexers of the SqlDataReader class [columnname] [index]

Common property of the SqlDataReader class IsClosed

Common methods of the SqlDataReader class Close() Read()

Page 19: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 19

Code that uses a data reader to read a list of State objects

connection.Open(); SqlDataReader reader = selectCommand.ExecuteReader( CommandBehavior.CloseConnection); List<State> states = new List<State>(); while (reader.Read()) { State s = new State(); s.StateCode = reader["StateCode"].ToString(); s.StateName = reader["StateName"].ToString(); states.Add(s); } reader.Close();

Page 20: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 20

Code that creates and executes a command that returns an aggregate value

string selectStatement = "SELECT SUM(InvoiceTotal) FROM Invoices"; SqlCommand selectCommand = new SqlCommand(selectStatement, connection); connection.Open(); decimal invoiceTotal = (decimal) selectCommand.ExecuteScalar; connection.Close();

Page 21: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 21

Code that inserts a row string insertStatement = "INSERT Products " + "(ProductCode, Description, UnitPrice) " + "VALUES (@ProductCode, @Description, @UnitPrice)"; SqlCommand insertCommand = new SqlCommand(insertStatement, connection); insertCommand.Parameters.AddWithValue( "@ProductCode", product.Code); insertCommand.Parameters.AddWithValue( "@Description", product.Description); insertCommand.Parameters.AddWithValue( "@UnitPrice", product.Price); try { connection.Open(); int productCount = insertCommand.ExecuteNonQuery(); } catch (SqlException ex) { MessageBox.Show(ex.Message); } finally { connection.Close(); }

Page 22: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 22

The Customer Maintenance form

Page 23: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 23

The Add/Modify Customer form

Page 24: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 24

The dialog box that’s displayed to confirm a delete operation

Page 25: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 25

The class diagram

Page 26: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 26

The code for the CustomerDB class public static class CustomerDB { public static Customer GetCustomer(int customerID) { SqlConnection connection = MMABooksDB.GetConnection(); string selectStatement = "SELECT CustomerID, Name, Address, City, State, ZipCode " + "FROM Customers " + "WHERE CustomerID = @CustomerID"; SqlCommand selectCommand = new SqlCommand(selectStatement, connection); selectCommand.Parameters.AddWithValue( "@CustomerID", customerID); try {

Page 27: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 27

The code for the CustomerDB class (cont.) connection.Open(); SqlDataReader custReader = selectCommand.ExecuteReader( CommandBehavior.SingleRow); if (custReader.Read()) { Customer customer = new Customer(); customer.CustomerID = (int)custReader["CustomerID"]; customer.Name = custReader["Name"].ToString(); customer.Address = custReader["Address"].ToString(); customer.City = custReader["City"].ToString(); customer.State = custReader["State"].ToString(); customer.ZipCode = custReader["ZipCode"].ToString(); return customer; }

Page 28: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 28

The code for the CustomerDB class (cont.) else { return null; } } catch (SqlException ex) { throw ex; } finally { connection.Close(); } }

Page 29: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 29

The code for the CustomerDB class (cont.) public static int AddCustomer(Customer customer) { SqlConnection connection = MMABooksDB.GetConnection(); string insertStatement = "INSERT Customers " + "(Name, Address, City, State, ZipCode) " + "VALUES (@Name, @Address, @City, @State, @ZipCode)"; SqlCommand insertCommand = new SqlCommand(insertStatement, connection); insertCommand.Parameters.AddWithValue( "@Name", customer.Name); insertCommand.Parameters.AddWithValue( "@Address", customer.Address); insertCommand.Parameters.AddWithValue( "@City", customer.City); insertCommand.Parameters.AddWithValue( "@State", customer.State); insertCommand.Parameters.AddWithValue( "@ZipCode", customer.ZipCode);

Page 30: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 30

The code for the CustomerDB class (cont.) try { connection.Open(); insertCommand.ExecuteNonQuery(); string selectStatement = "SELECT IDENT_CURRENT('Customers') FROM Customers"; SqlCommand selectCommand = new SqlCommand(selectStatement, connection); int customerID = Convert.ToInt32( selectCommand.ExecuteScalar()); return customerID; } catch (SqlException ex) { throw ex; } finally { connection.Close(); } }

Page 31: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 31

The code for the CustomerDB class (cont.) public static bool UpdateCustomer(Customer oldCustomer, Customer newCustomer) { SqlConnection connection = MMABooksDB.GetConnection(); string updateStatement = "UPDATE Customers SET " + "Name = @NewName, " + "Address = @NewAddress, " + "City = @NewCity, " + "State = @NewState, " + "ZipCode = @NewZipCode " + "WHERE Name = @OldName " + "AND Address = @OldAddress " + "AND City = @OldCity " + "AND State = @OldState " + "AND ZipCode = @OldZipCode";

Page 32: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 32

The code for the CustomerDB class (cont.) SqlCommand updateCommand = new SqlCommand(updateStatement, connection); updateCommand.Parameters.AddWithValue( "@NewName", newCustomer.Name); updateCommand.Parameters.AddWithValue( "@NewAddress", newCustomer.Address); updateCommand.Parameters.AddWithValue( "@NewCity", newCustomer.City); updateCommand.Parameters.AddWithValue( "@NewState", newCustomer.State); updateCommand.Parameters.AddWithValue( "@NewZipCode", newCustomer.ZipCode); updateCommand.Parameters.AddWithValue( "@OldName", oldCustomer.Name); updateCommand.Parameters.AddWithValue( "@OldAddress", oldCustomer.Address); ... ... updateCommand.Parameters.AddWithValue( "@OldZipCode", oldCustomer.ZipCode);

Page 33: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 33

The code for the CustomerDB class (cont.) try { connection.Open(); int count = updateCommand.ExecuteNonQuery(); if (count > 0) return true; else return false; } catch (SqlException ex) { throw ex; } finally { connection.Close(); } }

Page 34: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 34

The code for the CustomerDB class (cont.) public static bool DeleteCustomer(Customer customer) { SqlConnection connection = MMABooksDB.GetConnection(); string deleteStatement = "DELETE FROM Customers " + "WHERE Name = @Name " + "AND Address = @Address " + "AND City = @City " + "AND State = @State " + "AND ZipCode = @ZipCode"; SqlCommand deleteCommand = new SqlCommand(deleteStatement, connection); deleteCommand.Parameters.AddWithValue( "@Name", customer.Name); deleteCommand.Parameters.AddWithValue( "@Address", customer.Address); ... ... deleteCommand.Parameters.AddWithValue( "@ZipCode", customer.ZipCode);

Page 35: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 35

The code for the CustomerDB class (cont.) try { connection.Open(); int count = deleteCommand.ExecuteNonQuery(); if (count > 0) return true; else return false; } catch (SqlException ex) { throw ex; } finally { connection.Close(); } } }

Page 36: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 36

The code for the StateDB class public static class StateDB { public static List<State> GetStates() { List<State> states = new List<State>(); SqlConnection connection = MMABooksDB.GetConnection(); string selectStatement = "SELECT StateCode, StateName " + "FROM States " + "ORDER BY StateName"; SqlCommand selectCommand = new SqlCommand(selectStatement, connection);

Page 37: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 37

The code for the StateDB class (cont.) try { connection.Open(); SqlDataReader reader = selectCommand.ExecuteReader(); while (reader.Read()) { State s = new State(); s.StateCode = reader["StateCode"].ToString(); s.StateName = reader["StateName"].ToString(); states.Add(s); } reader.Close(); }

Page 38: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 38

The code for the StateDB class (cont.) catch (SqlException ex) { throw ex; } finally { connection.Close(); } return states; } }

Page 39: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 39

The code for the MMABooksDB class public static class MMABooksDB { public static SqlConnection GetConnection() { // If necessary, change the following connection string // so it works for your system string connectionString = "Data Source=localhost\\SqlExpress; Initial Catalog=MMABooks;" + "Integrated Security=True"; SqlConnection connection = new SqlConnection(connectionString); return connection; } }

Page 40: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 40

The Customer Maintenance form public partial class frmCustomerMaintenance : Form { private Customer customer; private void btnGetCustomer_Click( object sender, EventArgs e) { if (Validator.IsPresent(txtCustomerID) && Validator.IsInt32(txtCustomerID)) { int customerID = Convert.ToInt32( txtCustomerID.Text); this.GetCustomer(customerID);

Page 41: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 41

The Customer Maintenance form (cont.) if (customer == null) { MessageBox.Show( "No customer with this ID. " + "Please try again.", "Customer Not Found"); this.ClearControls(); } else this.DisplayCustomer(); } }

Page 42: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 42

The Customer Maintenance form (cont.) private void GetCustomer(int customerID) { try { customer = CustomerDB.GetCustomer(customerID); } catch (Exception ex) { MessageBox.Show(ex.Message, ex.GetType().ToString()); } }

Page 43: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 43

The Customer Maintenance form (cont.) private void ClearControls() { txtCustomerID.Text = ""; txtName.Text = ""; txtAddress.Text = ""; txtCity.Text = ""; txtState.Text = ""; txtZipCode.Text = ""; btnModify.Enabled = false; btnDelete.Enabled = false; txtCustomerID.Focus(); }

Page 44: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 44

The Customer Maintenance form (cont.) private void DisplayCustomer() { txtName.Text = customer.Name; txtAddress.Text = customer.Address; txtCity.Text = customer.City; txtState.Text = customer.State; txtZipCode.Text = customer.ZipCode; btnModify.Enabled = true; btnDelete.Enabled = true; }

Page 45: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 45

The Customer Maintenance form (cont.) private void btnAdd_Click(object sender, EventArgs e) { frmAddModifyCustomer addCustomerForm = new frmAddModifyCustomer(); addCustomerForm.addCustomer = true; DialogResult result = addCustomerForm.ShowDialog(); if (result == DialogResult.OK) { customer = addCustomerForm.customer; txtCustomerID.Text = customer.CustomerID.ToString(); this.DisplayCustomer(); } }

Page 46: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 46

The Customer Maintenance form (cont.) private void btnModify_Click(object sender, EventArgs e) { frmAddModifyCustomer modifyCustomerForm = new frmAddModifyCustomer(); modifyCustomerForm.addCustomer = false; modifyCustomerForm.customer = customer; DialogResult result = modifyCustomerForm.ShowDialog(); if (result == DialogResult.OK) { customer = modifyCustomerForm.customer; this.DisplayCustomer(); }

Page 47: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 47

The Customer Maintenance form (cont.) else if (result == DialogResult.Retry) { this.GetCustomer(customer.CustomerID); if (customer != null) this.DisplayCustomer(); else this.ClearControls(); } }

Page 48: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 48

The Customer Maintenance form (cont.) private void btnDelete_Click(object sender, EventArgs e) { DialogResult result = MessageBox.Show( "Delete " + customer.Name + "?", "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) {

Page 49: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 49

The Customer Maintenance form (cont.) try { if (!CustomerDB.DeleteCustomer(customer)) { MessageBox.Show("Another user has " + "updated or deleted " + "that customer.", "Database Error"); this.GetCustomer(customer.CustomerID); if (customer != null) this.DisplayCustomer(); else this.ClearControls(); }

Page 50: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 50

The Customer Maintenance form (cont.) else this.ClearControls(); } catch (Exception ex) { MessageBox.Show(ex.Message, ex.GetType().ToString()); } } } private void btnExit_Click(object sender, EventArgs e) { this.Close(); } }

Page 51: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 51

The Add/Modify Customer form public partial class frmAddModifyCustomer : Form { public bool addCustomer; public Customer customer; private void frmAddModifyCustomer_Load( object sender, EventArgs e) { this.LoadStateComboBox(); if (addCustomer) { this.Text = "Add Customer"; cboStates.SelectedIndex = -1; } else { this.Text = "Modify Customer"; this.DisplayCustomer(); } }

Page 52: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 52

The Add/Modify Customer form (cont.) private void LoadStateComboBox() { List<State> states = new List<State>(); try { states = StateDB.GetStates(); cboStates.DataSource = states; cboStates.DisplayMember = "StateName"; cboStates.ValueMember = "StateCode"; } catch (Exception ex) { MessageBox.Show(ex.Message, ex.GetType().ToString()); } }

Page 53: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 53

The Add/Modify Customer form (cont.) private void DisplayCustomer() { txtName.Text = customer.Name; txtAddress.Text = customer.Address; txtCity.Text = customer.City; cboStates.SelectedValue = customer.State; txtZipCode.Text = customer.ZipCode; }

Page 54: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 54

The Add/Modify Customer form (cont.) private void btnAccept_Click(object sender, EventArgs e) { if (IsValidData()) { if (addCustomer) { customer = new Customer(); this.PutCustomerData(customer); try { customer.CustomerID = CustomerDB.AddCustomer(customer); this.DialogResult = DialogResult.OK; } catch (Exception ex) { MessageBox.Show(ex.Message, ex.GetType().ToString()); } }

Page 55: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 55

The Add/Modify Customer form (cont.) else { Customer newCustomer = new Customer(); newCustomer.CustomerID = customer.CustomerID; this.PutCustomerData(newCustomer); try { if (! CustomerDB.UpdateCustomer( customer, newCustomer)) { MessageBox.Show( "Another user has updated or " + "deleted that customer.", "Database Error"); this.DialogResult = DialogResult.Retry; }

Page 56: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 56

The Add/Modify Customer form (cont.) else { customer = newCustomer; this.DialogResult = DialogResult.OK; } } catch (Exception ex) { MessageBox.Show(ex.Message, ex.GetType().ToString()); } } } }

Page 57: C# Tutorial MSM_Murach chapter-20-slides

Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 57

The Add/Modify Customer form (cont.) private bool IsValidData() { return Validator.IsPresent(txtName) && Validator.IsPresent(txtAddress) && Validator.IsPresent(txtCity) && Validator.IsPresent(cboStates) && Validator.IsPresent(txtZipCode); } private void PutCustomerData(Customer customer) { customer.Name = txtName.Text; customer.Address = txtAddress.Text; customer.City = txtCity.Text; customer.State = cboStates.SelectedValue.ToString(); customer.ZipCode = txtZipCode.Text; } }