Avatar billede halden Nybegynder
04. september 2003 - 17:22 Der er 29 kommentarer og
1 løsning

SQL syntax error or access violation

PreparedStatement pstmt = con.prepareStatement("UPDATE brugere SET Fornavn = ?, Efternavn = ?, Adresse = ?, Postnummer = ?, By = ?, Land = ?, Telefon = ?, Mail = ?, Adgangskode = ? WHERE Bruger_ID = ?");

pstmt.setString(1, fornavn);
pstmt.setString(2, efternavn);
pstmt.setString(3, adresse);
pstmt.setInt(4, postnummer);
pstmt.setString(5, by);
pstmt.setString(6, land);
pstmt.setInt(7, telefon);
pstmt.setString(8, mail);
pstmt.setString(9, adgangskode);
pstms.setInt(10, brugerID);

Dette for jeg en nullpointerException på.
Jeg har prøvet kun at update et felt og det går fint, så prøvede et mere osv. men da jeg havde pstmt.setString(5, by); med så ville den ikke.

Kan PreparedStatement ikke tage mere end 5 parametre med ind eller hvad???
Hvad søren er der galt??????
Avatar billede halden Nybegynder
04. september 2003 - 17:35 #1
det er en MySQL database hvor jeg har brugt MySQL Control Center til at oprette db'en og tabellerne.
Kan det have noget med det at gøre???
Avatar billede arne_v Ekspert
04. september 2003 - 17:44 #2
Det betyder ikke noget hvordan tabellen er oprettet.

Det burde ikke betyde noget med antal ?.

Er du sikker på at der ikke er en af de String's der er null ?

(hvis du vil sætte et felt til NULL skal du bruge setNull)
Avatar billede halden Nybegynder
04. september 2003 - 17:53 #3
har skrevet allesammen ud lige inden og der er ikke nogen af dem der er null.
Jeg fatter det simpelthen ikke.
Avatar billede simonvalter Praktikant
04. september 2003 - 18:04 #4
hvad hvis du laver update direkte i mysql databasen .. får du nogen fejl ..
eller hvis du laver en alm executeupdate
Avatar billede halden Nybegynder
04. september 2003 - 18:13 #5
nej, ingen fejl ellers
Avatar billede simonvalter Praktikant
04. september 2003 - 18:18 #6
så kan du prøve
smid nogen System.out ind og se hvor det går galt.

hvis det er development jdbc .. check om det er den det er galt med.

switch
pstmt.setString(5, by);
med
pstmt.setString(6, land);

og hvad du ellers kan finde på for at lokalisere fejlen.
Avatar billede halden Nybegynder
04. september 2003 - 18:43 #7
fandt lige ud af at det var en gammel Connector jeg havde så den er skiftet ud med en ny - men samme fejl.
Nu er der også kommet en anden fejl:
RequestDispatcher rd = getServletContext().getRequestDispatcher("/index.jsp");
rd.forward(req,res);

Dette får jeg en IllegalStateException: forward() not allowed after buffer has committed.

Hvad skal gøre ved den???
Avatar billede simonvalter Praktikant
04. september 2003 - 19:03 #8
et vildt skud
http://www.caucho.com/support/resin-interest/0102/0314.html
men ellers prøv selv at google på fejlen.

eller smid noget mere kode som folk kan kigge igennem for evt fejl
Avatar billede halden Nybegynder
04. september 2003 - 19:11 #9
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class retKonto extends HttpServlet {
   
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
Connection con = null;
       
String fornavn = (String)req.getParameter("fornavn");
String efternavn = (String)req.getParameter("efternavn");
String adresse = (String)req.getParameter("adresse");
int postnummer = Integer.parseInt((String)req.getParameter("postnummer") );
String by = (String)req.getParameter("by");
String land = (String)req.getParameter("land");
int telefon = Integer.parseInt((String)req.getParameter("telefon") );
String mail = (String)req.getParameter("mail");
String adgangskode = (String)req.getParameter("adgangskode");
       
try {
  con = (Connection)req.getSession().getAttribute("con");
  PreparedStatement pstmt = con.prepareStatement("UPDATE brugere SET Fornavn = ?, Efternavn = ?, Adresse = ?, Postnummer = ?, By = ?, Land = ?, Telefon = ?, Mail = ?, Adgangskode = ? WHERE Bruger_ID = ?");
           
  pstmt.setString(1, fornavn);
  pstmt.setString(2, efternavn);
  pstmt.setString(3, adresse);
  pstmt.setInt(4, postnummer);
  pstmt.setString(5, by);
  pstmt.setString(6, land);
  pstmt.setInt(7, telefon);
  pstmt.setString(8, mail);
  pstmt.setString(9, adgangskode); 
  Integer i = (Integer)req.getSession().getAttribute("brugerID");
  pstmt.setInt(10, i.intValue());
           
  pstmt.executeUpdate();
  pstmt.close();
           
  //brugernavnet lægges i en sessions variabel
  req.getSession().setAttribute("fornavn", fornavn);
           
  //her overfører vi kontrollen til index.jsp
  RequestDispatcher rd = getServletContext().getRequestDispatcher("/minKonto.jsp");
  if (rd != null) {
    rd.forward(req,res);
  }//end if
           
}//end try
catch(Exception e) {
  //her overfører vi kontrollen til fejl.jsp
  RequestDispatcher rd = getServletContext().getRequestDispatcher("/fejl.jsp");
  if (rd != null) {
    rd.forward(req,res);
  }//end if
  this.getServletContext().log("Fejl: " + e);
  }//end catch
       
}//end doPost
   
}//end class
Avatar billede arne_v Ekspert
04. september 2003 - 20:04 #10
Der er noget jeg ikke forstår.

Du får både en NullPointerException og en IllegalStateException ?

Hvis det er tilfældet må det vel nødvednigvis være de sidste
forward og ikke den første der giver fejlen.
Avatar billede halden Nybegynder
04. september 2003 - 20:22 #11
jeps, det er det også. Hvad er der galt???
Avatar billede halden Nybegynder
04. september 2003 - 20:23 #12
altså det sidste forward() der giver IllegalStateException.
hvad er der galt???
Avatar billede arne_v Ekspert
04. september 2003 - 20:39 #13
Fejlen vil man normalt få hvis man har kaldt:

res.getOutputStream().println("et eller andet");

inden man kalder forward.

Men sådan noget er der jo ikke.
Avatar billede arne_v Ekspert
04. september 2003 - 20:41 #14
Det er koden præcis som den ser ud ikke ?
Avatar billede halden Nybegynder
04. september 2003 - 21:03 #15
jo, præcis
Avatar billede halden Nybegynder
04. september 2003 - 21:16 #16
Den IllegalStateException er først kommet da jeg skiftede fra mysql-connector-java-2.... til 3.0.8
underligt...
Avatar billede arne_v Ekspert
04. september 2003 - 21:18 #17
Ja det er meget mystisk fordi den exception er en servlet ting og har intet
med JDBC at gøre.
Avatar billede halden Nybegynder
05. september 2003 - 11:20 #18
sjovt nok så virker den fint hvis jeg undlader By = ?
Avatar billede halden Nybegynder
05. september 2003 - 11:21 #19
altså nullpointerexceptionen(syntax fejl)
Avatar billede simonvalter Praktikant
05. september 2003 - 12:05 #20
check lige din brugere tabel en extra gang om det nu også er de rigtige typer eller om by over hovedet er i den
Avatar billede halden Nybegynder
05. september 2003 - 12:24 #21
tjek det her ud...!!!

UPDATE brugere
SET By='eksempel'
WHERE Bruger_ID='0'

Dette prøvede jeg direkte i databasen og fik følgende fejl:
ERROR 1064: You have an error in your SQL syntax.

Feltet By er af typen "text".
Har prøvet at slette tabellen og oprette en ny men der kommer samme fejl.
Jeg er simpelthen fuldstændig lost...
Avatar billede pblv Nybegynder
05. september 2003 - 12:32 #22
Lav din kolonne "by" om til varchar. 30 i længde skulle kunne gøre det. Og så sørg lige for at du skriver by og ikke By...
Avatar billede simonvalter Praktikant
05. september 2003 - 12:36 #23
UPDATE brugere
SET brugere.By='eksempel'
WHERE Bruger_ID='0';

klarer det også.
Avatar billede arne_v Ekspert
05. september 2003 - 12:38 #24
Virker:

UPDATE brugere
SET By='eksempel'
WHERE Bruger_ID=0

?
Avatar billede arne_v Ekspert
05. september 2003 - 12:38 #25
BrugerID ser ud til at være integer.
Avatar billede arne_v Ekspert
05. september 2003 - 12:40 #26
Jeg er iøvrigt meget enig i at varchar bør være nok til et bynavn.

Men jeg har svært ved at se det som en løsning på problemet.
Avatar billede simonvalter Praktikant
05. september 2003 - 12:56 #27
af en eller anden grund så kan man ikke

UPDATE brugere
SET By='eksempel'
WHERE Bruger_ID='0'

når typen er text .. er den derimod varchar er der intet problem.

for at tilgå text type skal du gøre som jeg skrev tidligere. ..
jeg kan desværre ikke finde nogen begrundelse i mysql (som jeg går ud fra du bruger) om hvorfor det sker.
Avatar billede halden Nybegynder
05. september 2003 - 13:30 #28
jeg måtte ikke endgang slette tabellen. Så jeg lavede en ny og delte statementet op i 2 og det virker. Prøvede med bare et statement og samme fejl.
Bare underligt. Jeg tror det er en fejl i connectoren.
Avatar billede simonvalter Praktikant
05. september 2003 - 13:33 #29
har fundet svaret på dit problem
by er et mysql keyword

du skal komme by i backquotes hvis du vil bruge det!

UPDATE brugere SET `by` = 'foo' WHERE id =0 ;
Avatar billede halden Nybegynder
05. september 2003 - 13:47 #30
tak. Men den nye tabel jeg lavede, der brugte jeg city istedet og fik stadig samme fejl. Derfor bruger jeg nu 2 PreparedStatements.
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