Zum Inhalt springen

Nächsthöhere ID aus SQL-Datenbank


tom24008

Empfohlene Beiträge

Hi!

Ich habe ein Servlet programmiert und siehe da: Es funktioniert :D

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!!!!!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...