Upload
jupii1994
View
231
Download
0
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=132558/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).aspx8/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.aspx8/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.aspx8/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).aspx8/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).aspx8/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).aspx8/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