Webmaster Forum Logo Part 1 Webmaster Forum Logo Part 2
Webmaster Forum Logo Part 3
     
 
  :: Anmeldung

Benutzername:

Registrierung...

Passwort:

Passwort vergessen?

angemeldet bleiben


  
  :: Umfrage
Welche sozialen Netzwerke benutzt du regelmäßig?

 Facebook
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 73%
 keines
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 22%
 Google+
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 19%
 Twitter
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 11%
 Xing
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 schülerVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 6%
 meinVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 studiVZ
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 4%
 MySpace
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%
 LinkedIn
 Webmaster - WebspaceWebmaster - WebspaceWebmaster - Webspace 2%

 ges. 393 Stimmen
 
  :: Buttons

Valid XHTML 1.0 Transitional

Tsx

Eroberer

Dabei seit: 10.05.2011

Beiträge: 51

 

1 Zum Seitenanfang

Freitag, 1. Juli 2011, 08:53

SELECT LAST_INSERT_ID() immer 0

Ich habe ein Problem mit "SELECT LAST_INSERT_ID" es gibt immer 0 zurück egal was ich auch versuche. Hier mal ein Auszug aus dem Quellcode..

public class MyClassDAOImpl extends JdbcDaoSupport implements MyClassDAO{

public int create(Filter filter) {

int id = 0;

if (filter!= null) {

JdbcTemplate template = getJdbcTemplate();
String sql = "INSERT INTO mytable (feld1, feld2, feld3, feld4, feld5, feld6, feld7) VALUES (?,?,?,?,?,?,?)";

template.update(
sql,
new Object[] {
filter.feld1,
filter.feld2,
filter.feld3,
filter.feld4,
filter.feld5,
filter.feld6,
filter.feld7,
}
);

id = template.queryForInt("SELECT LAST_INSERT_ID()");
}

return id;
}

... more CODE....

Wie man sieht handelt es sich hierbei um den Anfang eines CRUDs. Ich habe wie es sich als ordentlicher Programmierer gehört Junit Test dazu geschrieben. Beim Testen der Create Methode wir per assertEquals(1, ..dao.create(fuba)) überprüft ob das objekt auch eingefügt wurde, wenn ja müsste nach meiner Implementation die zu letzt eingefügte ID zurückgegeben werden. Ich arbeite mit Temptables und es ist das erste eingefügte Objekt, weshalb ich auch auf 1 Prüfe. Der Fehler das Last insert id nur dann geht wenn der Prim Key ein Auto Increment ist, kann ausgeschlossen werden. Es ist ein Auto Increment.

So ich bin gern für eure Vorschläge zu haben, ich habe schon 2 Std investiert und das ist eigentlich schon viel zu viel für ein einfaches CRUD.
 

E & S

Foren As

Dabei seit: 22.05.2009

Beiträge: 81

 

2 Zum Seitenanfang

Samstag, 2. Juli 2011, 15:58

Hi,

wiese arbeitest du nicht nicht mit den SQL Funktionen min(), max()??? Wenn die ID ein "Auto Increment" ist, sollte es kein Problem darstellen.
 

Tsx

Eroberer

Dabei seit: 10.05.2011

Beiträge: 51

 

3 Zum Seitenanfang

Sonntag, 3. Juli 2011, 18:31

Keine schlechte Idee, es wäre zwar rein von der Performance her nicht so schön, aber es werden hier auch nicht x beliebig viele Dateien im sek. Takt eingefügt. Ich werde das mal testen, besten Dank für die Idee =).
 

cccpmik

Foren Gott

Dabei seit: 04.09.2007

Beiträge: 2 999

 

4 Zum Seitenanfang

Montag, 4. Juli 2011, 09:45

alternativ könntest du eine spalte created_time() erstellen und mit

MySQL-Abfrage(n)

1
2
3
4
SELECT id 
FROM tabelle
ODER BY created_time DESC
LIMIT 1;


würdest du den zu letzt erstellten datensatz kriegen..

http://dev.mysql.com/doc/refman/5.1/de/i…-functions.html

wenn du ein auto increment feld in deiner tabelle hast, dann müsste es gehen, wieso es bei dir nicht geht , liegt vielleicht an deiner queryForInt methode. Probier mal mit ganz normalen mysql_query ohne klasse dahinter...

MFG
Mein kleines Projekt
-Cruel Online-
 

splasch

Doppel-As

Dabei seit: 12.06.2010

Beiträge: 118

 

5 Zum Seitenanfang

Montag, 4. Juli 2011, 13:05

Zitat

id = template.queryForInt("SELECT LAST_INSERT_ID()");


las das Select weg dann wird auch funktionieren!
(http://php.net/manual/de/function.mysql-insert-id.php)

PHP-Quelltext

1
$id mysql_insert_id();


Mfg Splasch

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »splasch« (4. Juli 2011, 13:05)

 

lorenz

Haudegen

Dabei seit: 05.11.2002

Beiträge: 647

 

6 Zum Seitenanfang

Montag, 4. Juli 2011, 13:41

das sieht eher nach java aus und nicht nach php ;) da wird das sicher nicht gehen ;)

ich vermute mal das du ne andere Verbindung bei der ID abfrage bekommst und dadurch immer 0 bekommst

-LA
 

Tsx

Eroberer

Dabei seit: 10.05.2011

Beiträge: 51

 

7 Zum Seitenanfang

Montag, 4. Juli 2011, 13:57

Erstmal danke für die guten Vorschläge.

@cccpmik, eine zusätzliche Spalte steht nicht auf der Liste der Möglichkeiten, gearbeitet werden muss mit dem was gegeben ist :D, liegt nicht an mir ist so. Leider wäre später, da die Tabelle auf mehrere 100.000 Einträge wachsen wird, die Performance vom Sortieren und mit Limit nur eines ausgeben nicht ausreichend.

@splasch, wie lorenz schon richtig erkannt hat ist die Syntax korrekt, es handelt sie um Java Quellcode. Tut mir leid das ich das im Vorfeld nicht erwähnt habe.

@lorenz, die Verbindung ist laut log ein und die selbe, der Gedanke ist mir gestern Abend auf Schacht auch gekommen ;D.

Ich habe jedoch einen neuen Status erreicht. Es muss ein Konfigurationsproblem meiner lokalen Datenbank sein, welche ich zum testen verwende. Denn im Online Betrieb funktioniert es. Sollte ich noch raus finden oder einer von euch, welche Ursachen das haben kann, immer gerne her mit den Informationen.

LG
Tsx
 

Ego

Routinier

Dabei seit: 22.07.2009

Beiträge: 322

 

8 Zum Seitenanfang

Montag, 4. Juli 2011, 23:05

mich würde auch interessieren was die querryForInt-Methode macht ...
oder Du führst etwas genauer aus Was unter welchen Bedingungen was Funktioniert :)

sonnst gibts hier noch ein paar Beispiele von der mysql seite:
Beispiel 25.9. Abruf von AUTO_INCREMENT-Spaltenwerten mit SELECT LAST_INSERT_ID()

Gruß
Ego
 

Tsx

Eroberer

Dabei seit: 10.05.2011

Beiträge: 51

 

9 Zum Seitenanfang

Dienstag, 5. Juli 2011, 11:47

Das QueryForInt ist dafür zuständig das vom SQL Statement zurückgegebene in ein integer zu "pressen" :=). Wenn es null bekommt gibt es 0 aus. Da ich im Junit Test nach einem Create eine 1 zurückbekommen sollte bei einem eingefügten Objekt, kann ich so mit assertEquals prüfen ob (1,rückgabe vom create(1wird erwartet)) ist.
 

Ähnliche Themen