Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Artiklar / Titel på artikeln

CUSTOM CLASSES vs. DataSet

Postad 2004-11-13 av Stanley Broo i sektionen ASP.NET, C#, Okategoriserat med 1 Kommentarer | Läst av: 5282, Betyg: 100%

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.cs
Innehå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:

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













OnCancelCommand="Cancel"
OnEditCommand="Edit"
OnUpdateCommand="UpdateKunderArray"
id="DataGrid1" runat="server" AutoGenerateColumns="False">





<%#DataBinder.Eval(Container.DataItem,"FöretagsNamn")%>



Text=<%#DataBinder.Eval(Container.DataItem,"FöretagsNamn")%> />










-------------------------------------------

// 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
Upp

1 Kommentarer


  1. Stanley Broo
    13 nov 2004

    .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.

Skriv en kommentar på artikeln

Ditt betyg på artikeln



Kommentar:





Nyligen

  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo
  • 14:25 Tips på verktyg för att skapa QR-k
  • 14:23 Tips på verktyg för att skapa QR-k
  • 20:52 Fungerer innskuddsbonuser egentlig

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 569 153
27 952
271 704
1 480
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies