ADO.NET · tworzenie i przetwarzanie lokalnych relacyjnych baz danych · współpraca z zewnętrznym systemem zarządzania relacyjną bazą danych
Lokalna baza danych programu · przestrzeń nazw System.Data klasy: DataColumn, DataRow, DataTable, DataGridView, DataSet · DataColumn reprezentacja pojedynczej kolumny tabeli danych DataTable DataColumn colName = new DataColumn(); colName.DataType = Type.GetType("System.String"); // ReadOnly, Caption, ColumnName
· dodawanie do tabeli danych DataTable FirstTable = new DataTable("FirstTable"); FirstTable.Columns.Add(colName); · autoinkrementacja (przy tworzeniu wierszy) DataColumn empID = new DataColumn ("EmpID", Type.GetType("System.Int32")); empID.AutoIncrement = true; empID.AutoIncrementSeed = 100; empID.AutoIncrementStep = 10;
· DataRow wiersz tabeli danych DataTable DataTable empTable = new DataTable("Employees"); // columns EmpID, FirstName, LastName DataRow row = empTable.NewRow(); row["FirstName"] = "John"; row["LastName"] = "Brown"; empTable.Rows.Add(row); // DataRow.Delete() // AcceptChanges(), RejectChanges(), // BeginEdit(), EndEdit(), CancelEdit() // DataRow.Deleted , .Detached, .Modified // .New, .Unchanged
· DataTable tabela danych (relacja) ─ definiowanie i dodawanie kolumn ─ dodawanie i wypełnianie wierszy ─ określenie klucza głównego ( kluczy ) DataColumn[ ] PK = new DataColumn [ 1 ]; PK [ 0 ] = MyTable.Columns["EmpID"]; FirstTable.PrimaryKey = PK; · wyświetlanie tabeli danych element DataGridView · przeciągnąć z palety elementów lub DataGridView TheGrid = new DataGridView(); · następnie TheGrid.DataSource = FirstTable; DaBa
· usuwanie wierszy try { FirstTable.Rows[ rowNumber ].Delete( ); FirstTable.AcceptChanges( ); } catch( Exception ex ) { MessageBox.Show( ex.Message ); }
· filtrowanie tabeli danych string filterStr = "FirstName='John'"; DataRow [ ] TheFirstName = FirstTable.Select( filterStr ); / ,ftSt2, ... · wyrażenie filtrujące AND OR // operatory logiczne < <= > >= = <> IN LIKE // relacje + - * / % // operatory arytmetyczne *xxx xxx* %xxx xxx% // uogólnienia Sum Avg Min Max Count StDev Var // funkcje
· sortowanie tabeli danych TheFirstName = FirstTable.Select ( filterStr, "LastName ASC"); // "LastName DESC" · aktualizacja wierszy DataRow temp; for(int i=0; i < TheFirstName.Length; i++) { temp = TheFirstName[ i ]; temp["FirstName"] = "Ben"; }
· DataSet relacyjna baza danych · dowolna liczba tabel DataTable z określonymi powiązaniami Customers Inventory FirstName LastName CustID (k) CarID (k) Make Color PetName Orders OrderID (k) CarID CustID
· tworzenie bazy danych // Data Tables private DataTable inventoryTable = new DataTable("Inventory"); private DataTable customersTable = new DataTable("Customers"); private DataTable ordersTable = new DataTable("Orders");
// Data Set private DataSet carsDataSet = new DataSet("CarDataSet"); // make tables, set keys // add to data set carsDataSet.Tables.Add(ordersTable); carsDataSet.Tables.Add(customersTable); carsDataSet.Tables.Add(carsTable); // connect to data grid CarDataGrid.SetDataBinding (carsDataSet, "Inventory"); CustomerDataGrid.SetDataBinding (carsDataSet, "Customers");
· definiowanie powiązań pomiędzy tabelami DataRelation dr = new DataRelation("CustomerOrder", // parent carsDataSet.Tables["Customers"]. Columns["CustID"], // child carsDataSet.Tables["Orders"]. Columns["CustID"]); // carsDataSet.Relations.Add(dr); // Exception
dr = new DataRelation("InventoryOrder", carsDataSet dr = new DataRelation("InventoryOrder", carsDataSet.Tables["Inventory"]. Columns["CarID"], carsDataSet.Tables["Orders"]. Columns["CarID"]); // carsDataSet.Relations.Add(dr);
· nawigowanie pomiędzy tabelami, np · nawigowanie pomiędzy tabelami, np. wyszukanie opisu zamówienia i opisu samochodu na podstawie custID string strInfo = ""; DataRow drCust = null; DataRow[ ] drsOrder = null; int theCust = ... ; // custID // using custID, get the correct row drCust = carsDataSet.Tables["Customers"]. Rows[theCust]; strInfo += "Customer Name" + drCust["FirstName"] + "\n";
// navigate from customer table // to order table. drsOrder = drCust.GetChildRows (carsDataSet.Relations["CustomerOrder"]); // Get customer orders descriptions if(drsOrder != null) foreach(DataRow r in drsOrder) strInfo += "Order Number: " + r["OrderID"] + "\n";
// navigate from order table // to inventory table if (drsOrder != null) { DataRow[ ] drsInv = new DataRow [drsOrder.Length]; for(int i = 0; i < drsOrder.Length; ++i ) drsInv[i] = drsOrder[i].GetParentRows (carsDataSet.Relations["InventoryOrder"]); }
// Get cars descriptions if(drsInv.Length > 0) foreach(DataRow r in drsInv) { strInfo += "Make: " + r["Make"] + "\n"; strInfo += "Color: " + r["Color"] + "\n"; strInfo += "Pet Name: " + r["PetName"] + "\n"; } MessageBox.Show(strInfo + " Info based on cust ID"); CarDataSet Grid, PracSam Wypożyczalnia
· LINQ to DataSet var ImPe = from osa in dataSet1.Tables["Osoby"].AsEnumerable() where osa["Imie"].ToString() == "Alicja" //osa["Imie"] -> object select new { im = osa["Imie"], pe = osa["Pobory"] }; foreach (var os in ImPe) st += os.im + ", " + os.pe.ToString() + "\n"; LinqDS
ADO.NET · powiązanie z istniejącą bazą danych OleDb Provider : System.Data.OleDb Sql Provider : System.Sql.SqlClient · nawiązywanie połączenia OleDbConnection cn = new OleDbConnection(); cn.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;" + @"data source = C:\NET\C#\Examples\Access_DB\cars.mdb"; // odpowiednio dla SQL Server i Oracle cn.Open(); // BeginTransaction, EndTransaction, // RollbackTransaction, ... cn.Close();
· sformułowanie polecenia SQL string strSQL = "Select ... "; OleDbCommand MyCommand = new OleDbCommand( strSQL , cn ); // albo new OleDbCommand( ); MyCommand.Connection = cn; MyCommand.CommandText = strSQL;
· odczytanie strumienia rekordów ( bez nawigacji, bez zapisu, przetwarzanie połączeniowe ) OleDbDataReader TheDataReader; TheDataReader = TheCommand.ExecuteReader(); while ( TheDataReader.Read() ) { .... TheDataReader["Make"] ..... } // można też przekazywać parametry // OleDbParameter // i wykonywać procedury z bazy danych // MyCommand.ExecuteNonQuery
· odwzorowanie bazy danych w DataSet OleDbDataAdapter // open a connection OleDbConnection cn = new OleDbConnection(); cn.ConnectionString = "Provider=Microsoft.JET.OLEDB.4.0;" + @"data source = C:\NET\C#\Examples\Access_DB\cars.mdb"; // cn.Open();
// create commands OleDbCommand selectCmd = new OleDbCommand("SELECT ....", cn); // make a data adapter & // associate commands OleDbDataAdapter dAdapt = new OleDbDataAdapter(); dAdapt.SelectCommand = selectCmd; // DeleteCommand, InsertCommand // UpdateCommand
// create and fill the DataSet DataSet theDS = new DataSet("CarsDataSet"); dAdapt.Fill(theDS, "Inventory"); // fill one // of tables ........ // add some records to myDS DataRow[] theDataRowArray = theDS.Tables[0]. Select(null, null, DataViewRowState.Added); dAdapt.Update( theDataRowArray ); cn.Close(); Cars, BazaProjektów
· LINQ to SQL - pobieranie danych z DataSet ( zwykłe połączenie z bazą danych) var NaPe = from car in dataSet1.Tables["Inventory"].AsEnumerable() where (string)car["Color"] == "Red" select new { ma = (string)car["Make"], pe = (string)car["PetName"] }; Linq3
- pobieranie danych z DataSet ( automatyczne dołączanie bazy danych ) Data / Add New Data Source / Database New Connection / Change / Browse / Tables powstaje klasa opakowująca tabele danych : tabele, kolumny => składowe tej klasy dodać element dataGridView wskazać jako źródło danych wybraną tabelę pobieranie danych var MaCo = from car in carsDataSet.inventory where car.Color == "Black„ select new { ma = car.Make, pt = car.PetName }; Linq4
Przetwarzanie plików XML · wyczytywanie i zapis plików XML a) serializacja using System.Xml.Serialization; // [Serializable] public class Disk { public string Make ; [NonSerialized] public int something ; public bool SATA; }
[Serializable] public class Computer { public Disk disk = new Disk ( ) ; public long Price ; } // public class Laptop : Computer { public double Weight;
XmlSerializer xs = new XmlSerializer(typeof (Laptop)); FileStream data = File.Create ("Lap.xml"); // Laptop lap = new Laptop(); xs.Serialize(data , lap ); data.Close(); data = File.OpenRead("Lap.xml"); Laptop nn = (Laptop)xs.Deserialize(data);
<?xml version="1.0"?> <Laptop xmlns:xsi="http://www.w3.org/2001/ XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <disk> <Make>NEC</Make> <SATA>true</SATA> </disk> <Price>2127</Price> <Weight>2</Weight> </Laptop>
- serializowane są składowe publiczne - musi istnieć publiczny konstruktor bezargmentowy - nazwy składowych => nazwy elementów XML - atrybuty [XmlAttribute("Producer")] public string make; // [XmlIgnore]
b) odczyt bez ładowania dokumentu XmlTextReader // XmlTextReader xtr = new XmlTextReader("Lap.xml"); xtr.Read(); // kolejny element Console.WriteLine ( xtr.NodeType.ToString() + " < " + xtr.Name + " > " + xtr.Value ); XRD
c) tworzenie pliku XML XmlTextWriter XmlTextWriter xw = new XmlTextWriter("NaPro.xml", Encoding.UTF8); // xw.WriteStartElement("car"); xw.WriteElementString("Name", CarList[i, 0]); xw.WriteValue(i); xw.WriteEndElement(); xw.Flush(); xw.Close(); XWR
· analiza pliku XML XmlDocument - podstawowe właściwości ChildNodes // węzły podrzędne I stopnia FirstChild // pierwszy węzeł podrzędny Name // nazwa węzła NodeType // typ węzła XmlNodeTypes Value // wartość (test) Attributes // atrybuty InnerText // wartość węzła i wszystkich // węzłów zagnieżdżonych InnerXml // XML : wszystkie zagnieżdżone OuterXml // XML : bieżący // i wszystkie zagnieżdżone
- odnajdywanie elementów GetElementByTagName => XmlNodeList XmlDocument xdoc = new XmlDocument(); xdoc.Load("FileName"); string TagName = "City"; // <City> Oslo </City> XmlNodeList xlist = xdoc.GetElementsByTagName(TagName); foreach (XmlNode xn in xlist) { xn. .... } string st = xn.FirstChild.Value; // albo st = xlist[0].FirstChild.Value; XDoc1
- dopisywanie i usuwanie elementów xdoc = ..... // XmlDocument parent = ..... // from XmlNodeList XmlNode newCar = xdoc.CreateElement("car"); parent.AppendChild(newCar); XmlNode newName = xdoc.CreateElement("Name"); newCar.AppendChild(newName); newName.AppendChild ( xdoc.CreateTextNode("Liana") );
xdoc = ..... // XmlDocument parent = ..... // from XmlNodeList child = ...... // one of parent’s children // parent.RemoveChild(child); // and all its children xdoc.Save("FileName"); XDoc2
- wyrażenia XPath <Order> <Client> <Name>John Brown</Name> </Client> <Items> <Item> <Name>DVD Recorder</Name> <Price>142,99</Price> </Item> </Items> </Order>
XmlDocument doc = new XmlDocument(); doc.Load("orders.xml"); // XmlNodeList nodes = doc.SelectNodes("/Order/Items/Item/Name"); foreach (XmlNode node in nodes) { Console.WriteLine(node.InnerText); }
· LINQ to XML - tworzenie pliku XML z kolekcji XDocument xml = new XDocument( new XDeclaration("1.0", "utf-8", "yes"), new XElement("ListaOsob", from osoba in listaOsob // list<Osoba> orderby osoba.Wiek select new XElement("Osoba", new XAttribute("Id", osoba.Id), new XElement("Nazwisko", osoba.Nazwisko), new XElement("Wiek", osoba.Wiek)))
- pobieranie danych z pliku XML XDocument xml = XDocument.Load("Osoby.xml"); // IEnumerable<string> listaOsobPelnoletnich = from osoba in xml.Descendants("Osoba") where int.Parse(osoba.Element("Wiek").Value) >= 18 orderby osoba.Element("Nazwisko").Value select osoba.Element("Nazwisko").Value; LinqXML
· analiza poprawności pliku XML - składnia XML XmlDocument xdoc = new XmlDocument(); xdoc.Load("FileName"); // Exception - wzorzec pliku XML => *.xsd DataSet ds = .... ds.WriteXmlSchema(FileName); // xsd.exe file.xml => file.xsd XRD
XmlSchemaSet sc = new XmlSchemaSet(); sc.Add(null, "Cars.xsd"); XmlReaderSettings settings = new XmlReaderSettings(); settings.ValidationType = ValidationType.Schema; settings.Schemas = sc; XmlReader reader = XmlReader.Create("Cars.xml", settings); try { while (reader.Read()) { } } // read all catch (XmlSchemaValidationException err) {...} Veri
· korzystanie z serwisów internetowych ( Web Service ) - Project / Add Web Reference //.asmx - język WSDL <wsdl:definitions targetNamespace= "http://terraserver-usa.com/TerraService2/"> <s:element name="ConvertLonLatPtToNearestPlace"> <s:complexType> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="point" type="tns:LonLatPt"/> </s:sequence> </s:complexType> </s:element>
<s:complexType name="LonLatPt"> <s:sequence> <s:element minOccurs="1" maxOccurs="1" name="Lon" type="s:double"/> <s:element minOccurs="1" maxOccurs="1" name="Lat" type="s:double"/> </s:sequence> </s:complexType>
<s:element name="ConvertLonLatPtToNearestPlaceResponse"> <s:complexType> <s:sequence> <s:element minOccurs="0" maxOccurs="1" name="ConvertLonLatPtToNearestPlaceResult" type="s:string"/> </s:sequence> </s:complexType> </s:element> . . . . . . . . . . . . .
- protokół SOAP <soap:Envelope xmlns:xsi="http://www.w3.org .... <soap:Body> <GetWeather xmlns="http://www.webserviceX.NET"> <CityName>string</CityName> <CountryName>string</CountryName> </GetWeather> </soap:Body> </soap:Envelope>
net.webservicex.www.GlobalWeather gw = new net.webservicex.www.GlobalWeather( ); // string panstwo = " .... "; string Miasta = gw.GetCitiesByCountry(panstwo); // pobranie nazwy miasta z tekstu XML string Pogoda = gw.GetWeather(miasto, panstwo); // pobranie danych pogodowych z tekstu XML WebSer