webForumDet fria alternativet

Ett steg efter med uppdateringar!

.NET

4 svar · 341 visningar · startad av Mc Fetto

Medlem sedan nov. 20022 355 inlägg
Frågan#1

Jag har ett problem som jag försökt lösa ett bra tag nu. När jag laddar en sida så stämmer all data (hämtar data från tabeller).

Men när jag gör en insert så läggs data till i databasen direkt, men uppdateringen i tabellen på sidan görs inte förrän efter två klick!

Koden där jag insertar i databasen!

 
			if (Session["check"] != null)
			{
				OdbcConnection MyConnection = new OdbcConnection(MyConString);
				MyConnection.Open();
				string query = "SELECT COUNT(*) FROM comments";
				OdbcCommand cmd = new OdbcCommand(query, MyConnection);
				OdbcDataReader reader = cmd.ExecuteReader();
				reader.Read();
				int values = reader.GetInt32(0);
			
				MyConnection.Close();
			
				values++;

				MyConnection.Open();
				string fileStr = Session["userName"].ToString() + Session["ArtistName"].ToString() + "movie_with_comment.smil";

				cmd.Connection = MyConnection;
				cmd.CommandType = CommandType.Text;
				cmd.CommandText = "INSERT INTO comments(Id, u_Id, m_Id, Link) VALUES ('"+values+"', '"+ Session["userId"]  +"', '"+ Session["movieId"] +"','"+ fileStr +"')";
			
				cmd.ExecuteScalar();
				MyConnection.Close();
				Session["check"] = null;
			}

Koden i load (det är de sista raderna som lägger data i datagriden som inte uppdateras förrän efter två klick i ovanstående kod:

  		private void Page_Load(object sender, System.EventArgs e)
		{
			url = Request.QueryString["link"];
			string query = "SELECT Name FROM movie WHERE Link = \"" + url + "\";";
			OdbcConnection MyConnection = new OdbcConnection(MyConString);

			if (!Page.IsPostBack)
			{
				MyConnection.Open();
				OdbcCommand cmd = new OdbcCommand(query, MyConnection);
				OdbcDataReader reader = cmd.ExecuteReader();
				reader.Read();
				Session["ArtistName"] = reader.GetString(0);
				MyConnection.Close();
				Session["check"] = true;
				Session["file"] = Server.MapPath("\\")  + Session["userName"] + Session["ArtistName"] + "movie_with_comment.smil";

				Sort(3);
				Write_SmilFile();
				Write_RTFile();

			}

			file = Session["file"].ToString();
			query = "SELECT movie.Name AS Video, user.Name AS \"User name\" FROM movie, user, comments WHERE user.id = comments.u_Id AND movie.id = comments.m_Id;"; 

			OdbcDataAdapter myCommand = new OdbcDataAdapter(query, MyConnection);
			DataSet ds = new DataSet();
			myCommand.Fill(ds, "Conn");

			DataGrid1.DataSource=ds.Tables["Conn"].DefaultView;
			DataGrid1.DataBind();
		}
Medlem sedan nov. 20022 355 inlägg
#2

Lade kopling till datagriden i knappen också (första kodsnutten) då fungerar det som det ska...
Men ska verkligen inte onload funktionen ta de raderna eller vad är det jag har missat?

			file = Session["file"].ToString();
			query = "SELECT movie.Name AS Video, user.Name AS \"User name\" FROM movie, user, comments WHERE user.id = comments.u_Id AND movie.id = comments.m_Id;"; 

			OdbcDataAdapter myCommand = new OdbcDataAdapter(query, MyConnection);
			DataSet ds = new DataSet();
			myCommand.Fill(ds, "Conn");

			DataGrid1.DataSource=ds.Tables["Conn"].DefaultView;
			DataGrid1.DataBind();
Medlem sedan juni 20011 732 inlägg
#3

Pageloaden körs innan koden kopplad till din knapp exekveras - när du binder datan i din datagrid så har du således ännu inte gjort uppdateringen i databasen. Därför visas den inte MEN den läggs ju ändå till i databasen direkt efter att du bundit datan till din kontroll så skulle du titta i databasen efteråt så ser ju allt rätt ut. När sidan så körs igen så finns då dina data där, därför blir det en eftersläpning...

Ett tips är att överhuvudtaget inte skriva en massa kod i din pageload, ta ned koden till ett minimum och gör funktionsanrop istället! Med mycket kod i pageloaden är det lätt hänt att man binder fel eller i fel ordning och kör kod man inte vill köra... Ett typfel gör du själv i ditt sista exempel som innebär att du först binder en massa data till din kontroll när pageloaden körs och sedan skriver du över alla dina data i samma datagrid IGEN efter uppdateringen under samma postback. Inte särskilt effektivt, väl? :) Alltså, ingen onödig kod i pageloaden för det blir bara krångligt att felsöka, speciellt som man ofta får fel som inte syns, som i ditt exempel.

Medlem sedan nov. 20022 355 inlägg
#4

Tack för ett mycket utförligt svar! :)
Tur att jag tog bort en del kod då innan jag postade ;)
Ska ta och ändra detta..
Hur kan jag komma undan "eftersläpningen" om jag vill göra det effektivare då? (ta bort bindningen i knappen)

Medlem sedan juni 20011 732 inlägg
#5

Eftersläpningen tar du helt enkelt bort genom att exekvera rätt kod i rätt ordning och första steget är att du inte binder någon data till din datagrid i pageloaden vid postbacks. Sedan finns det naturligtvis en mängd olika sätt att skriva snyggare kod... ska du vara riktigt seriös kan du arbeta med olika applikationslager och bygga egna klassbibliotek som exempelvis tar hand om kopplingar till databasen (alltså att du verkligen utnyttjar objektorienterad programmering!) men är man ny på programmering så är det nog inte där man börjar.

279 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
136 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)