tom24008 Geschrieben 20. Juni 2008 Geschrieben 20. Juni 2008 Hi! Ich habe ein Servlet programmiert und siehe da: Es funktioniert Es hat folgende Funktion, es liest die eingegebenen Daten aus und schreibt diese dann in eine SQL Datenbank. (Das ist wahrscheinlich keine all zu große Kunst, doch ich mach das grad zum ersten mal) Das Porblem was ich jetzt habe ist das ich in der SQL Datenbank eine ID hab und wenn nun neue Werte in die Datenbank geschrieben werden, sollen diese auch die nächst höhere ID annehmen. Das krieg ich nicht hin... Das hier ist mein Quelltext (Ohne das erstellen der nächshöheren ID), vielleich kann mir da ja jemand helfen? DANKE!!!!!!!!! package th; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class for Servlet: versuch * */ public class versuchantwort extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet { static final long serialVersionUID = 1L; /* (non-Java-doc) * @see javax.servlet.http.HttpServlet#HttpServlet() */ public versuchantwort() { super(); } /* (non-Java-doc) * @see javax.servlet.http.HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response) */ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub doPost(request, response); } /* (non-Java-doc) * @see javax.servlet.http.HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub PrintWriter pr = response.getWriter(); response.setContentType("text/html"); String kategorie = "EWO"; String typ = "JR"; String dateiname = "th1"; // int erg = -1; int perg = -1; String eingabe = "Sie haben nix eingegeben"; if (request.getParameter("Eingabe") !=null ){ eingabe = request.getParameter("Eingabe"); // hole nächste verfügbare Parameter Id // perg = //schreibe in Datenbank erg = schreibe(eingabe, dateiname, kategorie, typ); } // Jetzt in DB schreiben in Tabelle berichte pr.write("<HTML><HEAD><TITLE>Abfrageergebnis</TITLE></HEAD><BODY>"); pr.write("<FORM NAME='th' ACTION=''>"); pr.write("<BR><BR>"); pr.write("Ergebnis: " + erg); pr.write("<BR><BR>"); pr.write("Ihre Eingabe war"); pr.write("<BR><BR>"); pr.write("<INPUT TYPE='TEXT' NAME='Ausgabe' VALUE='" + eingabe + "'>"); pr.write("<BR><BR>"); pr.write("<INPUT TYPE='SUBMIT' VALUE='Beenden'>"); pr.write("</FORM>"); pr.write("</BODY></HTML>"); } public int schreibe(String eingabe, String a, String b, String c ){ int res = -1; try { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql://localhost/berichte", "bericht", "bericht"); Statement stmt = con.createStatement(); String insertquery = "INSERT INTO berichte (name, file, kategorie, btyp, accessid) "; insertquery = insertquery + "VALUES ('" + eingabe + "','" + a + "','" + b + "','" + c + "',0)"; res = stmt.executeUpdate(insertquery, Statement.RETURN_GENERATED_KEYS); stmt.close(); con. close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return res; } Vielen Dank für eure Hilfe!!!!! Zitieren
TDM Geschrieben 20. Juni 2008 Geschrieben 20. Juni 2008 MAX(ID) abfragen und um eins erhöhen... alternativ auch einfach Autoincrement setzen. Zitieren
tom24008 Geschrieben 20. Juni 2008 Autor Geschrieben 20. Juni 2008 jo, nur wie mach ich das? Zitieren
robotto7831a Geschrieben 20. Juni 2008 Geschrieben 20. Juni 2008 In der Tabelle auf der Spalte ID das Attribut auto_increment setzen. Frank Zitieren
Dragon8 Geschrieben 20. Juni 2008 Geschrieben 20. Juni 2008 Oder ne eine Abfrage starten, die dir die bisher höchste ID zurück gibt. Diese um eins erhöhren und als neue ID benutzen. z.B. ResultSet rs = stmt.executeQuery("Select MAX(ID) FROM [DeineTabelle]"); int neueID = 0; if(rs.next()) neueID = rs.getInt(1) + 1; Zitieren
dr.dimitri Geschrieben 20. Juni 2008 Geschrieben 20. Juni 2008 Select MAX(ID) FROM [DeineTabelle] Das funktioniert nur zuverlässig, wenn es sich für immer und ewig im eine Singleuser Datenbank handelt. Andernfalls wirst Du hier falsche Ergebnisse bekommen! Werden nämlich ein oder mehrere Datensätze neu eingefügt, dann sehen andere Sessions diese neuen Daten nicht solange sie nicht committet sind. Bedeutet, Du kannst dir nicht sicher sein ob der Wert den Du bekommst nicht eigentlich falsch ist, weil 1 Sekunde später eine andere Session ihre Änderungen committet und damit Dein Ergebnis ungültig macht. Die einzige zuverlässige und korrekte Methode ist es daher, die Methoden der DB zu nutzen. Bei Oracle verwendet man Sequenzen dafür, MSSQL hat Identity Spalten und andere DBs haben sicherlich ähnliche Möglichkeiten. Dim Zitieren
flashpixx Geschrieben 21. Juni 2008 Geschrieben 21. Juni 2008 Die einzige zuverlässige und korrekte Methode ist es daher, die Methoden der DB zu nutzen. Bei Oracle verwendet man Sequenzen dafür, MSSQL hat Identity Spalten und andere DBs haben sicherlich ähnliche Möglichkeiten. Das stimmt. Als Lösung wäre hier wirklich das Autoinc von SQL zu verwenden, meistens lässt man dieses Feld dann im Insert weg bzw. man übergibt dort NULL, damit wird durch das DBMS ein neuer Wert generiert. In Postgres sind es Squenzen, in MySQL Autoincrement. Wenn ich nicht irre, dann klappt das Autoincrement bei MySQL nur, wenn das Feld als unique gesetzt ist HTH Phil Zitieren
robotto7831a Geschrieben 21. Juni 2008 Geschrieben 21. Juni 2008 Hallo, unique muss auf autoincrement Spalten bei MySQL nicht gesetzt werden. Frank Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.