Vilken av dessa två koder är den bästa. Jag undrar eftersom de gör i princip samma sak, hämtar ut data ur en databas. Kod 2 är bäst eftersom den har felhantering. Kalle, Varför skicka in en connectionsträng varje gång du ställer en fråga? Det borde rimligen räcka med en sql-sats. En SqlHelper ska vara isolerad. Den ska inte veta nånting om själva applikationen. På så sätt kan du enkelt återanvända den i andra projekt. Visst, man kan låta SqlHelpern anropa t.ex. AppSettings men då måste den förlita sig på att det värdet finns och att det finns med rätt namn. Pelle, När jag gjorde saker i ASP så hade jag alltid en .asp-fil som hette functions.asp där jag hade en del funktioner.... t.ex så hade jag en funktion som öppnade databasen och en som stängde den. Kalle, använde du aldrig Klasser i ASP? "När jag gjorde saker i ASP..." Om du ändå vill streta vidare med asp tänket men med en liten förbättring är det Class Libraries du är ute efter. Hobil? Hobil, så du menar att om man ska pyssla med asp.net så ska man fortsätta med asp-kod trots att det finns nya lösningar i asp.net? Tvungen att skriva en sak till.Vilken kod är bäst?
Kod 1:
private void Page_Load()
{
OleDbConnection dbConn = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;data source=" + Server.MapPath("db.mdb"));
dbConn.Open();
string strSQL = "SELECT * FROM tmp_table ORDER BY id DESC";
OleDbCommand dbComm = new OleDbCommand(strSQL, dbConn);
OleDbDataReader dbRead;
dbRead = dbComm.ExecuteReader();
tmp_table.DataSource = dbRead;
tmp_table.DataBind();
dbRead.Close();
dbConn.Close();
}
Kod 2:
void Page_Load(System.Object sender, System.EventArgs e)
{
OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath("db.mdb"));
string strSQL = "SELECT * FROM tmp_table ORDER BY id DESC";
OleDbCommand myCommand = new OleDbCommand(strSQL, myConnection);
OleDbDataReader myReader;
try
{
myConnection.Open();
myReader = myCommand.ExecuteReader();
ImageDataGrid.DataSource = myReader;
//Bind data to DataGrid
ImageDataGrid.DataBind();
myConnection.Close();
myReader.Close();
}
catch (Exception ex)
{
Response.Write(ex.Message);
}
}
//Kalle
Sv: Vilken kod är bäst?
Kod 1 kommer att krascha programmet om databasen inte finns eller inte kan nås.
Det är inte speciellt snyggt.
OlaSv: Vilken kod är bäst?
Om du vill avancera och få en trevligare kod. slippa skriva samma saker flera ggr samt öka kvalitén kan du ta en titt på MS Access Block... Bra hjälpklasser för att minimera antal rader kod och minska redundansen.
Andra tips om du vill bli en duktigare utvecklare och öka kvalitén samt strukturen ännu mera så kan du kolla lite på OO (objekt orientering.) samt refactoring och Design pattern.
Tänk följande.
Du har lagt in kod nr 2 på alla ställen du går mot en databas. låt säga 200 ställen. Helt plötsligt inser du att det är ett fel i din exceptionhantering i dessa kodstycken. oj helt plötsligt måste du ändra på 200 ställen. Om du hade kapslat in allt detta i hjälpklasser så hade du bara behövt ändra på ett ställe och det slår genom på alla 200 ställen. (tjusningen med objektorientering).
Kan ju öka på lite här när jag ändå håller på. :-)
Refactoring tips.
Det finns olika former av refactoring, extract method skrev jag i en krönika en gång... (orkar inte leta upp länk nu, men den finns här på pelles sida skriven av mig.) Extract to class eller nått i den stilen finns oxå, det är när man flyttar ett stycke kod till en ny klass för att samla allt på en plats eller till en mer logiskt plats. Ta din kod som ett exempel.
<code>
OleDbConnection myConnection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath("db.mdb"));
string strSQL = "SELECT * FROM tmp_table ORDER BY id DESC";
OleDbCommand myCommand = new OleDbCommand(strSQL, myConnection);
OleDbDataReader myReader;
try
{...}
{
myConnection.Open();
myReader = myCommand.ExecuteReader();
ImageDataGrid.DataSource = myReader;
//Bind data to DataGrid
ImageDataGrid.DataBind();
myConnection.Close();
myReader.Close();
}
catch (Exception ex)
{...}
{
Response.Write(ex.Message);
}
}
</code>
Det unika här är egentligen bara din strSQL och Connection strängen. Samt ImageDataGrid...
Om du skapar en klass, ex SqlHelper och en metod ExcuteReader så behöver denna bara ta emot två saker. Sql frågan samt din connectionsträng. (om du inte väljer att nyttja appsetting. Leta upp detta i msdl library om du är osäker på hur den fungerar.) Alltså.
public class SqlHelper
{
public static SqlDataReader ExecuteReader(string sql,string connstring)
{
här lägger du allt kod som skapar din reader....
}
}
För att få ut en SqlDataReader gör du.
<code>
string connstring = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + Server.MapPath("db.mdb";"
SqlDataReader myReader = SqlHelper.ExecuteReader(""SELECT * FROM tmp_table ORDER BY id DESC",connstring);
ImageDataGrid.Datasource = myReader;
ImageDataGrid.DataBind();
</code>
Koden i din ExecuteReader kan se ut så här.
<code>
public static SqlDataReader ExecuteReader(string sql,string connstring)
{
OleDbConnection myConnection = new OleDbConnection(connstring);
OleDbCommand myCommand = new OleDbCommand(sql, myConnection);
OleDbDataReader myReader;
try
{
myConnection.Open();
myReader = myCommand.ExecuteReader();
}
catch (Exception ex)
{
throw (ex);
}
return myReader;
}
</code>
För att göra det bättre så connection stängs kan du sätte till CommandBehavior.CloseConnection
i din ExecuteReader....
Alltså:
<code>
try
{
myConnection.Open();
myReader = myCommand.ExecuteReader(CommandBehavior.CloseConnection);
}
</code>
Detta betyder att din Connection kommer att stängas när din reader stängs... Denna stänger du efter databindningen.
<code>
...
ImageDataGrid.DataBind();
myReader.Close();
OBS! Jag garanterar inte att koden kommer fungera om du kopierar den rakt av härifrån nu... Då jag bara ville ge lite tips hur du kan effektivisera det hela...
Så varje gång du vill ha ut en reader använder du bara din SQLHelper.ExecuteReader(<din sql fråga>,<din connstring>); Så får du allt på en rad istället för att hela tiden koda din connection, command, etc...
mvh JohanSv: Vilken kod är bäst?
Sv: Vilken kod är bäst?
Därför skickar man istället med en connectionsträng varje gång man anropar SqlHelpern.
Som Johan säger så finns ju Microsoft Data Access Block så man behöver inte skriva en egen SqlHelper. Jag använder den och det blir väldigt smidigt. I och för sig så håller jag på att byta ut den mot en O/R Mapper i mina projekt istället. Men det är ju en annan diskussion. ;)Sv: Vilken kod är bäst?
"Varför skicka in en connectionsträng varje gång du ställer en fråga? Det borde rimligen räcka med en sql-sats."
I hans kod nyttjade han han mer anrop för att bygga sin conn string, han kan inte göra detta via AppSettings... Just därför angav jag att han kunde skicka in den...
Mvh JohanSv: Vilken kod är bäst?
Istället för att ha en db-koppling på varje sida så inkluderade jag functions.asp och anropade funktionen dbOpen(Connect) och dbClose(Connect)... Jag borde ju kunna göra samma sak med hjälp av Codebehind i ASP.net det sparar ju en hel del tid och är väldigt smidigt.
Hur skulle ett sådant exempel se ut om man i en codebehind skapade en publik funktion/sub som öppnar databasen och sedan använder functions.cs på alla sidor som man använder databasen i.
Hur kan man annars gå till väga?`Sv: Vilken kod är bäst?
I .net så använder man oftast databas klasser, typ som du gjorde med ASP.
Det finns s.k. n-tier/flerlagerslösning (vet inte exakt vad man kallar den) som man oftast har DAL, BL, PL och många har även mera saker än bara DAL, BL och PL. Dock så är inte jag expert på just det här.
Hoppas någon som kan det här bra kan ge dig något exempel.
Men jag kan ge dig ett tips, sök på n-tier på google.
<info>/m</info>Sv: Vilken kod är bäst?
Det här ska du ALDRIG tänka om du ska börja med ASP.NET. Allt görs annorlunda i .NET och du måste börja om från början och lära dig hur man gör sakerna i ASP.NET istället för att tänka på hur du gjorde i ASP.
ASP.NET är objekt-orienterat och istället för de gamla include filerna så skapar man klasser som innehåller funktioner. I code-behind anropar man sedan klassen för att köra funktionerna.
Den SqlHelper Johan pratar om ovan är ett exempel på en klass. Den innehåller alla funktioner man behöver för databasanrop.
För att återigen repetera mig angående att börja med .NET. Man MÅSTE börja om från början. Att gå från ASP till ASP.NET är att börja med något helt nytt och då måste man lära sig det nya.
Tänk efter själv. Om man kan prata engelska flytande, betyder det att man kan prata franska?
http://pdc.se/blog/DisplayEntry.aspx?eid=58Sv: Vilken kod är bäst?
Genom att skapa en sån, kan du skapa objekt och köra metoder direkt från libraryt som i princip skulle funka som din globala functions.asp. Inte att rekommendera som sagt, men det fungerar alldeles utmärkt.
Asp.NET är snoffsigt, så vill du inte vara rebell ska du rätta in dig i Redmond-ledet och göra det som de vill, annars supportar de dig inte om det skulle gå åt fanders, det är åtminstone vad de brukar hota med när undersåt... eh ursäkta, jag menar givetvis KUNDER, inte gör som de vill.
;o)Sv: Vilken kod är bäst?
Du menar om man använder en teknik på felsätt så är man rebell och om man använder den korrekt så är man någon form a lakej som bara följer mainstream?Sv: Vilken kod är bäst?
Då är man inte rebell, man är dum och bör inte börja med asp.net överhuvudtaget.
ASP.NET är inte snoffsigt och komplicerat om man LÄR SIG.
Om du inte vill "rätta in dig i Redmond-ledet" så får du väl pyssla med PHP, Python eller nåt sånt istället.
Antingen fortsätter man med asp-tänket genom att fortsätta använda ASP. Om man vill börja med ASP.NET så är det något helt nytt och då gäller det att använda ASP.NET-tänket.
Att bygga "Class Libraries" i ASP innebär COM-komponenter som du sedan inte kan använda om du vill lägga sajten på ett webbhotell.
I ASP.NET bygger du alltid Class Libraries och dom flyttar du precis vart du vill utan att behöva registrera på någon server.
Så jag tycker att du ska lära dig vad du pratar om innan du ger folk dåliga råd.Sv: Vilken kod är bäst?
Habil, det är rätt komiskt att du pratar om att "rätta sig i Redmond-leden" om man använder ASP.NET.
Du rättar dig också in i leden genom att du använder ASP. Så jag förstår inte riktigt vad du pratar om.