11 DB Programming
11 DB Programming
Programmatic Database
Access with ADO.NET
Objectives
• Architecture of ADO.NET
• Basic database access
• Application design
• Updating a database
• DataSets
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-2
Part 1
• Architecture of ADO.NET…
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-3
Relational technology
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-4
Architecture
.NET Programmer
ADO.NET
Data Provider
DB
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-5
Existing data providers
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-6
ADO.NET object model
provider-neutral
System.Data
System.Data.Common
SQL Server
System.Data.SqlClient
other DBs, e.g. MS Access
System.Data.OleDb
ODBC (Open Database Connectivity)
System.Data.Odbc
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-7
Part 2
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-8
Overview of database access
• Three steps:
1. open connection to database
2. execute SQL to retrieve records / update DB
3. close connection
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-9
(1) Open connection
import System.Data.*;
import System.Data.OleDb.*;
String sConnection;
sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;" +
"Data Source=Sales.mdb";
connection
OleDbConnection dbConn;
dbConn = new OleDbConnection(sConnection);
dbConn.Open();
MessageBox.Show(dbConn.get_State().toString());
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-10
Building connection strings
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-11
(2) Retrieve records
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-12
(3) Close connection
dbReader.Close();
dbConn.Close();
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-13
Part 3
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-14
Data Tier design
import System.Data.*;
import System.Data.OleDb.*;
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-15
Guaranteed close?
try {
dbConn = new OleDbConnection(…);
dbConn.Open();
.
.
.
}
catch(System.Exception ex) {
System.Diagnostics.Debug.WriteLine("DB error: " + ex.get_Message());
throw new System.Exception("Data Error!", ex);
}
finally { // always executes whether we succeed or throw exception…
if (dbReader != null) dbReader.Close();
if (dbConn != null) dbConn.Close();
}
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-16
Part 4
• Updating a database…
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-17
Executing action queries
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-18
Basic idea
OleDbConnection dbConn;
OleDbCommand dbCmd;
dbConn = new OleDbConnection(sConnection);
dbCmd = new OleDbCommand(sql, dbConn);
int rows;
dbConn.Open();
rows = dbCmd.ExecuteNonQuery(); // returns # of rows affected…
dbConn.Close();
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-19
Dynamic SQL
• Example:
– delete the selected customer…
c = this.listBox1.get_SelectedItem();
fn = c.firstName;
ln = c.lastName;
sql = "...";
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-20
Dynamic string building
String sql;
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-21
Example
fn = c.firstName;
ln = c.lastName;
sql = String.Format("Delete From Customers Where " +
"FirstName='{0}' And LastName='{1}';", fn, ln);
.
.
.
dbConn.Open();
rows = dbCmd.ExecuteNonQuery(); // delete!
dbConn.Close();
if (rows != 1)
throw new System.Exception("Query ran but failed to delete?!");
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-22
Oops!
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-23
Escaping delimiters
• Solution?
– just replace ' with 2 in a row, i.e. ' '
private void listBox1_SelectedIndexChanged(…)
{
String fn, ln, sql; int rows; Customer c;
c = (Customer) this.listBox1.get_SelectedItem();
if (c == null) return; // nothing selected…
fn = c.firstName;
ln = c.lastName;
fn = fn.Replace("'", "''");
ln = ln.Replace("'", "''");
sql = String.Format("Delete From Customers Where " +
"FirstName='{0}' And LastName='{1}';", fn, ln);
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-24
Part 5
• DataSets…
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-25
DataSets
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-26
Filling a DataSet
Cats
$ 4.49
$29.95
500
100
Dogs $79.95 20
"Table"
sql = "Select * From Products Order By Name Asc;";
.
.
.
DataSet ds;
OleDbDataAdapter adapter;
ds = new DataSet();
adapter = new OleDbDataAdapter(dbCmd);
dbConn.Open();
adapter.Fill(ds);
dbConn.Close();
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-27
DataGrid display
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-28
DataGrid is a powerful control
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-29
Flushing changes back to database
OleDbCommandBuilder cmdBuilder;
cmdBuilder = new OleDbCommandBuilder(adapter);
dbConn.Open();
adapter.Update(ds); // this will throw exception if update(s) conflict…
dbConn.Close();
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-30
Summary
Introducing
Microsoft
J# in Visual Studio
CS using
.NET
.NET 11-31