c# tutorial msm_murach chapter-20-slides
TRANSCRIPT
![Page 1: C# Tutorial MSM_Murach chapter-20-slides](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/1.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/2.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/3.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/4.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/5.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/6.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/7.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/8.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/9.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/10.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/11.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/12.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/13.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/14.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/15.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/16.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/17.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/18.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/19.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/20.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/21.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/22.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/23.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/24.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/25.jpg)
Murach’s C# 2010, C20 © 2010, Mike Murach & Associates, Inc. Slide 25
The class diagram
![Page 26: C# Tutorial MSM_Murach chapter-20-slides](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/26.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/27.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/28.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/29.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/30.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/31.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/32.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/33.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/34.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/35.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/36.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/37.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/38.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/39.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/40.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/41.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/42.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/43.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/44.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/45.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/46.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/47.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/48.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/49.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/50.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/51.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/52.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/53.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/54.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/55.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/56.jpg)
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](https://reader036.vdocuments.net/reader036/viewer/2022062316/58e60ac21a28ab44778b5453/html5/thumbnails/57.jpg)
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; } }