39
C#: INTRODUCTION FOR DEVELOPERS Neal Stublen [email protected]

C#: Introduction for Developers

  • Upload
    peggy

  • View
    33

  • Download
    1

Embed Size (px)

DESCRIPTION

Neal Stublen [email protected]. C#: Introduction for Developers. Database Check. Populating a Database. SQLExpress should be installed with Visual Studio The book provides a . sql file for populating the MMABooks database in SQLExpress Double-click the .bat file on the S: drive - PowerPoint PPT Presentation

Citation preview

Page 1: C#: Introduction for Developers

C#: INTRODUCTION

FOR DEVELOPERS

Neal [email protected]

Page 2: C#: Introduction for Developers

DATABASE CHECK

Page 3: C#: Introduction for Developers

Populating a Database SQLExpress should be installed with

Visual Studio The book provides a .sql file for

populating the MMABooks database in SQLExpress

Double-click the .bat file on the S: drive We’ll need to repeat this process at the

start of each class session

Page 4: C#: Introduction for Developers

Confirm Database Access Using Visual Studio to locate the new

database as a Data SourceView > Server ExplorerAdd Connection...Server name: .\SQLEXPRESSDatabase name: MMABooksTest Connection

Page 5: C#: Introduction for Developers

HANDLING DATA ERRORS

Page 6: C#: Introduction for Developers

Data Provider Errors SqlException OracleException OdbcException OleDbException

Number Message Source Errors

Page 7: C#: Introduction for Developers

Catch Provider Exceptionprivate void Form1_Load(object sender, EventArgs e){ try { this.customersTableAdapter.Fill(...); } catch (SqlException ex) { // report ex.Number, ex.Message }}

Page 8: C#: Introduction for Developers

ADO.NET Errors DBConcurrencyException DataException ConstraintException NoNullAllowedException

Message

Page 9: C#: Introduction for Developers

Catch ADO.NET Exceptiontry{ this.customerBindingSource.EndEdit(); this.customersTableAdapterManager.UpdateAll(...);}catch (DBConcurrencyException ex){ // from UpdateAll() exception // report concurrency error this.customerTableAdapter.Fill(...);}catch (DataException ex){ // from EndEdit() exception // report ex.Message customerBindingsSource.CancelEdit();}catch (SqlException ex){ // report ex.Number, ex.Message}

Page 10: C#: Introduction for Developers

DataGridView Control Errors Not an exception, but an event on the

control

DataError

Exception RowIndex ColumnIndex

Page 11: C#: Introduction for Developers

Catch DataGridView Errorsprivate void gridView_DataError(...){ // report error in e.RowIndex and/or // e.ColumnIndex}

Page 12: C#: Introduction for Developers

MORE WITH DATA SOURCES AND DATA SETS

Page 13: C#: Introduction for Developers

Dataset Designer Command property on Fill, GetData Opens Query Builder Visually build SQL command Preview Data to see query results

Page 14: C#: Introduction for Developers

Designer.cs Queries SQL queries are updated in the

schema’s Designer.cs file DeleteCommand, InsertCommand,

UpdateCommand SCOPE_IDENTITY() = ID generated

from INSERT command @ = query parameter UPDATE only updates a record

matching original column values

Page 15: C#: Introduction for Developers

Bound TextBox Controls Formatting and Advanced Binding Select TextBox Open Properties Window Expand DataBindings property Select Advanced option, click “…”

Select new format type Specify representation of null value

Page 16: C#: Introduction for Developers

Bound ComboBox Controls Populate a ComboBox with values from

a column of a database table SelectedItem is used to specify the

value in a column of another database table

Page 17: C#: Introduction for Developers

Code Practice Select customer state using dropdown list

ComboBox instead of TextBox

Create StatesDataSet in Data Source window Add DataSet control for StatesDataSet and set

DataSetName property Add BindingSource control for DataSet and set

DataSource/DataMember properties Set State field to use ComboBox Set ComboBox to use data bound controls Clear ComboBox data bindings for Text property

Page 18: C#: Introduction for Developers

Parameterized Queries We can customize a DataSet by

providing parameters to modify the query

Parameters can be introduced using the Query Builder

Page 19: C#: Introduction for Developers

Code Practice Create a customer search form Populate a DataGridView based on the entry within a

TextBox

Create CustomersDataSet as a Data Source Open CustomersDataSet.xsd and modify Fill

CommandText using Query Builder Change Name Filter to “LIKE @Name” Drag Customers table onto a form Update Fill to append ‘%’ ToolStrip is added to provide the @Name parameter Examine Fill button’s Click event

Page 20: C#: Introduction for Developers

What was that ToolStrip? A tool strip can be docked around the

main window It contains other controls Controls can be added through the Items

collection Items have events just like other controls We can add a “Cancel” button to the

navigation tool stripCancelEdit() on the customersBindingSource

Page 21: C#: Introduction for Developers

Navigation Tool Strip customersBindingSource.AddNew(); customersBindingSource.EndEdit(); customersBindingSource.CancelEdit(); customersBindingSource.RemoveCurrent();

A binding source keeps all bound controls in sync

Page 22: C#: Introduction for Developers

DataViewGrid Control Smart tag allows you to modify

commonly used properties Columns can be added, moved, or

removedRemove ID columnsColumns still exist in the DataSet

Column content can be formatted using DefaultCellStyle

Page 23: C#: Introduction for Developers

Master-Detail Relationships One-to-many relationship between

tables One customer has many invoices

Page 24: C#: Introduction for Developers

Code Practice View customer invoices based on the selection

of a customer record Populate DataGridView with invoice entries

Create Customers-Invoices DataSet Customers uses Detail View Drag Customers onto Form Drag Customers.Invoices onto Form Examine DataSource/DataMember on grid

view and invoicesBindingSource

Page 25: C#: Introduction for Developers

CREATING DATA ACCESS OBJECTS

Page 26: C#: Introduction for Developers

Why create our own? Place data objects into a shared library We’re not using a form Separates database code from UI code

Page 27: C#: Introduction for Developers

Using Our Own ConnectionsSqlConnection cxn = new SqlConnection();cxn.ConnectionString = "...";cxn.Open();...cxn.Close();

Sample Connection String:Data Source=localhost\SqlExpress;Initial Catalog=MMABooks;Integrated Security=False;User ID=Be Careful;Password=Be Very, Very Careful;

Page 28: C#: Introduction for Developers

Using Our Own CommandsSqlCommand cmd = new SqlCommand();cmd.CommandText =

"SELECT * FROM Customers";cmd.CommandType = CommandType.Text;cmd.Connection = cxn;SqlReader r = cmd.ExecuteReader();

Page 29: C#: Introduction for Developers

Parameters in Commands Add parameters to SQL statements

SELECT * FROM Customers WHERE STATE = 'VA'

SELECT * FROM Customers WHERE STATE = @State

@State is a SQL variable representing the state

Page 30: C#: Introduction for Developers

Create the ParametersSqlParameter stateParam = new SqlParameter();stateParam.ParameterName = "@State";stateParam.Value = some_local_variable;

cmd.Parameters.Add(stateParam);

cmd.Parameters.AddWithValue("@State", value);

Page 31: C#: Introduction for Developers

SQL Injection Don’t let this happen…

string cmd = "SELECT * FROM Customers WHERE State=" + value;

Page 32: C#: Introduction for Developers

Executing CommandsSqlDataReader r = cmd.ExecuteReader();

List<Customer> customers =new List<Customer>();

while (r.Read()){ Customer c = new Customer(); ... customers.Add(c);}

r.Close();cxn.Close();

Page 33: C#: Introduction for Developers

Other Commandsobject result = cmd.ExecuteScalar();// Cast result to expected type

cmd.ExecuteNonQuery();

Page 34: C#: Introduction for Developers

Examine Chapter 20 Code MMABooksDB CustomerDB

GetCustomer – ExecuteReader, exceptionsAddCustomer – current IDUpdateCustomer – concurrency,

ExecuteNonQuery StateDB frmAddModifyCustomer

Page 35: C#: Introduction for Developers

BONUS CONTENT

Page 36: C#: Introduction for Developers

Disposable Objects IDisposable interface Single method: Dispose()

Releases unmanaged resources that may be held by an object

Such as a database connection!!

Page 37: C#: Introduction for Developers

Using… using keyword can be used to confine

objects to a particular scope using also ensures that Dispose() is

called if the object implements IDisposable

using also calls Dispose if an exception is thrown

Page 38: C#: Introduction for Developers

Disposable Connectionsusing (SqlConnection cxn = ...){ cxn.Open(); using (SqlCommand cmd = ...) { cmd.Execute... }}

Page 39: C#: Introduction for Developers

Using Equivalenceusing (object obj = …){}

object obj = …;try{}finally{ obj.Dispose();}