Avatar billede axl_rose Nybegynder
16. januar 2006 - 11:52 Der er 41 kommentarer og
1 løsning

Insert into fejl

Her er linjen:

connection.execute("INSERT INTO ordre ([kunde,dato]) VALUES ("+ id + ", " + toSqlDate(new Date()) +")");

Fejlen lyder flg:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.
Avatar billede donslund Nybegynder
16. januar 2006 - 12:00 #1
connection.execute("INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", " + toSqlDate(new Date()) +")");
Er det ikke [ ] der driller?
Avatar billede kabbak Professor
16. januar 2006 - 12:01 #2
connection.execute("INSERT INTO ordre ([kunde,dato]) VALUES ("& id & ", #" & toSqlDate(new Date()) &"#)");
Avatar billede axl_rose Nybegynder
16. januar 2006 - 12:28 #3
Så kommer denne Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record.
Avatar billede axl_rose Nybegynder
16. januar 2006 - 12:37 #4
connection.execute("INSERT INTO ordre ([kunde,dato]) VALUES ("& id & ", #" & toSqlDate(dato()) &"#)");
  res = connection.execute("SELECT id FROM ordre WHERE kunde='& id &' ORDER BY id DESC");
Avatar billede softspot Forsker
16. januar 2006 - 12:37 #5
Hvorfor ikke bare:

connection.execute("INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", #" + toSqlDate(new Date()) +"#)");

under antagelse af at din toSqlDate-funktion leverer en lovlig dato ifht. databasen.
Avatar billede axl_rose Nybegynder
16. januar 2006 - 12:41 #6
Det er her datoen kommer fra:
function toSqlDate(dato) {
  return "'" + date.getDate() + "-" + (date.getMonth() + 1) + "-" + date.getYear() + "'";
}
Avatar billede axl_rose Nybegynder
16. januar 2006 - 12:43 #7
softspot hvis jeg bruger den du viser får jeg; Expected ';'
Avatar billede axl_rose Nybegynder
16. januar 2006 - 12:45 #8
efter rettelse får jeg af vide at datoen er undefine altså new date
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:15 #9
Det er det der med dato der ikke virker som det skal!
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:25 #10
Har ændret lidt i det så linj:en er flg:
connection.execute("INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", #" + showDate(new Date()) +"#)");

og har included dato.js som ser således ud:

<%
function showDate(){
    dt = new Date();    //gets today's date right now (to the millisecond)
    month = dt.getMonth()+1;
    day = dt.getDate();
    year = dt.getFullYear();
   
}

%>
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:26 #11
Fejlen lyder så flg:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.
Avatar billede softspot Forsker
16. januar 2006 - 13:27 #12
Du mangler vel at returnere den dato du får stykket sammen i showDate...?
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:34 #13
Dvs. return skal sættes ind så det bliver:
<%
function showDate(){
    dt = new Date();    //gets today's date right now (to the millisecond)
    month = dt.getMonth()+1;
    day = dt.getDate();
    year = dt.getFullYear();
return dt;
   
}

%>
Avatar billede softspot Forsker
16. januar 2006 - 13:36 #14
Ja, det vil i det mindste returnere den dato du får skabt med new Date(), men de andre ting du gør har ikke nogen effekt, med mindre du har nogle globale variable som hedder, month, day og year...
Avatar billede softspot Forsker
16. januar 2006 - 13:38 #15
Prøv evt. dette i stedet:

<%
function showDate(){
  dt = new Date();    //gets today's date right now (to the millisecond)
  month = dt.getMonth()+1;
  day = dt.getDate();
  year = dt.getFullYear();
  return year + '-' + month + '-' + day;
}

%>
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:38 #16
Var det her bedre?:

<%
function showDate( ){
    dt = new Date();    //gets today's date right now (to the millisecond)
    month = dt.getMonth()+1;
    day = dt.getDate();
    year = dt.getFullYear();
    return "'" + day() + "-" + (month() + 1) + "-" + year() + "'";
}

%>
Avatar billede softspot Forsker
16. januar 2006 - 13:39 #17
...og så kan du jo forkorte din SQL-sætning lidt:

connection.execute("INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", #" + showDate() + "#)");
Avatar billede softspot Forsker
16. januar 2006 - 13:41 #18
Ja, hvis din egen giver lidt problemer (pga. formatet kan tolkes forskelligt alt efter hvilket land du er i og hvilken landekode din side er sat til at benytte), så kan du jo prøve den jeg foreslog i post 16/01-2006 13:38:11...
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:41 #19
Får denne fejl ved det:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.
Avatar billede softspot Forsker
16. januar 2006 - 13:43 #20
Prøv lige at ændre denne linie:

connection.execute("INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", #" + showDate() + "#)");

til flg. linier:

var sql = "INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", #" + showDate() + "#)";
Response.Write(sql);
Response.End();
connection.execute(sql);


og fortæl/vis så hvad der skrives i din browser når du udfører koden...
Avatar billede softspot Forsker
16. januar 2006 - 13:45 #21
Hvis du bruger din egen showDate fra 16/01-2006 13:38:17, så skal du lige undlade at lægge 1 til month 2 gange... det kan resultere i en ugyldig dato (da måned kan blive 13)...
Avatar billede softspot Forsker
16. januar 2006 - 13:46 #22
Faktisk så vil jeg anbefale dig at bruge min version af showDate, da dn egen har flere fejl (med mindre du har funktioner som hedder day, month og year).
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:47 #23
var sql = "INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", #" + showDate() + "#)";
Response.Write(sql);
Response.End();
connection.execute(sql);

  res = connection.execute("SELECT id FROM ordre WHERE kunde="+ id +" ORDER BY id DESC");
  ordrenummer = res.Fields("id");

Skal det se således ud så?
Avatar billede softspot Forsker
16. januar 2006 - 13:49 #24
Ja, indtil videre er det de første 3 linier der er interessante (da siden stopper efter Response.End(). Det er bare for at se hvilken SQL der kommer ud af det...
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:52 #25
Når jeg gør som du har skrevet får jeg flg resultat:
INSERT INTO ordre (kunde,dato) VALUES (, #day() + "-" + month() + "-" + year() +#)
Avatar billede softspot Forsker
16. januar 2006 - 13:55 #26
Det er hvis du bruger din egen version af showDate. Jeg er ret overbevist om at hvis du bruger den version jeg har flikket sammen, så kommer det ikke til at se sådan ud...
Avatar billede axl_rose Nybegynder
16. januar 2006 - 13:58 #27
Resulatet af din:
showdate og det du skrev bliver :
INSERT INTO ordre (kunde,dato) VALUES (, #2006-1-16#)
Avatar billede softspot Forsker
16. januar 2006 - 14:01 #28
Jeps, så begynder det at ligne noget. Det der mangler er en værdi i den variabel der hedder id. Som du kan se er den første værdi tom i VALUES-listen og det må den ikke være. Derfor skal du sikre dig at den variabel der hedder id har en gyldig værdi (dvs. en der stemmer ovenens med den type som feltet kunde har i databasen...
Avatar billede axl_rose Nybegynder
16. januar 2006 - 14:03 #29
// registrer ordren
  Application.Lock();
connection.execute = "INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", #" + showDate() + "#)";
  res = connection.execute("SELECT id FROM ordre WHERE kunde='+ id +' ORDER BY id DESC");
  ordrenummer = res.Fields("id");
  Application.Unlock();

Sådan her, ser det ud samlet.
Avatar billede axl_rose Nybegynder
16. januar 2006 - 14:04 #30
Altså hvis man holder sig til det der var før det,da det så ikke hænger sammen med resten hvis jeg bruger response osv...
Avatar billede softspot Forsker
16. januar 2006 - 14:06 #31
Ja, men du skal lige have sikret dig at id indeholder en gyldig værdi... hvor kommer den værdi fra?
Avatar billede axl_rose Nybegynder
16. januar 2006 - 14:07 #32
fra en access database
Avatar billede softspot Forsker
16. januar 2006 - 14:09 #33
Ok, hvordan kommer den over i variablen, for der er tydeligvis noget galt med det udtræk (måske antager du der returneres en række hvor der ikke gør eller sådan noget). Prøv at vise den kode hvor denne værdi tildeles...
Avatar billede axl_rose Nybegynder
16. januar 2006 - 14:13 #34
Her er hele sidens kode:
<%

  OK = 0;
  FORKERT_KODEORD = 1;
  KUNDE_EKSISTERER = 2;

  con = createDatabaseConnection();

  // kontroller først, om kunden er logget ind
  id = -1;
  if (Request.Cookies("kundeid") != "") {
      id = opdaterKunde(Request.Cookies("kundeid"));
  } else {
      id = tilfojKunde();
  }

  // registrer ordren
  Application.Lock();
connection.execute = "INSERT INTO ordre (kunde,dato) VALUES ("+ id + ", #" + showDate() + "#)";
  res = connection.execute("SELECT id FROM Ordre WHERE kunde='+ id +' ORDER BY id DESC");
  ordrenummer = res.Fields("id");
  Application.Unlock();

  albumantal = Session("albumantal");
  for (i = 0; i < albumantal; i++) {
    sql = "INSERT INTO ordrelinie (album, antal, ordre) VALUES (";
    sql += Session("album"+i);
    sql += ", ";
    sql += Session("antal"+i);
    sql += ", ";
    sql += ordrenummer;
    sql += ")";
      connection.execute(sql);
  }
  printResult(OK);

  function opdaterKunde(id) {
    sql = "UPDATE kunde SET ";
    sql += "Navn='" + Request.Form("Navn") + "', "
    sql += "Adresse='" + Request.Form("Adresse") + "', ";
    sql += "Postnummer=" + Request.Form("Postnummer") + " , ";
    sql += "Postdistrikt='" + Request.Form("By") + "', ";
    sql += "Email='" + Request.Form("Email") + "'";
    sql += " WHERE id=" + id;
    connection.execute(sql);
      return id;
  }

  function tilfojKunde(id) {
    // kontroller, at de to kodeord er ens
    if (!strcmp(Request.Form("kodeord1"),Request.Form("kodeord2"))) {
        printResult(FORKERT_KODEORD);
    }

    // kontroller, at der ikke allerede eksisterer en kunde med den email-adresse
    res = connection.execute("SELECT id FROM kunde WHERE email='" + Request.Form("Email") + "'");
    if (!res.EOF) { // kunden eksisterer
        printResult(KUNDE_EKSISTERER);
    }

      sql = "INSERT INTO kunde (Navn, Adresse, Postnummer, By, Email, Kodeord) VALUES (";
      sql += "'" + Request.Form("Navn") + "', ";
      sql += "'" + Request.Form("Adresse") + ", ";
      sql += Request.Form("Postnummer") + ", ";
      sql += "'" + Request.Form("By") + "', ";
      sql += "'" + Request.Form("Email") + "', ";
      sql += "'" + Request.Form("Kodeord") + "')";

 
      res = connection.execute("SELECT id FROM kunde WHERE Email='" + Request.Form("Email") + "'");
      return res.Fields("id");
  }

  function printResult(status) {
%>


i toppen er database, dato inkluderet...
Avatar billede softspot Forsker
16. januar 2006 - 14:23 #35
Der er et par fejl i rutinen tilfojKunde. Dels bliver den INSERT du har lavet ikke udført, dels mangler der en apostrof efter adressefeltet. Prøv evt. denne version i stedet:

  function tilfojKunde(id) {
    // kontroller, at de to kodeord er ens
    if (!strcmp(Request.Form("kodeord1"),Request.Form("kodeord2"))) {
        printResult(FORKERT_KODEORD);
    }

    // kontroller, at der ikke allerede eksisterer en kunde med den email-adresse
    res = connection.execute("SELECT id FROM kunde WHERE email='" + Request.Form("Email") + "'");
    if (!res.EOF) { // kunden eksisterer
        printResult(KUNDE_EKSISTERER);
    }

      sql = "INSERT INTO kunde (Navn, Adresse, Postnummer, By, Email, Kodeord) VALUES (";
      sql += "'" + Request.Form("Navn") + "', ";
      sql += "'" + Request.Form("Adresse") + "', ";
      sql += Request.Form("Postnummer") + ", ";
      sql += "'" + Request.Form("By") + "', ";
      sql += "'" + Request.Form("Email") + "', ";
      sql += "'" + Request.Form("Kodeord") + "')";

      connection.execute(sql);

      res = connection.execute("SELECT @@IDENTITY AS id");
      return res.Fields("id");
  }

Desuden vil jeg til hver en tid anbefale at du benytter SELECT @@IDENTITY til at finde den række du lige har oprettet, da den er mere sikker (og generisk) end alle mulige andre metoder der selecter på de data man lige har indsat.
Avatar billede softspot Forsker
16. januar 2006 - 14:34 #36
...og man skal naturligvis sørge for at lukke sine recordset når man er færdig med at bruge dem, så databasen kan få frigjort sine resurser igen. :)
Avatar billede axl_rose Nybegynder
16. januar 2006 - 17:08 #37
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'

[Microsoft][ODBC Microsoft Access Driver] Syntax error in INSERT INTO statement.

og linie 74 = connection.execute(sql);
Avatar billede softspot Forsker
16. januar 2006 - 17:23 #38
Flere spørgsmål:

1. Hvilken af de mindst 2 linier med connection.execute(sql) er der tale om?

2. Hvordan ser SQL-sætningen ud (benyt tricket med Response.Write + Response.End)?

3. Hvad ligger der i den cookie du bruger til at afgøre om der skal opdateres eller oprettes en kunde?


Jeg kan stadig finde flere syntaktiske fejl i koden, så det er interessant at vide lidt mere hvilken vej igennem koden du kører i øjeblikket. Hvis du er mere specifik med hvor i koden fejlen opstår, kan jeg hurtigere hjælpe dig med at rette fejlen... :)
Avatar billede axl_rose Nybegynder
17. januar 2006 - 21:08 #39
Jeg lukker softspot smider du ikke et svar?
Avatar billede softspot Forsker
17. januar 2006 - 22:08 #40
Jo, det kan jeg da godt, men fik vi løst problemet, eller stiller jeg bare formange træls spørgsmål...? :)
Avatar billede axl_rose Nybegynder
18. januar 2006 - 14:22 #41
Altså det hele endte meget uoverskueligt og det vil kræve jeg laver nogen større rettelser, så derfor lukker jeg :-). . . .

Ellers mange tak for de uddybende svar! :)
Avatar billede softspot Forsker
18. januar 2006 - 16:28 #42
Fint nok, men vi kunne (og kan stadig) godt have fundet en løsning på din udfordring, der er bare lige nogle steder i din kode som skal ændres lidt for at det kommer til at spille... så umulig er koden jo heller ikke ;-)
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
Kurser inden for grundlæggende programmering

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