FEN Databaser/dbAdgang11 Databaseadgang fra C#: ADO.NET (ActiveX Data Objects)
FEN Databaser/dbAdgang12 ADO.NET - Arkitektur Non Microsoft Vi bruger den her
FEN Databaser/dbAdgang13 Database library Databasetilgang tilbydes af namespace System.Data.* Klasserne kendes samlet som ADO.NET –“native support” til SQL Server og Oracle –Supporterer andre DBMS’er via den ældre OleDB-teknologi –Kræver kendskab til SQL og C#-programmering Der bruges forskellige klasser til de forskellige databaser, fx findes der en OleDbCommand, en SqlCommand og en OracleCommand. Alle implementerer IDbCommand. Anvendte namespaces: –generelt: System.Data, System.Data.Common –SQL Server: System.Data.SqlClient –Oracle: System.Data.OracleClient –OleDB: System.Data.OleDb
FEN Databaser/dbAdgang14 ADO.NET Arkitektur
FEN Databaser/dbAdgang15 To måder at tilgå DB på Connected: –Åbn connection –Læse-/Skrivetilgang (select, insert, update og delete) via Command-objekt –Ved læsetilgang (select) returneres et DataReader-objekt –Luk Connection Disconnected: –Fyld et DataSet-objekt (kopi af dele af databasen) vha. en DataAdapter –DataAdapter indpakker SQL-statement(s) –DataSet-objekt indeholder DataTable-objekter –DataTable-objekter indeholder collections af rækker og kolonner Mere herom næste gang
FEN Databaser/dbAdgang16 Overblik - connected databaseadgang Tre skridt: 1.åbn connection til databasen 2.eksekver SQL for at opdatere/læse DB 3.luk connection
FEN Databaser/dbAdgang17 1: Åbn connection Connections åbnes på grundlag af en connection string –Kan findes i Visual Studio: // Create and open a connection. SqlConnection cn = new SqlConnection(); cn.ConnectionString = " Data Source =PCM06073\\SQLEXPRESS;” +”Initial Catalog=vw;Integrated Security=True;"; cn.Open(); ShowConnectionStatus(cn); // or should it be? cn.ConnectionString = “ Server =PCM06073\\SQLEXPRESS;” +”Initial Catalog=vw;Integrated Security=True;"; cn.Open(); Data Source or Server?
FEN Databaser/dbAdgang18 Connection strings Connection strings er produkt-afhængige og som regel ikke særligt veldokumenterede Hvor kan man hente hjælp? – – Til MS SQL Server kan Visiual Studio hjælpe
FEN Databaser/dbAdgang19 2: Hent records Hent records vha. SQL-Select // Create a SQL command object. string strSQL = "SELECT * FROM Car"; SqlCommand myCommand = new SqlCommand(strSQL, cn); #region Data reader code // Obtain a data reader ala ExecuteReader(). SqlDataReader myDataReader; myDataReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection); // Loop over the results. while (myDataReader.Read()) { for (int i = 0; i < myDataReader.FieldCount; i++) { Console.Write("{0} = {1} ", myDataReader.GetName(i), myDataReader.GetValue(i).ToString().Trim()); } Console.WriteLine(); }
FEN Databaser/dbAdgang110 3: Luk connection Husk at lukke connection… –Så andre kan få adgang til databasen dbConn.Close();
FEN Databaser/dbAdgang111 Opgave Lav et program, som læser alle ansatte I Company-databasen
FEN Databaser/dbAdgang112 Design 1: SQL i domæneklasserne Indlejret SQL placeres i hver af domæneklasserne. Dette design er hurtigt at implementere, og kan bruges ifm. meget små applikationer og prototyper AnsatProjektDB.zipAnsatProjektDB
FEN Databaser/dbAdgang113 Design 1 (simpleste) Domæneklasser DB SQL Tabeller
FEN Databaser/dbAdgang114 Design 2 DB-lag mellem domæne og Database Den indlejrede SQL placeres i dataklasser. Dataklasserne er placeret i et lag mellem domæneklasserne og databasen Holder udmærket for små systemer (prototyper og mindre end domæneklasser) Små ændringer resulterer stadig i kildekodeændringer. Fordelen frem for design1 er, at man har isoleret SQL- koden i egne klasser. Dataklasserne kan evt. erstattes af stored procedures. AnsatProjektDBEksempel.zip
FEN Databaser/dbAdgang115 Design 2 (næstsimpleste) Domæneklasser DataAccess- klasser DB SQL Tabeller Objekter
FEN Databaser/dbAdgang116 Design 3 Domæneklasser Robust Persistenslag DB SQL Tabeller Objekter
FEN Databaser/dbAdgang117 “Rigtig” n-tier arkitektur
FEN Databaser/dbAdgang118 Eksempel på realisering af domænemodel (design 2) Del af design-klassediagram i et system til registrering af ansatte og projekter AnsatProjektDbEksempel.zip
FEN Databaser/dbAdgang119 AnsatProjekt Ved load fyldes GUI-komponenterne –Først med projektoplysninger: private void Form1_Load(object sender, System.EventArgs e){ ArrayList projekter = c.FindAlleProjekter(); foreach (Projekt p in projekter){ this.lstProjekter.Items.Add(p); if(!this.cmbAfdeling.Items.Contains(p.Afdeling)) this.cmbAfdeling.Items.Add(p.Afdeling); this.cmbAfdeling.SelectedItem = this.cmbAfdeling.Items[0]; }
FEN Databaser/dbAdgang120 AnsatProjekt Ved load fyldes GUI-komponenterne –Derefter med ansatoplysninger: ArrayList ansatte = c.FindAlleAnsatte(); foreach (Ansat a in ansatte) { this.cmbAnsat.Items.Add(a); } this.cmbAnsat.SelectedItem = this. cmbAnsat.Items[0]; }
FEN Databaser/dbAdgang121 AnsatProjekt Lad os følge knappen Tilknyt Medarbejder gennem systemet Findes i controller-klassen – tager Ansat, Projekt og timer som parametre Controlleren kalder ned i Projektklassen, som jo har ansvaret for oprettelsen af en forekomst af ArbejderPaa
FEN Databaser/dbAdgang122 AnsatProjekt Klassen AccessDb –Indkapsler en DbCommand (som skifter SQL- statement alt efter hvem der bruger den) –Styrer den ene connection projektet arbejder med –Hvorfor ikke bare en connection pr metode der skal tilgå db? Connections er en knap ressource Svært at holde styr på: –Hvad hvis en db-metode kalder en anden db-metode – hvem åbner og hvem lukker?
FEN Databaser/dbAdgang123 Opgaver Prøv det! –Fx til VW-databasen