CUSTOM CLASSES vs. DataSet
Förord
CUSTOM CLASSES vs. DataSet I detta korta exempel så tänkte jag visa hur du på ett enkelt sätt kan använda egna klasser för att lagra data i, istället för exempelvis ett DataSet. Exemplet ska inte på något sätt ses som en ersättning för DataSet utan mer som ett alternativ som kan passa i vissa lägen där man istället vill använda sig av sin egen objektstruktur. Kom gärna med feedback på koden, ifall något kan göras snabbare,enklare... FÖLJANDE FILER INGÅR I DENNA DEMO: Kund.cs Kunder.cs KunderMetoder.cs KunderShowDataGrid.aspx KunderShowDataGrid.aspx.csInnehåll
Exemplet nedan går i stora drag ut på att du hämtar data från Northwind Customers tabell, fyller dina kundobjekt med data som sedan läggs till i ett collection objekt som jag valt att kalla "Kunder".
För att köra koden rakt av behöver du SQLSERVER Northwind.db.
Har du inte Northwind databasen så kan du skapa en tabell som innehåller de aktuella kolumnerna och anropa den istället.
kolumnnamn som används från Northwind.db Customers tabell: CustomerID,CompanyName,ContactName
Börja med att skapa ett projekt i exempelvis VS-studio och skapa alla de klasser och webform du behöver för demon och använd dig av koden nedan. Antingen klistra in rakt av för att lättare kunna läsa koden,.. eller koda själv med detta som utgångspunkt.
Använder du koden rakt av så glöm inte att ändra username och password i connection strängarna.
Jag har i detta exempel valt att lagra Kund objekten i Session, men ett bättre alternativ kan vara att lägga dem i cachen där du enkelt styr hur länge objektet ska existera innan de på nytt måste hämtas från databasen. Se alternativt exempel nedan:
Men som sagt i detta exempel så kör vi på Session.
Ok, dags att sätta igång -->
Nedan finner du kod till alla de filer som ingår i projektet.
Kund.cs
Kunder.cs
KunderMetoder.cs
KunderShowDataGrid.aspx
KunderShowDataGrid.aspx.cs
//KLASS KUNDER.CS
//KLASS KUNDERMETODER.CS
//DENNA KLASS HÄMTAR DATA FRÅN DATABASEN OCH FYLLER KUND OBJEKTEN MED VÄRDEN
ANVÄNDARGRÄNSSNITT HTML-->>
//KUNDERSHOWDATAGRID.ASPX
-------------------------------------------
// KUNDERSHOWDATAGRID.ASPX.CS
ANVÄNDAR GRÄNSSNITT CODEBEHIND-->>>
---------------------------------------
SLUT
Hoppas du fick allt att fungera annars så kan du läsa mer på
http://aspnet.4guysfromrolla.com/articles/102302-1.aspx
KÖR DETTA TEST FÖR ATT KOLLA SÅ ATT ALLT FUNGERAR SOM DET SKA:
TEST Custom Classes:
1: Uppdatera kund objecten i gridden. (tryck på uppdatera i Datagriden)
2: Tryck på "Clear Session" knappen (hela Session["Kunder"] listan töms och Kunder arrayen blir tom)
3: Tryck på "Ladda Data från DB"hämtar data fyller-> KundObjekten->Kunder arrayen->Datagriden (du ser att dina ändringar inte slagit igenom pga att du endast uppdaterat enskilda kund object som legat i Session. När nu data hämtas på nytt är ändringarna borta.
4: Gör flera ändringar på nytt i Datagriden tryck på uppdatera i Datagriden och avsluta med att Klicka på "Spara alla ändringar till databasen". (Du får nu ett medd. om hur många poster som uppdaterats)
5: Klicka "Clear Session"
6 : Klicka "Ladda Data" (som du ser så har object värdena nu sparats till databasen och ändringarna kan visas i Datagriden.)
Mvh, Stanley Broo - GBO Media
För att köra koden rakt av behöver du SQLSERVER Northwind.db.
Har du inte Northwind databasen så kan du skapa en tabell som innehåller de aktuella kolumnerna och anropa den istället.
kolumnnamn som används från Northwind.db Customers tabell: CustomerID,CompanyName,ContactName
Börja med att skapa ett projekt i exempelvis VS-studio och skapa alla de klasser och webform du behöver för demon och använd dig av koden nedan. Antingen klistra in rakt av för att lättare kunna läsa koden,.. eller koda själv med detta som utgångspunkt.
Använder du koden rakt av så glöm inte att ändra username och password i connection strängarna.
Jag har i detta exempel valt att lagra Kund objekten i Session, men ett bättre alternativ kan vara att lägga dem i cachen där du enkelt styr hur länge objektet ska existera innan de på nytt måste hämtas från databasen. Se alternativt exempel nedan:
private void BindGrid(bool hamtaNyData)
{
dsCustomersTyped ds = GetCustomers(hamtaNyData);
DataGrid1.DataSource = ds.Customers;
DataGrid1.DataBind();
}
public dsCustomersTyped GetCustomers(bool sprangCachen)
{
string cacheNamn = "KunderCache";
object cacheData = (dsCustomersTyped)Cache[cacheNamn];
if((sprangCachen) || (cacheData == null))
{
cacheData = new KunderMetod().HamtaKunder();
Cache.Insert(cacheNamn, cacheData, null,DateTime.Now.AddSeconds(HamtaAntalSekunderFranConfig(cacheNamn)),TimeSpan.Zero);
}
return (dsCustomersTyped)cacheData;
}
private int HamtaAntalSekunderFranConfig(string cacheNamn){
int antalSekunder=Convert.ToInt32(ConfigurationSettings.AppSettings[cacheNamn]);
Response.Write("Ny data inhämtad till Cachen. Datan utgår om: "+antalSekunder +"sekunder.");
return antalSekunder;
}
Men som sagt i detta exempel så kör vi på Session.
Ok, dags att sätta igång -->
Nedan finner du kod till alla de filer som ingår i projektet.
Kund.cs
Kunder.cs
KunderMetoder.cs
KunderShowDataGrid.aspx
KunderShowDataGrid.aspx.cs
//KLASS KUND.CS
using System;
namespace CustomClasses
{
public class Kund
{
private string kundID;
private string företagsNamn;
private string kontaktPerson;
public Kund(){}
public Kund(string kundID,string företagsNamn,string kontaktPerson){
this.kundID = kundID;
this.företagsNamn = företagsNamn;
this.kontaktPerson = kontaktPerson;
}
public string KundID
{
get {return kundID;}
set{kundID = value;}
}
public string FöretagsNamn
{
get{return företagsNamn;}
set{företagsNamn = value;}
}
public string KontaktPerson
{
get{return kontaktPerson;}
set{kontaktPerson = value;}
}
}
}
//KLASS KUNDER.CS
using System;
using System.Collections;
namespace CustomClasses
{
// ärver Arraylist. i detta object ska vi stoppa in alla enskilda kunder.
public class Kunder : ArrayList
{
public Kunder()
{
}
}
}
//KLASS KUNDERMETODER.CS
//DENNA KLASS HÄMTAR DATA FRÅN DATABASEN OCH FYLLER KUND OBJEKTEN MED VÄRDEN
using System;
using System.Data;
using System.Data.SqlClient;
namespace CustomClasses
{
public class KunderMetoder
{
public KunderMetoder(){}
public Kunder HamtaKunder(){
SqlConnection conn1 = new SqlConnection("server=(local);database=Northwind;uid=sa;pwd=sa;"); //ÄNDRA
conn1.Open();
SqlCommand cmd1 = new SqlCommand("select CustomerID,CompanyName,ContactName FROM Customers",conn1);
SqlDataReader dr1 = cmd1.ExecuteReader(CommandBehavior.CloseConnection);
Kunder kunder = new Kunder(); // instans av arrayklassen
while(dr1.Read()){
Kund kund = new Kund(); //instans av kund klassen
kund.KundID = (string)dr1[0];
kund.FöretagsNamn = (string)dr1[1];
kund.KontaktPerson = (string)dr1[2];
kunder.Add(kund); // stoppar in kunden i Kunder klassen.
}
dr1.Close();
return kunder;
}
// Denna funktion kollar ifall Kund objektet skiljer sig från det som står i databasen.
// Dvs har vi gjort några ändringar i Datagriden?
public bool CheckKundMotDatabas(Kund kundIn, SqlConnection conn1)
{
bool boolSkaUppdateras=false;
Kund kund = kundIn;
SqlCommand cmd1 = new SqlCommand();
cmd1.CommandText = "select CustomerID,CompanyName,ContactName FROM Customers";
cmd1.Connection = conn1;
SqlDataReader dr1 = cmd1.ExecuteReader();
while(dr1.Read())
{
if(kund.KundID == (string)dr1[0] && kund.FöretagsNamn != (string)dr1[1]){
boolSkaUppdateras = true;
break;
}
}
dr1.Close();
return boolSkaUppdateras;
}
// Själva uppdaterings funktionen som returnerar "1" ifall posten blivit uppdaterad (rowsaffected SQL)
public int UppdateraKunder(string kundID,string företagsNamn, SqlConnection conn1)
{
SqlCommand cmd1 = new SqlCommand("UPDATE Customers SET CompanyName='"+företagsNamn+"' WHERE CustomerID='"+kundID+"'",conn1);
int radUppdaterad = cmd1.ExecuteNonQuery();
return radUppdaterad;
}
}
}
ANVÄNDARGRÄNSSNITT HTML-->>
//KUNDERSHOWDATAGRID.ASPX
<%@ Page language="c#" Codebehind="KunderShowDatagrid.aspx.cs" AutoEventWireup="false" Inherits="CustomClasses.KunderShowDatagrid" %>
KunderShowDatagrid
-------------------------------------------
// KUNDERSHOWDATAGRID.ASPX.CS
ANVÄNDAR GRÄNSSNITT CODEBEHIND-->>>
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Data.Common;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace CustomClasses
{
public class KunderShowDatagrid : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button btnUdateFinal;
protected System.Web.UI.WebControls.Button btnRestartSession;
protected System.Web.UI.WebControls.Button btnLaddaData;
protected System.Web.UI.WebControls.DataGrid DataGrid1;
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack)
{BindTheGrid();}
}
// Körs när du trycker på "Ändra" knappen i Datagrid
protected void Edit(object sender, DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex = (int)e.Item.ItemIndex;
BindTheGrid();
}
// Körs när du trycker på "Avbryt" knappen i Datagrid
protected void Cancel(object sender, DataGridCommandEventArgs e)
{
DataGrid1.EditItemIndex = -1;
BindTheGrid();
}
//DEL1 Uppdatera Kunder arrayen och visa ändringar bara i DataGrid,
// OBS! Du har ej sparat till databas ännu.
// Körs när du trycker på "Uppdatera Kunder Session Array" knappen i Datagrid
protected void UpdateKunderArray(object sender, DataGridCommandEventArgs e)
{
Kunder kunder =(Kunder)Session["Kunder"];
for(int i=0;i Kund kund =(Kund)kunder[i];
if(kund.KundID == (string)DataGrid1.DataKeys[e.Item.ItemIndex]){ // Sök rätt på aktuell Kund i arrayen
kund = (Kund)kunder[i];
kund.FöretagsNamn = ((TextBox)e.Item.FindControl("tbxForetag")).Text.Replace("'", "''");
// OBS! Text.Replace("'", "''"); Skyddar mot SQL injection
kunder[i] = kund; // Skriv tillbaka kunden in i arrayen
Session["Kunder"] = kunder; // återknyt Kunder arrayen till Session.
break;
}
}
DataGrid1.EditItemIndex =-1;
BindTheGrid();
}
//>> DEL 2 Spara ner alla object ändringar till databasen.
// Körs när du trycker på "Spara alla ändringar till DB" ovanför Datagrid
public void UpdateFinal(object sender, System.EventArgs e)
{
Kunder kunder = (Kunder)Session["Kunder"];
SqlConnection conn1 = new SqlConnection("server=(local);database=Northwind;uid=sa;pwd=sa;");//ÄNDRA
conn1.Open();
int posterUppdaterade=0;
for(int i=0;i{
Kund kund =(Kund)kunder[i];
if(new KunderMetoder().CheckKundMotDatabas(kund,conn1)){
posterUppdaterade += new KunderMetoder().UppdateraKunder(kund.KundID,kund.FöretagsNamn,conn1);
}
}
conn1.Close();
DataGrid1.EditItemIndex =-1;
BindTheGrid();
Response.Write(posterUppdaterade+" Poster blev uppdaterade");
Response.Write("Databas conn1 koppling är:"+conn1.State.ToString());
}
// Används av de flesta funktioner i denna övning. Kollar ifall Session objektet är null
// isåfall hämta ny data från databasen med hjälp av km.HamtaKunder() i KunderMetoder klassen.
public void BindTheGrid(){
if(Session["Kunder"] == null){
Session["Kunder"] = new KunderMetoder().HamtaKunder();
}
DataGrid1.DataSource =(Kunder)Session["Kunder"];
DataGrid1.DataBind();
}
// Körs när du trycker på "Clear Session" knappen i Datagrid
public void ClearSession(object sender, System.EventArgs e){
Session.Clear();
if(Session["Kunder"]==null){Response.Write("Session['Kunder'] är tom");}
}
// Körs när du trycker på "Ladda Data" knappen ovanför Datagriden.
public void LaddaData(object sender, System.EventArgs e)
{
BindTheGrid();
}
}
---------------------------------------
SLUT
Hoppas du fick allt att fungera annars så kan du läsa mer på
http://aspnet.4guysfromrolla.com/articles/102302-1.aspx
KÖR DETTA TEST FÖR ATT KOLLA SÅ ATT ALLT FUNGERAR SOM DET SKA:
TEST Custom Classes:
1: Uppdatera kund objecten i gridden. (tryck på uppdatera i Datagriden)
2: Tryck på "Clear Session" knappen (hela Session["Kunder"] listan töms och Kunder arrayen blir tom)
3: Tryck på "Ladda Data från DB"hämtar data fyller-> KundObjekten->Kunder arrayen->Datagriden (du ser att dina ändringar inte slagit igenom pga att du endast uppdaterat enskilda kund object som legat i Session. När nu data hämtas på nytt är ändringarna borta.
4: Gör flera ändringar på nytt i Datagriden tryck på uppdatera i Datagriden och avsluta med att Klicka på "Spara alla ändringar till databasen". (Du får nu ett medd. om hur många poster som uppdaterats)
5: Klicka "Clear Session"
6 : Klicka "Ladda Data" (som du ser så har object värdena nu sparats till databasen och ändringarna kan visas i Datagriden.)
Mvh, Stanley Broo - GBO Media
Stanley Broo
.NET är oerhört snabbt på att instansiera objekt vilket gör att använda sig av sk. custom classes ..som du skapar själv kan vara upp till 3ggr snabbare än tex ett typat dataset. Såg en presentation av Jimmy Nilsson nyligen och resultaten var slående. Men enligt utsago så kommer MS att höja prestandan på DataSetet till 2.0.