Avatar billede tmouritsen Nybegynder
15. februar 2002 - 11:19 Der er 11 kommentarer og
1 løsning

NullPointerException i PreparedStatement

Jeg har lavet et PreparedStatement der ser ud som følgende:
"INSERT INTO kursus (id, navn, beskrivelse) VALUES (?, ?, ?)"

når jeg kalder setInt(1, 15) på mit PreparedStatement objekt får jeg en NullPointerException. Det er ikke fordi objektet ikke er oprettet, men det er internt i PreparedStatement den kalder videre til den interne metode clearParameter() og kaster så en exception.

Jeg har prøvet at sætte setString(2, "Test") men med samme resultat.

Nogle idéer???
Avatar billede disky Nybegynder
15. februar 2002 - 11:50 #1
post koden til preparestatement.
Avatar billede tmouritsen Nybegynder
15. februar 2002 - 12:07 #2
PreparedStatement insertStatement = db.getConnection().prepareStatement("INSERT INTO kursus (id, navn, beskrivelse) VALUES ( ?, ?, ?)");
insertStatement.setInt(1, 3);
insertStatement.setString(2, "Navn");
insertStatement.setString(3, "Beskrivelse");

og fejlen ser ud som følger:
java.lang.NullPointerException

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.clearParameter(JdbcOdbcPreparedStatement.java:1027)

at sun.jdbc.odbc.JdbcOdbcPreparedStatement.setInt(JdbcOdbcPreparedStatement.java:523)

at AbstractMapper.insert(AbstractMapper.java:83)

at DBTest.<init>(DBTest.java:10)

at DBTest.main(DBTest.java:5)
Avatar billede tmouritsen Nybegynder
15. februar 2002 - 12:13 #3
Jeg har prøvet at lave et PreparedStatement med en sætning der vil skabe fejl hvis den bliver sendt til databasen. Og den brokkede sig også. Det må betyde at det statement jeg bruger virker med databasen de den ikke brokker sig over det.
Avatar billede erikjacobsen Ekspert
15. februar 2002 - 14:18 #4
Der ser jo ikke ud til at være noget galt. Jeg har ikke selv oplevet
den fejl, og jeg kan kun gætte på hvad der kan gå galt.

1) Hvis Id er autonummereret, kan det være du ikke må give det
en direkte værdi
2) Er din databaseforbindelse sat korrekt op?
3) Kan du udføre et preparedstatement uden ?-er i ?
Avatar billede rene-rene Nybegynder
15. februar 2002 - 21:47 #5
Det kan være fordi at du sender 2 parameter med og der skal bruges 3 paramter i din statement:
INTO kursus (id, navn, beskrivelse) VALUES ( ?, ?, ?)"); // 3 stk ?
insertStatement.setString(2, "Navn"); //kun 2 parameter
Avatar billede erikjacobsen Ekspert
15. februar 2002 - 21:50 #6
Det tror jeg ikke, Rene. Ved du hvordan et preparedstatement virker,
eller gætter du bare? Og hvis du gætter, tror du så egentlig at
du er til nogen hjælp overhovedet?
Avatar billede rene-rene Nybegynder
15. februar 2002 - 22:02 #7
gættede, men undskyld jeg er her.
Avatar billede tmouritsen Nybegynder
16. februar 2002 - 16:35 #8
Jeg har prøvet at oprette et script mev nogle gyldige værdier i stedet for ? og når jeg udfører scriptet kører det som var det betalr for det.
Så tydeligvis er der noget der fungerer.

id er sat til integer og navn & beskrivelse er sat til varchar(25)
Avatar billede erikjacobsen Ekspert
16. februar 2002 - 16:58 #9
Er din id autoincrement?
Avatar billede tmouritsen Nybegynder
11. marts 2002 - 15:07 #10
erikjacobsen> Nej det er en normal integer.

Jeg har testet både på Access 2000 og Interbase - jeg får den samme fejl. Løsningen har været at jeg har lavet en klasse der implementere de samme metoder som PreparedStatement - men som ikke har samme kontrol i databasen. Således at jeg kan udskifte klasse til den rigtige klasse hvis jeg en gang får det til at virke.
Avatar billede erikjacobsen Ekspert
11. marts 2002 - 22:28 #11
Det er vel en ringe trøst at dette virke (en gammel NT med
Resin, Access 97 database - vistnok):

<HTML>
<HEAD>
<TITLE>prep.jsp</TITLE>
</HEAD>

<BODY>
Før<bR><br>
<%@ page import="java.sql.*" %>
<%
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  Connection con = DriverManager.getConnection("jdbc:odbc:ejnames","","");

  out.println("Før<br>");
  PreparedStatement pstmt = con.prepareStatement("INSERT INTO navne (navn) VALUES (?)");
  pstmt.setString(1,"Peddersen og Findus");
  pstmt.execute();
  out.println("Efter<br>");

  Statement stm = con.createStatement();
  ResultSet rs = stm.executeQuery("select * from navne");

  while (rs.next()) {
    out.println(rs.getString("navn"));
    out.println("<br>");
  }
%>
Efter
</BODY>
</HTML>
Avatar billede tmouritsen Nybegynder
29. oktober 2002 - 16:26 #12
Lukker nu
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