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!!!!!
TDM Geschrieben 20. Juni 2008 Geschrieben 20. Juni 2008 MAX(ID) abfragen und um eins erhöhen... alternativ auch einfach Autoincrement setzen.
robotto7831a Geschrieben 20. Juni 2008 Geschrieben 20. Juni 2008 In der Tabelle auf der Spalte ID das Attribut auto_increment setzen. Frank
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;
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
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
robotto7831a Geschrieben 21. Juni 2008 Geschrieben 21. Juni 2008 Hallo, unique muss auf autoincrement Spalten bei MySQL nicht gesetzt werden. Frank
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden