GladhMedlem sedan maj 20012 812 inlägg
thevice skrev:
Hur gör man om man kör med SP och parameters på din kod?
Då skapar du SqlCommand objektet först och fyller det med data så här:
IDbCommand command = new SqlCommand();
command.CommandType = CommandType.StoreProcedure
command.CommandText = "MY_SP";
command.Parameters.Add(new Parameters(........));
DataTable datatable = new DataAccess().ExecuteDataTableResult("MY_CONNECTION_STRING", command);
Repeater1.DataSource = dataTable;
Repeater1.DataBind();
thevice skrev:
update, insert och delete också va? Eller har jag missat något?
Nope, du skriver din SQL kod precis som första exemplet men använder dig av metoden ExecuteNoResult istället eftersom du inte förväntar dig något svar tillbaka, det ökar prestandan lite lite lite....
thevice skrev:
Går det att lösa på något sätt i VS så man bara behöver uppdatera? Igen så kommer min lathet fram.
Det skall finnas något Edit-Continue funktion som man skall kunna slå på och då skall man kunna ändra sin kod undertiden som man debuggar (gäller bara mindre ändringar).
thevice skrev:
Ja jag missade något, ExecuteScalar. Hur gör man för att använda det?
Vad ska man med results till?
Om du bara förväntar dig ett resultat tillbaka, typ ett Id eller kanske ett antal. Ta följande SQLstas. SELECT Count(1) as Antal FROM [Table] här kan man använda ExecuteScalar istället för ExecuteDataTableResult eftersom du så fall spara lite lite lite prestanda...
- M
theviceMedlem sedan dec. 2005198 inlägg Det funkar perfekt!
Men jag tänkte på en sak, om jag vill göra flera saker i t.ex page load:
DataTable datatable = new DataAccess().ExecuteDataTableResult("MY_CONNECTION_STRING", new SqlCommand("SELECT * FROM Table");
Repeater1.DataSource = dataTable;
Repeater1.DataBind();
DataTable datatable = new DataAccess().ExecuteDataTableResult("MY_CONNECTION_STRING", new SqlCommand("SELECT * FROM Table");
Repeater2.DataSource = dataTable;
Repeater2.DataBind();
Då öppnar jag ju min databas koppling två gånger. Drar inte det ner på prestandan?
En annan sak. Hur kollar jag om det finns finns några reultat från min SQL fråga eller inte?
det går ju inte att köra results.HasRows antar jag?
Som t.ex Hur gör jag om denna kod?
using (MySqlCommand objCommand = new MySqlCommand("", objConnection))
{
objCommand.CommandText = "sp_GetMember";
objCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.Add(new MySqlParameter("in_UserID", Convert.ToInt32(Request.QueryString["intID"])));
using (MySqlDataReader objDataReader = objCommand.ExecuteReader())
{
if (!objDataReader.HasRows)
{
lblError.Visible = true;
pnlNoError.Visible = false;
}
else
{
objDataReader.Read();
hlProfile.NavigateUrl = "Profile.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
hlGuestbook.NavigateUrl = "Guestbook.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
hlBlog.NavigateUrl = "Blog.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
hlFriends.NavigateUrl = "Friends.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
hlImageArcive.NavigateUrl = "ImageArcive.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
}
}
}
emissionMedlem sedan dec. 19996 721 inlägg Kolla dataTable.Rows.Count
butikoMedlem sedan jan. 2007152 inlägg
Då öppnar jag ju min databas koppling två gånger. Drar inte det ner på prestandan?
Nej, det är nog marginellt i så fall. Det är därför man har en connection-pool... du stänger egentligen aldrig ned din koppling utan lägger tillbaka den i poolen färdig att användas för andra anrop.
Skulle inte du göra en gästbok förresten? Tänkte på din prestanda-iver bara... ;) Självklart ska man alltid ha prestanda i bakhuvudet när du utvecklar men till slut kan det bli på bekostnad av annat. Skriv kod som du känner dig bekväm med, som är lätt att använda och inte minst som du förstår är mitt tips...
Tycker mig se att svenskar utmärker sig lite på så sätt att varje liten applikation byggs upp med flerskiktslösningar som skulle passa ett nytt operativsystem. Nu får jag kanske på nöten i det här forumet men programmerarens roll är klart överskattad samtidigt som designerns arbete är grymt underskattat... min högst personliga åsikt! ;)
freguzMedlem sedan feb. 2005280 inlägg En liten annan infallsvinkel på prestandajakten (eller jag kanske borde göra en ny tråd...):
Jag brukar sätta lite olika Trace.Write här o var i koden och titta på tracen sen hur mycket tid som det går mellan de olika trace-punkterna för att försöka lokalisera långsamma kodpartier.... är detta en metod som är vettig över huvud taget?
butikoMedlem sedan jan. 2007152 inlägg Jupp, eller sätt trace="true" i page-direktivet (eller web.config) så ser du bland annat renderingstiden för de olika delarna (och en massa annat nyttigt också för den delen). :)
freguzMedlem sedan feb. 2005280 inlägg Japp, det är ju det jag gör, men det händer ju mycket i Begin_Load End_Load så den hackar jag upp i mindre bitar alltså. Men va bra då kan man lite på de tiderna som står där :bire
butikoMedlem sedan jan. 2007152 inlägg Aha, nu förstår jag hur trace.write fungerar, kände inte till det... vad snajdigt! :)
http://msdn2.microsoft.com/en-us/library/system.diagnostics.trace.write(VS.71).aspx
emissionMedlem sedan dec. 19996 721 inlägg
butiko skrev:
Tycker mig se att svenskar utmärker sig lite på så sätt att varje liten applikation byggs upp med flerskiktslösningar som skulle passa ett nytt operativsystem. Nu får jag kanske på nöten i det här forumet men programmerarens roll är klart överskattad samtidigt som designerns arbete är grymt underskattat... min högst personliga åsikt! ;)
Jag förstår vad du menar och håller till viss del med, men en väl utformad flerskiktslösning kräver mindre underhåll än en "blajkodad". Det handlar om att säkerställa kvalitet och underlätta för utveklaren. Om man sedan behöver optimera prestanda på något sätt så har man antagligen en tydligare angreppspunkt om applikationen är väl skiktad.
theviceMedlem sedan dec. 2005198 inlägg Jag har enbart tagit en gästbok som exempel. Men risk för att få en stämpel som de flesta får när de säger att de ska göra ett community men det är sånt man får ta. Jag ska göra ett community. ;)
Jag gör inget community för jag vill slå lunarstorm utan för att jag tycker att det är ett utmärkt sätt att lära sig. Man får med alla de flesta sakerna som man behöver för att göra en sidan. Databas lösningar, handskas med upp laddade bilder m.m
Att jag fokuserar mig så mycket på prestandan är det att jag vill lära mig på det bästa sättet från början. Jag är sådan (vet inte om ni andra är det) som kan skriva en kod som jag är nöjd med. Sedan sova på saken och ändra koden och otimera den. Jag kan sitta med samma sida t.ex en gästbok i flera månader tills jag känner att jag har gjort allt jag kan. Är lite av en perfektionist.
Jag kan hålla med dig om att designers arbete är klart underskattat. Men jag är lika dan där. Jag har varit klar med min design som jag har på sidan i kanske över ett år. Men jag ändrar den fortfarande dagligen tills jag känner mig helt perfekt. Det är de som jag tycker är så roligt med att programmera och designa. Att sitta och programmera/designa om och om igen. Man lär sig alltid något nytt. Sen så är mitt sätt kanske inte det bästa när det gäller att få jobb då man har tids press på sig. Men det är smällar man får ta och då tycker jag inte det är lika kul längre.
Oj vad jag skrev nu, blev nog ganska luddigt. ;)
Emission: Tackar för det, visste inte att det skulle vara så enkelt att det bara var att använda dataTable.Rows.Count.
butikoMedlem sedan jan. 2007152 inlägg
emission skrev:
Jag förstår vad du menar och håller till viss del med, men en väl utformad flerskiktslösning kräver mindre underhåll än en "blajkodad". Det handlar om att säkerställa kvalitet och underlätta för utveklaren. Om man sedan behöver optimera prestanda på något sätt så har man antagligen en tydligare angreppspunkt om applikationen är väl skiktad.
Jo, självklart, jag menar naturligtvis inte att man ska "blajkoda". Men ta MS som exempel, deras dominans beror inte på att de levererat värdens bästa operativsystem utan för att de har världens bästa GUI. Tror jag i alla fall. Och jag är inte alls partisk eftersom jag är en mycket bättre designer än jag är programmerare... ;)
thevice: Jag är precis likadan, pillar och pillar så att det blir perfekt (i mina ögon). Visst är det kul! Så länge det inte är någon som betalar så kan man ju unna sig det nöjet... och visst lär man sig massor! :)
Får man se på din community?
theviceMedlem sedan dec. 2005198 inlägg Hehe ja, det är väll som när man var liten och målade flygplan eller vad man nu gjorde. man målade och målade tills man blev nöjd. Fast jag blev aldrig nöjd iof, får hoppas jag blir det i det här projektet. ;)
Visst, men som jag har skrivit tidigare så funkar inte hästboken och vänner funktionen. Enbart för att mitt webbhotell har gjort bort sig på något sätt så SqlDataSource inte fungerar. Ska försöka fix det när jag har tid. Det är nämligen gästboken som jag är mest nöjd med. ;P Eller du kanske bara ville kolla designen eftersom du är designer?
http://tmpurl.booring.se
Du kan logga in med Padchi/timmie
theviceMedlem sedan dec. 2005198 inlägg Nej jag behöver eran hjälp. Hur gör jag om jag bara vill köra .read() som man kan göra med DataReader? Har suttit och försökt nu ett ganska bra tag. dataTable.CreateDataReader fungear inte.
GladhMedlem sedan maj 20012 812 inlägg
thevice skrev:
Nej jag behöver eran hjälp. Hur gör jag om jag bara vill köra .read() som man kan göra med DataReader? Har suttit och försökt nu ett ganska bra tag. dataTable.CreateDataReader fungear inte.
Du gör ingen .Read() på en dataTable. Antingen så binder du datatablen direkt till kontrollens datasource, eller så gör du en for-loop på dataTable.Rows om du vill loopa igenom alla rader i datatablen.
- M
theviceMedlem sedan dec. 2005198 inlägg Jag måste ha förstått fel men om jag göra en for-loop med dataTable.Rows så kan jag väll ändå inte bara hämta ett en/två saker ur databasen?
Det är denna kod som jag vill göra om:
using (MySqlCommand objCommand = new MySqlCommand("", objConnection))
{
objCommand.CommandText = "sp_GetMember";
bjCommand.CommandType = CommandType.StoredProcedure;
objCommand.Parameters.Add(new MySqlParameter("in_UserID", Convert.ToInt32(Request.QueryString["intID"])));
using (MySqlDataReader objDataReader = objCommand.ExecuteReader())
{
if (!objDataReader.HasRows)
{
blError.Visible = true;
pnlNoError.Visible = false;
}
else
{
objDataReader.Read();
hlProfile.NavigateUrl = "Profile.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
hlGuestbook.NavigateUrl = "Guestbook.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
hlBlog.NavigateUrl = "Blog.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
hlFriends.NavigateUrl = "Friends.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
hlImageArcive.NavigateUrl = "ImageArcive.aspx?intID=" + Convert.ToInt32(objDataReader["intID"]);
}
}
}
Eller det kanske finns ett bättre sätt att göra denna kod på? Kanske den drar lite på prestandan?
Frågan är kanske vad du vill göra med din datatable?
Oftast binder man ju den direkt till kontrollen, och om du vill småändra sedan så går du in i kontrollens event och gör det.
Alt. så justerar du din SP helt enkelt så att den returnerar det du vill ha!
Annars loopar du typ så här: (men det kanske du hade koll på)
foreach (DataRow row in DataTable.Rows)
Response.Write(row["Kolumnen"].ToString());
butikoMedlem sedan jan. 2007152 inlägg Näe, ska du hämta värdet från en specifik rad i en viss kolumn i din datatable så kan du hämta den mha kolumn-namn och rad-nummer:
datatable.Rows[x]["MinKolumn"].ToString();
GladhMedlem sedan maj 20012 812 inlägg
thevice skrev:
Jag måste ha förstått fel men om jag göra en for-loop med dataTable.Rows så kan jag väll ändå inte bara hämta ett en/två saker ur databasen?
Det är denna kod som jag vill göra om:
Nja... i ditt exempel så skall din datatable endast innehålla ett värde (intID) och då bör du istället använda dig av ExecuteScalar och få tillbaka värdet som ett object som du sedan gör om till en sträng.
IDbCommand command = new SqlCommand();
command.CommandType = CommandType.StoreProcedure
command.CommandText = "sp_GetMember";
Command.Parameters.Add(new SqlParameter("in_UserID", Convert.ToInt32(Request.QueryString["intID"])));
object intID= new DataAccess().ExecuteScalar("MY_CONNECTION_STRING", command);
if(intID == null) {
blError.Visible = true;
pnlNoError.Visible = false;
} else {
hlProfile.NavigateUrl = "Profile.aspx?intID=" + intID.ToString();
hlGuestbook.NavigateUrl = "Guestbook.aspx?intID=" + intID.ToString();
hlBlog.NavigateUrl = "Blog.aspx?intID=" + intID.ToString();
hlFriends.NavigateUrl = "Friends.aspx?intID=" + intID.ToString();
hlImageArcive.NavigateUrl = "ImageArcive.aspx?intID=" + intID.ToString();
}
Även om jag tycker det är överkill att kolla idatabasen varje gång om användare finns eller ej bara för att skriva ut länkar, då är det bättre att spara undan UserID i en cookies eller session när personen loggar in på sidan och sedan hämta värdet därifrån istället för belasta databasen varje gång man vill skriva ut UserID.
En sak skall du dock tänka på när du lagrar informationen i cookies, det är att den är krypterad. För om det i cookiesen står (jag kan ju läsa den) userID=1045 jag kommer jag snabbt räkna ut att om jag ändrar detta värde till något annat säg 1041 så kommer jag vara inloggad på sidan som någon annan än mig själv och så lätt skall jag inte få det om jag vill hacka din sida... Med tanke på att Admin oftas är 1. Så blir det riktigt enkelt att komma in och förstöra...
- M
theviceMedlem sedan dec. 2005198 inlägg Det du säger är helt rätt. Jag använder min databas för det här enbart för att jag vill kolla om användaren finns. Annars så skulle det ju vara jätte enkelt att bara att skicka med idt i länken tillhjälp av en querestring.
Tack för det Gladh.