Database Application Programming (C#) Chris North CS 4604: DB.

17
Database Application Programming (C#) Chris North CS 4604: DB

Transcript of Database Application Programming (C#) Chris North CS 4604: DB.

Page 1: Database Application Programming (C#) Chris North CS 4604: DB.

Database Application Programming(C#)

Chris North

CS 4604: DB

Page 2: Database Application Programming (C#) Chris North CS 4604: DB.

GUI/DB Application Model

Database

DataSet object

DB ConnectionDB AdapterDB SQL Query

Win Form

DataGrid control

Page 3: Database Application Programming (C#) Chris North CS 4604: DB.

Architecture Layers

Database

DB EngineDBMS UI

DB Driver

DB API

Application

Data Objects

App UI

SQLserver, Access

Database

SQLserver, Jet

ODBC, OleDB, JDBC

ADO, JDBC

WinForms, Swing

DB Admin

App User

OS

Application

Internet, local

Page 4: Database Application Programming (C#) Chris North CS 4604: DB.

C# DataBase Access (ADO.net)

• OleDB, ODBC, SQLdb, …

• Steps to get data:1. dbConnection: connect to DB

2. dbCommand: SQL query text

3. dbAdapter: executes query

4. DataSet: resulting data

• Steps to display data:• Bind to UI control, e.g. DataGrid

• or Manual data processing

DB

Alternative: DataReader,retrieve data incrementally

Page 5: Database Application Programming (C#) Chris North CS 4604: DB.

C# DB Example

• Get data:Using System.Data.OleDb; // “Jet” = MS Access DB driver

con = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:/mydb.mdb”);

cmd = new OleDbCommand("SELECT * FROM mytable”, con); // SQL query

adpt = new OleDbDataAdapter(cmd);

data = new DataSet( );

adpt.Fill(data); // execute the query and put result in ‘data’

• Display data:dataGrid1.DataSource = data.Tables[0]; // show the table in the grid control

MessageBox.Show(data.Tables[0].Rows[0][5].ToString( )); // or process manually, this is row 0 col 5

Page 6: Database Application Programming (C#) Chris North CS 4604: DB.

DataSet vs. DataReader

DataSet:

• Like 2D array: a[r][c]

• Full dataset read from DB at query execution time

• Dataset cached locally in mem

• Can disconnect from DB

• Implemented using DataReader (Adapter)

• + random data access

• - Limited scalability

• - initial read very slow

DataReader: (standard)

• 1 row at a time

• No local memory storage

• Fetch each row from DB on demand

• “cursor” = current row

• Must stay connected to DB

• + scalability

• - each row slow

• - random access difficult

Page 7: Database Application Programming (C#) Chris North CS 4604: DB.

Object Model

DataSet:

• Tables[n]– Rows[r]

• columns[c]– Value, type, …

– Columns info [c]• Name, type, …

DataReader: (standard)• Columns[c] (current row)

– Value, type, …

• Columns info [c]– Name, type, …

• Cursor:– moveNext, MovePrev, moveTo

– EOF

Page 8: Database Application Programming (C#) Chris North CS 4604: DB.

Cursors

• Forward only vs. forward/back vs. random access

• Read only vs. writeable

• …

Page 9: Database Application Programming (C#) Chris North CS 4604: DB.

Connections

• Connection strings:• Tons o examples: http://www.connectionstrings.com/

• Con.open( )

• Queries here

• Con.close( ) // connections consume resources

• Adapter.Fill( ) does open/close automatically

Page 10: Database Application Programming (C#) Chris North CS 4604: DB.

Commands (Queries)

• Command Types:• SQL Query:

» Relation: SELECT

» Scalar: SELECT that returns 1 row, 1 col

» Non-query: INSERT, UPDATE, DELETE

• Table name

• View name

• Rdr = Cmd.ExecuteReader( );

Page 11: Database Application Programming (C#) Chris North CS 4604: DB.

Query Parameters

• Want to substitute a parameter value into a query• Dynamic SQL query construction:cmd = new OleDbCommand(

"SELECT * FROM table WHERE myAttr = " + myValue, con);

• but: what if myValue contains weird chars?• Parameterized query: (more robust, reusable)cmd = new OleDbCommand(

"SELECT * FROM table WHERE myAttr = ?", con); // ? = parameter

cmd.Parameters.Add(“?”, myValue); // parameter value

• Or, put param query in DB as view / stored procedure:cmd = new OleDbCommand("MyStoredQuery", con); // name of view

cmd.CommandType = System.Data.CommandType.StoredProcedure;

cmd.Parameters.Add("?", myValue); // parameter value

Page 12: Database Application Programming (C#) Chris North CS 4604: DB.

DataBound UI Controls

• Display a table:• DataGrid

• Display a column:• DataList

• listBox

• ComboBox

• Display a cell value: (of current row)

• TextBox

• Can bind any property of any UI control to any DB column

DataGrid control -scroll, sort, edit, …

Page 13: Database Application Programming (C#) Chris North CS 4604: DB.

Manual data processing

• foreach(DataRow r in dataSet1.Tables[0].Rows) // for each row

{

doSomethingWith(r[“columnName”]); //or:

foreach(Object v in r.ItemArray) // for each column

doSomethingWith(v);

}

Page 14: Database Application Programming (C#) Chris North CS 4604: DB.

Saving Data Changes

• Manual update/insert/delete queries:cmd = new OleDbCommand(“UPDATE table SET myAttr=value WHERE id=idval”, con);cmd.ExecuteNonQuery(); // query does not return data.

• Adapters and bound UI Controls:• User can edit in DataGrid, etc.• Writes DataSet changes to DB on Update( ) method• Must have param update/insert/delete commands in Adapter

cmd = new OleDbCommand("UPDATE table SET attr1=?, attr2=? WHERE id=?", con);cmd.Parameters.Add(new OleDbParameter(“?”, …, “attr1”, DataRowVersion.Current ));cmd.Parameters.Add(new OleDbParameter(“?”, …, “attr2”, DataRowVersion.Current ));cmd.Parameters.Add(new OleDbParameter(“?”, …, “id”, DataRowVersion.Original ));adpt.UpdateCommand = cmd;

adpt.Update(data); // analogous to adpt.Fill(data);

Page 15: Database Application Programming (C#) Chris North CS 4604: DB.

Getting DB Schema Info

• Get list of tables in the DB:con.Open();

System.Data.DataTable t = con.GetOleDbSchemaTable(

System.Data.OleDb.OleDbSchemaGuid.Tables,

new object[]{null,null,null,"TABLE"} );

Page 16: Database Application Programming (C#) Chris North CS 4604: DB.

Visualization

• Draw graphics in Paint event• Scale data coords to pixel coords• E.g. scatterplot:foreach(DataRow r in dataSet1.Tables[0].Rows) // for each row

{

x = r[“attr1”] * Width / maxValue1; // Scale x,y to fit into window

y = Height - r[“attr2”] * Height / maxValue2; // also flip y axis

e.Graphics.FillEllipse(Brushes.Red, x, y, 10, 10);

}

Page 17: Database Application Programming (C#) Chris North CS 4604: DB.

Interaction

• Mouse Events• Scale mouse coords back into data coords• Parameterized SQL query• E.g. 2 clicks define a rectangle:Rect.left = click1.x / Width * maxValue1; // scale click x,y back to data range

SELECT * FROM table

WHERE attr1 >= {rect.left} AND attr1 <= {rect.right}

AND attr2 >= {rect.top} AND attr2 <= {rect.bottom}

doSomething with results…

Refresh( ); // repaint the window to show results in Paint event