Avatar billede stephanryer Nybegynder
02. oktober 2006 - 11:53 Der er 6 kommentarer og
1 løsning

Udfører update og insert med update sker ikke

Jeg ved ikke om dette er en .NET fejl eller en MySQL fejl, men fejlen lyder som følger:

1. Jeg kalder min aspx-fil fra min applet, denne kaldes med bl.a. en lang GET-variabel på 600 tegn indeholdende noget level-data (til et spil).

2. I ASPX-filen gør jeg følgende
a. Laver update i databasen hvor jeg indsætter det nye level-data med det på gældende tidspunkt.
b. Jeg aflæser "row affected" på cmd.ExecuteNonReader()
c. Jeg laver en insert i min log med levelid-opdateret, antal rows affected og samme tidspunkt.

3. Jeg aflæser værdierne i min database og her kommer det underlige:
- Nogle gange står der i log'en at der klokken x blev opdateret en level med id x og antals rows affected ved denne opdatering er 1. Men dette stemmer ikke overens med klokkeslettet i den tabel jeg opdaterede! Og leveldata er da heller ikke blevet opdateret i denne level-tabel.

Jeg aner ikke hvad denne fejl kan skyldes. Kan det være fordi jeg sender en værdi på 600 tegn til databasen? Men hvordan kan den så stadig sige 1 row affected?

Code:

protected void Page_Load(object sender, EventArgs e)
{
if (Request["levelid"] != null && Request.QueryString["leveldata"] != null)
  {
  int levelID = Convert.ToInt32(Request.QueryString["levelid"]);
  String leveldata = Request.QueryString["leveldata"];
  DateTime now = DateTime.Now;
  String query = "UPDATE ryerplexlevel SET leveldata = '"+leveldata+"', datesaved = '" + now.Year + "-" + now.Month + "-" + now.Day + " " + now.Hour + ":" + now.Minute + ":" + now.Second + "' WHERE ryerplexlevelid = " + levelID + " AND accepted = 0";
  OdbcConnection con = new OdbcConnection(Constants.CONNECTION_STRING);
  OdbcCommand cmd = new OdbcCommand(query, con);
  con.Open();
  int affected = cmd.ExecuteNonQuery();
  con.Close();
  Log.WriteToLog("Saved changes to a map with levelid: " + levelID+". Rows affected: "+affected);
}
}
På forhånd tak
Avatar billede martor Nybegynder
06. oktober 2006 - 18:27 #1
Så vidt jeg ved kan man højest sende 255 tegn i QueryString (GET). Kan det være en forklaring?

Derudover vil jeg anbefale dig at bruge MySql .NET connector fremfor odbc...
Avatar billede stephanryer Nybegynder
06. oktober 2006 - 19:42 #2
Jeg har hørt man kan sende op til 4000 tegn med en GET-var? Og det virker da også 90% af gangene.

Hvad er fordelen ved den connector du nævner fremfor odbc?
Avatar billede martor Nybegynder
06. oktober 2006 - 20:21 #3
Tror du har ret i det med QS, det var vidst i gamle dage at der var begrænsninger på.

Du kan læse om connectoren på http://www.mysql.com/products/connector/net/
I grove træk er fordelen ved den, at det er en ADO.Net connector som alt andet lige bør være hurtigere end en odbc + den er integreret i .NET (gennem ADO).

Vær i øvrigt opmærksom på at din query kan udsættes for sql-injection, da du tager din leveldata ubehandlet fra QS. Alt efter hvilken version af MySql du bruger vil du med fordel kunne benytte enten en Stored Procedure eller i det mindste benytte parametiserede kald.
Samtidig vil du nok kunne lave din dateSaved value nemmere, f.eks. ved now.toString(<ønsket format>);

Mht. din fejl, hvilken type felt er leveldata? Og hvor stor har du gjort den?
Derudover kan du prøve at smide en try-catch udenom dit execute-kald og se om der kommer en Exception.
Og du har tjekket at "affected" ikke er -1, ik?
Avatar billede stephanryer Nybegynder
06. oktober 2006 - 21:04 #4
min affected er altid 1 jo.

jeg kender godt til sikre parametre. har bare dovnet den her.

leveldata er en 600 tegns lang streng.
Avatar billede martor Nybegynder
06. oktober 2006 - 21:49 #5
Kan der snige sig et ' ind i leveldata strengen? Det vil jo lave rod i den...
Avatar billede stephanryer Nybegynder
07. oktober 2006 - 19:58 #6
Nej det kan der ikke. Strengen indeholder blot en lang række tal således:

"3524352435222255342"
Avatar billede stephanryer Nybegynder
17. januar 2007 - 11:16 #7
Hmmm, lukker.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester