Τι θα δούμε σε αυτό το μάθημα; Αλάθηεζε δεδνκέλωλ από ηνλ Microsoft SQL Server κε ηελ ρξήζε ηνπ ADO.NET θαη ζρεηηθέο θιάζεηο. SqlConnection θαη SqlConnectionStringBuilder SqlCommand θαη SqlParameter SqlDataReader SqlException Έλα παξάδεηγκα κε ηηο πξναλαθεξζείζεο θιάζεηο. Πξόθιεζε εμαηξέζεωλ από null ηηκέο ζηελ ΒΓ θαη αληηκεηώπηζε ηωλ πξνβιεκάηωλ.
Επικοινωνία με ΒΔ χρησιμοποιώντας το ADO.NET Τν ADO.NET είλαη κία βηβιηνζήθε θιάζεωλ γηα ηελ δεκηνπξγία εθαξκνγώλ πνπ αλαθηνύλ θαη ελεκεξώλνπλ βάζεηο δεδνκέλωλ από εθαξκνγέο ηνπ.net. Κάζε επηθνηλωλία ηνπ πξνγξάκκαηνο κε ηελ ΒΓ γίλεηαη κέζω παξνρέωλ δεδνκέλωλ (data providers). Κάζε Σύζηεκα Γηαρείξηζεο Βάζεωλ Γεδνκέλωλ (π.ρ. SQL Server, Oracle θιπ.) έρεη ηνπο δηθνύο ηνπ παξνρείο δεδνκέλωλ.
ΒΔ παραδείγματος: Northwind Traders
Παράδειγμα #1: Ανάκτηση παραγγελιών πελάτη Οη θιάζεηο πνπ ζα ρξεζηκνπνηήζνπκε βξίζθνληαη ζην namespace System.Data.SqlClient. Τν System.Data.SqlClient namespace πεξηέρεη ηηο θιάζεηο παξνρήο δεδνκέλωλ γηα ηνλ SQL Server. Απηέο νη θιάζεηο είλαη εμεηδηθεπκέλεο εθδόζεηο ηωλ γεληθόηεξωλ θιάζεωλ ηνπ ADO.NET εηδηθά γηα ηελ αιιειεπίδξαζε κε ηνλ SQL Server. Γεκηνπξγνύκε έλα project θνλζόιαο κε ην όλνκα ReportOrders.
Παράδειγμα #2: Δημιουργία σύνδεσης με την Βάση Δεδομένων Η θιάζε SqlConnection είλαη κία παξάγωγε θιάζε κίαο θιάζεο ηνπ ADO.NET πνπ νλνκάδεηαη Connection. Δίλαη ζρεδηαζκέλε γηα λα ρεηξίδεηαη ζπλδέζεηο κε βάζεηο δεδνκέλωλ ηνπ SQL Server. Σηελ κέζνδν Main δειώλνπκε ηελ ζύλδεζε: static void Main(string[] args) SqlConnection dataconnection = new SqlConnection();
Παράδειγμα #3: Χειρισμός εξαιρέσεων Η αιιειεπίδξαζε κε ηελ ΒΓ ελδέρεηαη λα πξνθαιέζεη εμαηξέζεηο. Τππηθά ελζπιαθώλνπκε ηνλ θώδηθα πξόζβαζεο ζηελ ΒΓ ζε έλα try-catch block. static void Main(string[] args)... try // Δδώ ζα βάινπκε ηηο εληνιέο πξόζβαζεο ζηελ Βάζε Γεδνκέλωλ catch (SqlException e) Console.WriteLine("Λάζνο πξόζβαζεο ζηελ Βάζε Γεδνκέλωλ: 0", e.message);
Παράδειγμα #4: Πληροφορίες σύνδεσης try Γηα λα ζπλδεζνύκε κε ηελ ΒΓ δίλνπκε πιεξνθνξίεο ζρεηηθέο κε ην πνπ είλαη ε ΒΓ, πωο νλνκάδεηαη θαη ηνλ ηξόπν πηζηνπνίεζεο (αζθάιεηα). Σηελ ζπλέρεηα αλνίγνπκε ηελ ζύλδεζε θαιώληαο ηελ εληνιή Open ζην SqlConnection αληηθείκελν: SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); builder.datasource = ".\\SQLExpress"; builder.initialcatalog = "Northwind"; builder.integratedsecurity = true; dataconnection.connectionstring = builder.connectionstring; dataconnection.open();
Παράδειγμα #5: Σχηματισμός ερωτήματος try Σρεκαηίδνπκε ην εξώηεκα πξνο ηελ ΒΓ: Console.Write( Γώζε ηνλ θωδηθό πειάηε (5 ραξαθηήξεο): "); string customerid = Console.ReadLine(); SqlCommand datacommand = new SqlCommand(); datacommand.connection = dataconnection; datacommand.commandtype = CommandType.Text; datacommand.commandtext = "SELECT OrderID, OrderDate, ShippedDate, ShipName, ShipAddress, " + "ShipCity, ShipCountry " + "FROM Orders WHERE CustomerID = @CustomerIdParam";
Παράδειγμα #6: Προσδιορισμός παραμέτρων ερωτήματος Γεκηνπξγνύκε ηηο SqlParemeter γηα ην εξώηεκα θαη ηηο πξνζζέηνπκε ζηελ εληνιή: try SqlParameter param = new SqlParameter("@CustomerIdParam", SqlDbType.Char, 5); param.value = customerid; datacommand.parameters.add(param);
Παράδειγμα #7: Αποτέλεσμα ερωτήματος. Η κλάση SqlDataReader Δθηεινύκε ην εξώηεκα. Τν απνηέιεζκα είλαη έλαο SqlDataReader. Η θιάζε SqlDataReader παξέρεη ηνλ ηαρύηεξν κεραληζκό αλάθηεζεο δεδνκέλωλ από κία ΒΓ ηνπ SQL Server: try Console.WriteLine(«Αλάθηεζε παξαγγειηώλ πειάηε 0\n\n", customerid); SqlDataReader datareader = datacommand.executereader();
Παράδειγμα #8: Ανάκτηση γραμμών (εγγραφών) από τον SqlDataReader try Η κέζνδνο Read ηνπ SqlDataReader αλαθηά ηελ επόκελε γξακκή από ηελ ΒΓ. Δπηζηξέθεη true αλ αλαθηήζεθε επηηπρώο ή false αλ ηειείωζαλ νη γξακκέο ηνπ απνηειέζκαηνο ηνπ εξωηήκαηνο. Δπνκέλωο ηππηθά θαινύκε ηελ Read ζην πιαίζην κηαο εληνιήο while όπωο δείρλεη ν αθόινπζνο θώδηθαο: while (datareader.read()) // Κώδηθαο πνπ επεμεξγάδεηαη ηελ ηξέρνπζα γξακκή // ηνπ απνηειέζκαηνο
Παράδειγμα #8: Ανάκτηση δεδομένων γραμμής και εμφάνισή τους try Αλαθηνύκε ηα δεδνκέλα θαη ηα εκθαλίδνπκε: while (datareader.read()) int orderid = datareader.getint32(0); DateTime orderdate = datareader.getdatetime(1); DateTime shipdate = datareader.getdatetime(2); string shipname = datareader.getstring(3); string shipaddress = datareader.getstring(4); string shipcity = datareader.getstring(5); string shipcountry = datareader.getstring(6); Console.WriteLine( Παξαγγειία: 0\nΗκεξνκελία: 1\nΗκεξνκελία Απνζηνιήο: 2\n" + "Σηνηρεία απνζηνιήο: 3\n4\n5\n6\n\n", orderid, orderdate, shipdate, shipname, shipaddress, shipcity, shipcountry);
Παράδειγμα #9: Κλείσιμο του SqlReader try Η εληνιή Close ηνπ SqlDataReader θιείλεη ηνλ SqlDataReader. Θα πξέπεη λα θαινύκε απηήλ ηελ εληνιή αθνύ ηειεηώζνπκε ηελ επεμεξγαζία ηωλ εγγξαθώλ ηνπ απνηειέζκαηνο, έηζη ώζηε λα καο επηηξαπεί λα ρξεζηκνπνηήζνπκε ην SqlConnection αληηθείκελν γηα ηελ εθηέιεζε επηπιένλ εληνιώλ: while (datareader.read()) datareader.close();
Παράδειγμα #10: Κλείσιμο της σύνδεσης με την ΒΔ try Τειηθά ζα πξέπεη λα θιείζνπκε ηελ ζύλδεζε κε ηελ ΒΓ. Απηό γίλεηαη ζην ηκήκα finally κεηά ην catch: catch (SqlException e) finally dataconnection.close();
Εκτέλεση του προγράμματος
SqlNullValueException Σην παξάδεηγκά καο αλ εθηειέζνπκε ην πξόγξακκα δίλνληαο ωο θωδηθό πειάηε ηελ ηηκή BONAP ζα πξνθιεζεί κία εμαίξεζε SqlNullValueException. Ο ιόγνο είλαη πωο δελ έρνπλ απνζηαιεί αθόκε όιεο νη παξαγγειίεο ζηνλ ελ ιόγω πειάηε θαη γηα θάπνηεο εγγξαθέο ηνπ ην πεδίν shipdate έρεη ηελ ηηκή null. Η εμαίξεζε ζα πξνθαιέζεη ηελ δηαθνπή ηνπ πξνγξάκκαηνο αλ δελ ηελ απνθύγνπκε.
Παράδειγμα πρόκλησης SqlNullValueException
Προγραμματιστική αποφυγή της εξαίρεσης SqlNullValueException Χξεζηκνπνηνύκε ηελ ζπλάξηεζε IsDBNull ηεο θιάζεο SqlDataReader ε νπνία επηζηξέθεη true αλ ε δνζείζα ωο παξάκεηξνο ζηήιε, έρεη ηελ ηηκή null. Σην παξάδεηγκά καο ε IsDBNull κπνξεί λα ρξεζηκνπνηεζεί όπωο θαίλεηαη ζηελ επόκελε δηαθάλεηα. Σην παξάδεηγκα αλ ε ηηκή ηεο ζηήιεο 2 είλαη null ζηελ ΒΓ, απιά εκθαλίδεηαη έλα κήλπκα πνπ ιέεη πωο ε παξαγγειία δελ έρεη απνζηαιεί αθόκε.
Περίληψη #1 Δξγαζία Πωο δεκηνπξγνύκε κία ζύλδεζε κε κία ΒΓ ηνπ SQL Server; Πωο πξνζδηνξίδνπκε ηηο ιεπηνκέξεηεο ηεο ζύλδεζεο θαη αλνίγνπκε ηελ ζύλδεζε; Τη πξέπεη λα θάλω Γειώλνπκε ηελ ζύλδεζε θαη δεκηνπξγνύκε έλα αληηθείκελν ηεο ζύλδεζεο θαιώληαο έλαλ constructor ηεο θιάζεο System.Data.SqlClient.SqlConnection όπωο θαίλεηαη ζηνλ αθόινπζν θώδηθα: using System.Data.SqlClient; SqlConnection dataconnection = new SqlConnection(); Χξεζηκνπνηνύκε έλα αληηθείκελν ηεο θιάζεο SqlConnectionStringBuilder γηα λα δώζνπκε ηηο πιεξνθνξίεο ηεο ζύλδεζεο θαη λα ζρεκαηίζνπκε ην connection string. Σηελ ζπλέρεηα θαηαρωξνύκε απηό ην string ζην ConnectionString ηεο ζύλδεζεο θαη θαινύκε ζηελ ζύλδεζε ηελ Open(): SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder(); builder.datasource = ".\\SQLExpress"; builder.initialcatalog = "Northwind"; builder.integratedsecurity = true; dataconnection.connectionstring = builder.connectionstring; dataconnection.open();
Περίληψη #2 Δξγαζία Πωο ζρεκαηίδνπκε εξωηήκαηα πξνο ηελ ΒΓ; Πωο εθηεινύκε ηα εξωηήκαηα; Τη πξέπεη λα θάλω Γεκηνπξγνύκε κία SqlCommand, ζέηνπκε ηελ ζύλδεζε (ηδηόηεηα Connection), ηνλ ηύπν (ηδηόηεηα CommandType) θαη ην εξώηεκα (ηδηόηεηα CommandText), όπωο δείρλεη ην αθόινπζν παξάδεηγκα: SqlCommand datacommand = new SqlCommand(); datacommand.connection = dataconnection; datacommand.commandtype = CommandType.Text; datacommand.commandtext = "SELECT OrderID, OrderDate, ShippedDate, ShipName, ShipAddress, " + "ShipCity, ShipCountry " + "FROM Orders WHERE CustomerID = @CustomerIdParam"; Δθόζνλ ην εξώηεκα επηζηξέθεη έλα ζύλνιν ηηκώλ (π.ρ. όπωο ζπκβαίλεη ζε κία Select) θαινύκε ζην SqlCommand αληηθείκελν ηελ ExecuteReader() κέζνδν, ε νπνία επηζηξέθεη έλα αληηθείκελν SqlDataReade, όπωο θαίλεηαη ζηνλ θώδηθα πνπ αθνινπζεί: SqlDataReader datareader = datacommand.executereader();
Περίληψη #3 Δξγαζία Πωο αλαθαινύκε ηα απνηειέζκαηα ηνπ εξωηήκαηνο από ηνλ SqlDataReader; Πωο αλαθηώ ηα δεδνκέλα κηαο γξακκήο ηνπ απνηειέζκαηνο; Τη πξέπεη λα θάλω Ο SqlDataReader παξέρεη ηελ κέζνδν Read() ε νπνία καο πεγαίλεη ζηελ επόκελε γξακκή ηνπ απνηειέζκαηνο θαη επηζηξέθεη true αλ ππάξρεη επόκελε γξακκή. Δπηζηξέθεη false αλ ηειείωζαλ νη γξακκέο ηνπ απνηειέζκαηνο. Έηζη κπνξνύκε λα ρξεζηκνπνηήζνπκε ηελ κέζνδν ζε έλα while, όπωο δείρλεη ην αθόινπζν παξάδεηγκα: while (datareader.read()) // Κώδηθαο πνπ επεμεξγάδεηαη ηελ ηξέρνπζα γξακκή // ηνπ απνηειέζκαηνο Αλάινγα κε ηνλ ηύπν ηεο θάζε ζηήιεο ηνπ απνηειέζκαηνο θαιώ ηελ θαηάιιειε κέζνδν GetX ζηνλ SqlDataReader. Γηα παξάδεηγκα ηελ GetInt32 αλ πξόθεηηαη γηα αθέξαην αξηζκό, δίλνληαο θαη ηνλ αξηζκό ηεο ζηήιεο (0 γηα ηελ πξώηε, 1 γηα ηελ δεύηεξε θιπ.) όπωο δείρλεη ην αθόινπζν παξάδεηγκα: while (datareader.read()) int orderid = datareader.getint32(0); DateTime orderdate = datareader.getdatetime(1);
Ερωτήσεις;