Öka performance... DataBinder.Eval vs. DbDataRecord
Förord
I denna artikel så tänkte jag ta upp fördelen med att explicit casta outputen istället för att använda DataBinder.Eval på .aspx sidan. DataReader använd DbDataRecord:<%#((DbDataRecord)Container.DataItem)["CompanyName"]%> DataSet använd DataRowView:<%#((DataRowView)Container.DataItem)["CompanyName"]%> DataBinder.Eval fungerar både för Reader och DataSet <%#DataBinder.Eval(Container.DataItem,"CompanyName")%> ..men är ca 10-20% slöare.Innehåll
»»
Relaterade artiklar
» CUSTOM CLASSES vs. DataSetFördelen med DataBinder.Eval metoden är att den funkar för alla datakällor (dataSource=reader eller dataset), dvs om du skulle ändra från ex. en DataReader till ett DataSet i framtiden så behöver du inte gå in och ändra i dina .aspx sidor.
Fördelen med att använda explicit DataRowView för Dataset och DbDataRecord för DataReader är performance. Hur mkt är jag osäker på men jag har hört allt från 10-20%. Testa gärna och lämna en kommentar så vet jag också.
Ok, då sätter vi igång. Först ska vi skapa codebehind sidan som hämtar lite kunddata från Northwind Customers table med en DataReader.
Repeater.aspx.cs (codebehind)
Ok nu skapar vi .aspx sidan.
I exempel:1 så knyter jag datan med DataBinder.Eval och i exempel:2 så knyter vi med DbDataRecord ...eftersom vi använder en DataReader i codebehind. Hade vi använt oss av ett DataSet i codebehind så skulle vi istället använda DataRowView för att ta fram datan.
DataBinder.Eval ..så här brukar det se ut i de flesta exempel på både nätet och i böcker.
Repeater.aspx
Använd istället "DbDataRecord" när du använder en DataReader.
Repeater.aspx
Det ända du behöver göra för att komma åt DataReaderns explicit DbDataRecord är att importera namespacet till din codebehind class.
USING SYSTEM.DATA.COMMON;
Stanley Broo - GBO Media
Fördelen med att använda explicit DataRowView för Dataset och DbDataRecord för DataReader är performance. Hur mkt är jag osäker på men jag har hört allt från 10-20%. Testa gärna och lämna en kommentar så vet jag också.
Ok, då sätter vi igång. Först ska vi skapa codebehind sidan som hämtar lite kunddata från Northwind Customers table med en DataReader.
Repeater.aspx.cs (codebehind)
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.Common; // Detta namespace måste du använda för att komma åt "DbDataRecord"
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace DataReader
{
public class Repeater : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Repeater Repeater1;
protected System.Web.UI.WebControls.ListBox ListBox1;
private void Page_Load(object sender, System.EventArgs e)
{
if(!Page.IsPostBack){BindToRepeater();}
}
private void BindToRepeater(){
SqlConnection con= new SqlConnection("server=(local);database=Northwind;uid=sa;pwd=sa;");
SqlCommand cmd = new SqlCommand();
cmd.CommandText = "SELECT CustomerID,CompanyName,ContactName FROM Customers";
cmd.Connection = con;
conn.Open();
SqlDataReader dr = cmd.ExecuteReader(CommandBehavior.CloseConnection);
Repeater1.DataSource = dr;
Repeater1.DataBind();
dr.Close();
}
}
}
Ok nu skapar vi .aspx sidan.
I exempel:1 så knyter jag datan med DataBinder.Eval och i exempel:2 så knyter vi med DbDataRecord ...eftersom vi använder en DataReader i codebehind. Hade vi använt oss av ett DataSet i codebehind så skulle vi istället använda DataRowView för att ta fram datan.
EXEMPEL 1
DataBinder.Eval ..så här brukar det se ut i de flesta exempel på både nätet och i böcker.
Repeater.aspx
<%@ Page language="c#" Codebehind="Repeater.aspx.cs" AutoEventWireup="false" Inherits="DataReader.Repeater" %>
Repeater
EXEMPEL 2
Använd istället "DbDataRecord" när du använder en DataReader.Repeater.aspx
<%@ Page language="c#" Codebehind="Repeater.aspx.cs" AutoEventWireup="false" Inherits="DataReader.Repeater" %>
Repeater
Det ända du behöver göra för att komma åt DataReaderns explicit DbDataRecord är att importera namespacet till din codebehind class.
USING SYSTEM.DATA.COMMON;
Stanley Broo - GBO Media
Kristoffer Johansson
Jag arbetar själv med händelsen ItemDataBound för att minska mängden programkod i aspx-sidan. Istället har jag bl.a labels och HyperLinks som populeras när posten databinds. Hur påverkar det prestandan? Blir sidan tyngre eller lättare månne?