05a_Databanken - ADO.net

Embed Size (px)

Citation preview

  • 8/10/2019 05a_Databanken - ADO.net

    1/52

    Databanken

    ADO.NET

    14-11-2014

  • 8/10/2019 05a_Databanken - ADO.net

    2/52

    Intro

    Benaderen databanken vanuit .NET Mogelijkheden binnen Visual Studio

    Server Explorer

    .NET Data Providers Technieken

    ADO.NET

    Entity Framework (ORM) op een bestaande databank

    creatie van een nieuwe databank

    14-11-2014 - p.2ORM = Obejct-Relational Mapping

  • 8/10/2019 05a_Databanken - ADO.net

    3/52

  • 8/10/2019 05a_Databanken - ADO.net

    4/52

    14-11-2014 - p.5

    Visual Studio

    Hoe databanken aanspreken

    vanuit Visual Studio

  • 8/10/2019 05a_Databanken - ADO.net

    5/52

    Server Explorer

    Binnen Visual Studio kan jedatabanken bekijken (tabellen,views, stored procedures) via'Server Explorer'

    menu View > Server Explorer

    14-11-2014 - p.6

  • 8/10/2019 05a_Databanken - ADO.net

    6/52

    Server Explorer Add

    Nieuwe connectie toevoegenRMK Data Connections

    > Add Connection

    14-11-2014 - p.7

  • 8/10/2019 05a_Databanken - ADO.net

    7/52

    Server Explorer Add

    14-11-2014 - p.8

    SQL Server

    Microsoft Access

  • 8/10/2019 05a_Databanken - ADO.net

    8/52

    Server Explorer MS Access

    14-11-2014 - p.9

    Volledig pad en bestandsnaamvan de databank

    Gebruikersnaam en paswoord

    .mdb ( Microsoft.Jet.OLEDB.4.0.accdb (>=2007) -> Microsoft.ACE.OLEDB.12.0(32-bit)

    < b e st a n d sn a a m >

    http://www.microsoft.com/en-us/download/details.aspx?id=13255http://www.microsoft.com/en-us/download/details.aspx?id=13255
  • 8/10/2019 05a_Databanken - ADO.net

    9/52

    .\SQLSERVER2012

    < n a a m v a n d e d at a b an k >

    < d a t ab a se n a am >

    .\SQLSERVER2012

    Server Explorer SQL Server

    14-11-2014 - p.10

    SQL Server Instance Name

    Authentication: met je ingelogdeaccount of een specifiekegebruikersnaam en paswoord

    connectionstring!

  • 8/10/2019 05a_Databanken - ADO.net

    10/52

    Server Explorer

    14-11-2014 - p.11

    SQL Server

    Microsoft Access Database File

  • 8/10/2019 05a_Databanken - ADO.net

    11/52

  • 8/10/2019 05a_Databanken - ADO.net

    12/52

    Connectionstring

    Definieert naar waar en hoe je dataprovider moet connecteren naar dedatabank

    Belangrijkste onderdelen

    Provider (enkel bij OleDb)

    Server / Data Source

    Database / Initial Catalog

    User Id en PasswordOF Integrated Security

    (= gebruik windows credentials)

    14-11-2014 - p.13MSDN: Connection String Syntax

    http://msdn.microsoft.com/en-us/library/vstudio/ms254500(v=vs.110).aspxhttp://msdn.microsoft.com/en-us/library/vstudio/ms254500(v=vs.110).aspx
  • 8/10/2019 05a_Databanken - ADO.net

    13/52

    MS Access Database Files

    In applicatie: gebruik een relatief padData Source=|DataDirectory|\

    Connectionstring

    14-11-2014 - p.14

    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\SupportSystemDB.accdb

  • 8/10/2019 05a_Databanken - ADO.net

    14/52

    Connectionstring

    SQL Server

    14-11-2014 - p.15

    Data Source=.\SQLEXPRESS;Initial Catalog=TicketSystem;Integrated Security=True

    Data Source=.\SQLSERVER2012;Initial Catalog=TicketSystem;Integrated Security=True

  • 8/10/2019 05a_Databanken - ADO.net

    15/52

    Best practices

    Definieer connectionstring eenmaligin heel je applicatie

    Maak deze wijzigbaar zonder dat jecode gehercompileerd moet worden

    zie App.config

    Bij database files (bv. Access), maakhet pad relatief met |DataDirectory|

    14-11-2014 - p.17

  • 8/10/2019 05a_Databanken - ADO.net

    16/52

  • 8/10/2019 05a_Databanken - ADO.net

    17/52

  • 8/10/2019 05a_Databanken - ADO.net

    18/52

    ADO.NET

    14-11-2014

  • 8/10/2019 05a_Databanken - ADO.net

    19/52

    ADO.NET

    .NET class library voor communicatiemet database

    Namescape: System.Data

    14-11-2014 - p.21DBMS = Datasemanagementsysteem

    DBMS

    .NET Data Provider

    Connection

    Command

    Command

    Command

    Result

    Result

    Result

  • 8/10/2019 05a_Databanken - ADO.net

    20/52

    ADO.NET

    Result kan verschillende vormenhebben

    Server side cursor read-only en sequentieel

    1 specifieke waarde bv. resultaat van berekening

    geheel getal

    aantal gewijzigde recordsDataSet

    in memory relationele objectstructuur

    14-11-2014 - p.22

  • 8/10/2019 05a_Databanken - ADO.net

    21/52

    ADO.NET Architectuur

    14-11-2014 - p.23

  • 8/10/2019 05a_Databanken - ADO.net

    22/52

    .NET Data Providers

    Verzameling van libraries die je kangebruiken om databanken aan tespreken vanuit .NET

    Specieke .NET Data Provider per DBMS ODBC

    Sytem.Data.Odbc

    OleDb (MS Access, MS Excel)System.Data.OleDb

    SQL ServerSystem.Data.SqlClient

    OracleSystem.Data.OracleClient

    14-11-2014 - p.24

    ODT.NET

  • 8/10/2019 05a_Databanken - ADO.net

    23/52

    .NET Data Providers

    System.Data.Commonbase klassen waar elke data provider

    van overerft

    14-11-2014 - p.25Tutorials: System.Data.Common

    Klasse Doel

    DbConnection- DbTransaction

    Connectie met DBMS, inclusief beheren vantransacties

    DbCommand- DbParameter

    Uit te voeren statement, al dan nietgebruik makende van parameters

    DbDataReader Server-side cursor om gegevens uit telezen

    DbDataAdapter- DbCommandBuilder

    Omzetten van data uit DB naar eenDataSet. CommandBuilder zorgt voor degeneratie van de juiste commandos

    http://msdn.microsoft.com/en-us/library/a6cd7c08.aspxhttp://msdn.microsoft.com/en-us/library/a6cd7c08.aspx
  • 8/10/2019 05a_Databanken - ADO.net

    24/52

    14-11-2014 - p.26

    Connection

    Hoe leg ik met ADO.NET een

    connectie naar de databank?

  • 8/10/2019 05a_Databanken - ADO.net

    25/52

    Connection

    Object dat de connectie met dedatabase beheert

    Heeft connectionstring nodig

    Belangrijkste methodes:

    OpenClose

    BeginTransaction

    14-11-2014 - p.27

    f

  • 8/10/2019 05a_Databanken - ADO.net

    26/52

    Connection - App.config

    App.config

    Project: reference 'System.Configuration'

    Code

    14-11-2014 - p.28

    using System.Configuration;

    ...

    var connStr = ConfigurationManager.ConnectionStrings[""].ConnectionString;

    using(var myConnection = newSqlConnection(connStr))

    {

    myConnection.Open();

    ...

    myConnection.Close();

    }// In case of an exception, the connection will be automatically closed

  • 8/10/2019 05a_Databanken - ADO.net

    27/52

    Transaction

    Opstarten DB-transacties vanafconnection-object

    Beindigen van transacties:Commit/Rollback

    14-11-2014 - p.29

    using System.Configuration;

    ...

    var connStr = ConfigurationManager.ConnectionStrings[""].ConnectionString;

    using(varmyConnection = newOleDbConnection(connStr))

    {

    // Prepare the commands

    myConnection.Open();using(varmyTransaction = myConnection.BeginTransaction())

    {

    // Execute all commands inside the transaction

    myTransaction.Commit();

    } // In case of an exception, the transaction will be automatically be rollbacked

    myConnection.Close();

    } // In case of an exception, the connection will be automatically closed

    U i

  • 8/10/2019 05a_Databanken - ADO.net

    28/52

    Using-statement

    Bij het verlaten van het using-statement, wordt het objectgenitialiseerd in het usingstatement, automatisch opgekuist

    Transactie gerollbacked indien nog open

    Connectie gesloten

    Ook in geval van exceptions wordt

    alles mooi opgekuist! (bij compileringvertaald naar een try-finallystatement)

    14-11-2014 - p.30C# Reference: using Statement

    http://msdn.microsoft.com/en-us/library/yh598w02.aspxhttp://msdn.microsoft.com/en-us/library/yh598w02.aspx
  • 8/10/2019 05a_Databanken - ADO.net

    29/52

    14-11-2014 - p.32

    Command

    ADO.NET Command Object

  • 8/10/2019 05a_Databanken - ADO.net

    30/52

    C d

  • 8/10/2019 05a_Databanken - ADO.net

    31/52

    Command

    Belangrijkste properties:CommandText

    Uit te voeren statement

    Connection

    Welke DB moet aangesproken worden Connection-object

    CommandType Tekst, Stored Procedure

    Parameters Welke parameters (naam en waarde)

    worden er meegeven aan het commando

    14-11-2014 - p.34

    C d d t

  • 8/10/2019 05a_Databanken - ADO.net

    32/52

    Command zonder parameters

    14-11-2014 - p.35

    using System.Configuration;

    ...

    string connString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString))

    {

    //Prepare the commandsOleDbCommandcommand = newOleDbCommand();

    command.Connection = myConnection;

    command.CommandText

    = "SELECT Id, AccountId, Comment, DateOpened, State FROM tblTickets";

    myConnection.Open();

    //Execute command and process resultset

    ...

    myConnection.Close();}

    C d d t

  • 8/10/2019 05a_Databanken - ADO.net

    33/52

    Command zonder parameters

    14-11-2014 - p.36

    using System.Configuration;

    ...

    string connString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString)){

    //Prepare the command

    OleDbCommandcommand

    = newOleDbCommand("SELECT Id, AccountId, Comment, DateOpened, State FROM tblTickets

    , myConnection);

    myConnection.Open();

    //Execute command and process result set

    ...myConnection.Close();

    }

    Alternatief (constructor):

  • 8/10/2019 05a_Databanken - ADO.net

    34/52

    14-11-2014 - p.37

    Resultsets

    Verwerken resultset

    E t R d

  • 8/10/2019 05a_Databanken - ADO.net

    35/52

    ExecuteReader

    sql select-command (CRUD)

    Geeft een DataReaderobject terug

    Data kan ENKEL uitgelezen wordenServer-side cursor

    In een sequentile volgorde (rij per rij)

    Zolang reader open is, blijft er een linkopen naar de DB Pas dus op bij transacties!!!!

    14-11-2014 - p.38

    D t R d

  • 8/10/2019 05a_Databanken - ADO.net

    36/52

    DataReader

    Belangrijkste methodesRead()

    Zet de cursor op de eerstvolgende rij

    Geeft een boolean terug die aangeeft of ernog een nieuwe rij is

    GetOrdinal(string columnNaam) Geeft de index van de gevraagde kolom

    terug

    Get(int columnIndex) Geeft de inhoud van het veld terug op basis

    van de indexer in het gevraagde datatype GetString, GetInt32, .

    14-11-2014 - p.39

    E t R d b ld (1)

  • 8/10/2019 05a_Databanken - ADO.net

    37/52

    ExecuteReader voorbeeld (1)

    14-11-2014 - p.40

    publicList CreateCommandWithReader(){

    List requestedTickets = newList();

    stringconnString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString))

    {

    //Prepare the commands

    OleDbCommandcommand = newOleDbCommand();command.Connection = myConnection;

    command.CommandText = "SELECT Id, Comment, DateOpened, State FROM tblTickets";

    myConnection.Open();

    //Execute command and process resultset

    using(OleDbDataReaderreader = command.ExecuteReader())

    {

    intindexOfColumnId = reader.GetOrdinal("Id");intindexOfColumnComment = reader.GetOrdinal("Comment");

    intindexOfColumnDateOpened = reader.GetOrdinal("DateOpened");

    intindexOfColumnState = reader.GetOrdinal("State");

    ...

    E t R d b ld (2)

  • 8/10/2019 05a_Databanken - ADO.net

    38/52

    ExecuteReader voorbeeld (2)

    14-11-2014 - p.41

    ...

    while(reader.Read())

    {

    TicketloadingTicket = newTicket()

    {

    Id = reader.GetInt32(indexOfColumnId)

    , Comment = reader.GetString(indexOfColumnComment)

    , DateOpened = reader.GetDateTime(indexOfColumnDateOpened)

    , State = reader.GetByte(indexOfColumnState)

    };

    requestedTickets.Add(loadingTicket);

    }

    }

    myConnection.Close();

    }

    returnrequestedTickets;

    }

    E ec teScala

  • 8/10/2019 05a_Databanken - ADO.net

    39/52

    ExecuteScalar

    sql select-command (CRUD)

    Geeft uit de resultset de waarde uit

    de eerste kolom van de eerste rijterug (row one, column one)

    Vooral gebruikt voor berekendevelden adhv een query(COUNT, MAX, MIN, ) Weinig trafiek!

    14-11-2014 - p.42

    ExecuteScalar

  • 8/10/2019 05a_Databanken - ADO.net

    40/52

    ExecuteScalar

    14-11-2014 - p.43

    int? maxId = null;

    stringconnString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString))

    {

    //Prepare the command

    OleDbCommandcommand = newOleDbCommand("SELECT MAX(Id) FROM tblTickets", myConnection);

    myConnection.Open();

    maxId = (int)command.ExecuteScalar();

    myConnection.Close();

    }

    returnmaxId;

    ExecuteNonQuery

  • 8/10/2019 05a_Databanken - ADO.net

    41/52

    ExecuteNonQuery

    sql insert-, update-, delete-command(CRUD)

    Geeft een intterug die het aantalgeaffecteerde rijen teruggeeft

    14-11-2014 - p.44

    intnumberOfRecordsAffected;

    string connString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString))

    {

    //Prepare the command

    OleDbCommandcommand

    = newOleDbCommand("DELETE FROM tblTickets WHERE Id = 10", myConnection);

    myConnection.Open();

    //Command returns 0 when no records is deleted, otherwise the number of records deleted

    numberOfRecordsAffected = command.ExecuteNonQuery();

    myConnection.Close();

    }

  • 8/10/2019 05a_Databanken - ADO.net

    42/52

    DBNull

  • 8/10/2019 05a_Databanken - ADO.net

    43/52

    DBNull

    null in .NET NULL in DB

    null DBNull.Value

    Als je wil controleren of er null uit de DBkomt, controleer dus op DBNull.Value

    14-11-2014 - p.46

    int? maxId = null;stringconnString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString))

    {

    OleDbCommandcommand = newOleDbCommand("SELECT MAX(Id) FROM tblTickets WHERE Id > 10

    , myConnection);

    myConnection.Open();

    objectresult = command.ExecuteScalar();

    if(result.Equals(DBNull.Value))maxId = null;

    else

    maxId = (int)result;

    myConnection.Close();

    }

    returnmaxId;

  • 8/10/2019 05a_Databanken - ADO.net

    44/52

    DBNull Datareader

  • 8/10/2019 05a_Databanken - ADO.net

    45/52

    DBNull - Datareader

    Datareader heeft methode IsDBNull

    Reader.IsDbNull(indexOfColumnState) ? Bevat de kolom met de opgegeven indexer van

    de huidige rij uit de datareader een NULL op

    DB? Indien ja

    Geef null terug Gecast naar een nullable byte (byte?)

    Datatype moet overeenkomen met de return-

    waarde van de else-tak

    Indien nee Geef de byte waarde terug

    14-11-2014 - p.48

    reader.IsDBNull(indexOfColumnState) ? (byte?)null: reader.GetByte(indexOfColumnState)

    CommandParameters

  • 8/10/2019 05a_Databanken - ADO.net

    46/52

    CommandParameters

    Parametriseren van statements

    (bv. in WHERE-clause) Concatinatie van strings

    NOT DONE! (SQL Injection) Werken met DbParameter en die toevoegen

    aan het commando

    Belangrijkste eigenschappen Name (prefix@in SQL-statement)

    Value DbType Direction (standaard = Input)

    14-11-2014 - p.49Article: SQL Injection

    CommandParameters

    http://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspxhttp://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspxhttp://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspx
  • 8/10/2019 05a_Databanken - ADO.net

    47/52

    CommandParameters

    14-11-2014 - p.50

    intnumberOfRecordsAffected = -1;

    stringconnString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString))

    {

    //Prepare the command

    OleDbCommandcommand = newOleDbCommand("DELETE FROM tblTickets WHERE Id = @p_Id

    , myConnection);

    //Create the parameter

    OleDbParameteridParameter = newOleDbParameter("@p_Id", OleDbType.Integer);

    idParameter.Direction = System.Data.ParameterDirection.Input;

    idParameter.Value = 10;

    command.Parameters.Add(idParameter);

    myConnection.Open();

    //Command returns the number of records deleted, 0 when no rows are deleted

    numberOfRecordsAffected = command.ExecuteNonQuery();myConnection.Close();

    }

    returnnumberOfRecordsAffected;

    Article: SQL Injection

    CommandParameters Korter

    http://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspxhttp://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspxhttp://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspx
  • 8/10/2019 05a_Databanken - ADO.net

    48/52

    CommandParameters - Korter

    14-11-2014 - p.51

    intnumberOfRecordsAffected = -1;

    stringconnString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString)){

    //Prepare the command

    OleDbCommandcommand = newOleDbCommand("DELETE FROM tblTickets WHERE Id = @p_Id

    , myConnection);

    //Create the parameter

    command.Parameters.AddWithValue("@p_Id", 10);

    myConnection.Open();

    //Command returns the number of records deleted, 0 when no rows are deleted

    numberOfRecordsAffected = command.ExecuteNonQuery();

    myConnection.Close();

    }

    returnnumberOfRecordsAffected;

    Article: SQL Injection

    Kan ook in 1 regel code

    command.Parameters.AddWithValue

    Stored Procedure

    http://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspxhttp://msdn.microsoft.com/en-us/library/ms161953(v=sql.105).aspx
  • 8/10/2019 05a_Databanken - ADO.net

    49/52

    Stored Procedure

    Uitvoeren van stored procedures

    Command.CommandType =System.Data.CommandType.StoredProcedure

    Command.Text = naam van de sp

    14-11-2014 - p.52

    OleDbCommandcommand = newOleDbCommand("sp_GetAllTicketResponses", myConnection);

    command.CommandType = System.Data.CommandType.StoredProcedure;

    command.Parameters.AddWithValue( "@p_TicketId", ticketId);

    CREATE PROCEDUREsp_GetAllTicketResponses@p_TicketIdINT

    AS

    BEGIN

    SELECTId,TicketId,Response,DateAnswered,IsClientResponse

    FROMtblTicketResponses

    WHERETicketId=@p_TicketId

    END

    Stored Procedure vb (1)

  • 8/10/2019 05a_Databanken - ADO.net

    50/52

    Stored Procedure vb (1)

    14-11-2014 - p.53

    publicList CommandWithSP(intticketId)

    {

    List requestedResponses = newList();

    varconnString = ConfigurationManager.ConnectionStrings["SupportDB"].ConnectionString;

    using(varmyConnection = newOleDbConnection(connString))

    {

    //Prepare the commands

    OleDbCommandcommand = newOleDbCommand("sp_GetAllTicketResponses", myConnection);

    command.CommandType = System.Data.CommandType.StoredProcedure;

    command.Parameters.AddWithValue("@p_TicketId", ticketId);

    myConnection.Open();

    //Execute command and process resultset

    using(OleDbDataReaderreader = command.ExecuteReader())

    {

    intindexOfColumnId = reader.GetOrdinal("Id");

    intindexOfColumnTickedId = reader.GetOrdinal("TicketId");

    intindexOfColumnResponse = reader.GetOrdinal("Response");

    intindexOfColumnDateAnswered = reader.GetOrdinal("DateAnswered");intindexOfColumnIsClientResponse = reader.GetOrdinal("IsClientResponse");

    ...

  • 8/10/2019 05a_Databanken - ADO.net

    51/52

    Samengevat: de 3 stappen

  • 8/10/2019 05a_Databanken - ADO.net

    52/52

    Samengevat: de 3 stappen

    Connectie aanmaken m.b.v. Connectionstring

    Commando aanmaken Query instellen Connectie instellen Ev. parameters toevoegen

    Uitvoeren commando en resultset opvangen

    ExecuteNonQuery Result: aantal affected records Gebruik: Bij gewone insert/update/delete

    ExecuteScalar Result: de waarde van de 1erij, 1ekolom uit de resultatentabel

    van de uitgevoerde query Gebruik: Bij queries waar je adhv een functie n specifiek

    resultaat wil opvragen (bv. SCOPE_IDENTITY(), MAX(), ...) ExecuteReader

    Result: een server-side cursor om read-only & sequentieeldoor een resultatentabel te navigeren

    Gebruik: bij SELECT-statements die mogelijks mr dan n rijen n kolom bevragen