Java & MS SQL - mal ein Problem für einen Profi

speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#1 Java & MS SQL - mal ein Problem für einen Profi

Beitrag von speedy »

Hallo,

Ich hab eine MS SQL Datenbank (SQL Server Express 2008) und steuer die aus Java mit dem 2005er SQL Server Java-Treiber an. (wird so empfholen, weil es noch keinen 2008er Treiber gibt) Java ist die Version 6 und ich entwickel unter Eclipse.

Klappt auch wunderbar.

Jetzt bastel ich grad so bißchen zum Üben von Java & der DB Anbindung - bin nen Java-Anfänger - nen kleinen Datenbank Editor - also nur für paar wichtige Sachen.

Nun wollt ich eine AutoIncrement Spalte in die Tabelle einfügen - gemacht getan - wird angelegt.

Jetzt schreibe ich eine Zeile in die Tabelle und es kommt die SQLException "Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden."

Hier mal das Create:

Code: Alles auswählen

CREATE TABLE TestTabelle ( Spalte1 INT CONSTRAINT pk_Spalte1_1234489708313 PRIMARY KEY IDENTITY(1,1) NOT NULL, Spalte2 VARCHAR(256) NULL );
und hier das Insert:

Code: Alles auswählen

INSERT INTO TestTabelle (Spalte2) VALUES ('String18');

In Java verwende ich vom Statement den Batch-Mechanismus, um die Zeilen erstmal zum Batch hinzu zu fügen und dann auszuführen. Einzeln oder zusammen - funktioniert beides nicht.

Beim m_Statement.executeBatch(); wird die SQLException geschmissen.

Wenn ich aber nun das Insert-Statement direkt im SQL Server Manager ausführe, dann funktioniert es.


Und jetzt kommt der Hammer - bevor ich den Code für das Erstellen des Insert-Statements geändert habe - also das war einfach nur ein anderer Algorithmus (die for-Schleifen sahen bißchen anders aus), wo dann das gleiche Statement bei rauskam (der alte Algorithmus hatte nur nen Problem, wenn die AutoIncrement-Spalte die letzte Spalte war) ... jedenfalls bin ich der Meinung nur das geändert zu haben ... na jedenfalls .... davor hatte es funktioniert.

Ich hab das schon auf Tabellen getestet, wo es vorher funktioniert hatte, auf neue Tabellen und in einer neuen Datenbank. Selbst nen Windows-Neustart half nichts. ;)

.... und jetzt sitz ich hier schon paar Stunden und grübel vor mich hin, was ich denn da jetzt falsch/anders mache.


Jemand ne Idee, was ich noch ausprobieren könnte ?


MFG,
speedy
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#2 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von tracer »

speedy hat geschrieben:Jemand ne Idee, was ich noch ausprobieren könnte ?
Stell als erstes mal Dein Entwicklungssystem auf englisch um, damit Du aussagekräftige Fehlermeldungen bekommen.

"Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden." Is klar, nee?


Ansonsten: http://www.insidesql.org/fehlermeldunge ... ert-werden
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#3 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von speedy »

tracer hat geschrieben:Stell als erstes mal Dein Entwicklungssystem auf englisch um, damit Du aussagekräftige Fehlermeldungen bekommen.
Bringt ja nichts - ich hab auch irgendwo schon die englische Fehlerbeschreibung gefunden, sagt mir genauso wenig - bzw. die Fehlernummer ist die 8102 ...

In ner Group:

Server: Msg 8102, Level 16, State 1, Line 1
Cannot update identity column 'b'.
Ja schön - aber ich übergebe doch garnichts für die Spalte1 ?



Ich hab dann eben nochmal eine kleine Testreihe durchgeführt - jetzt wirds so richtig mysteriös denke ich.

Ausgangszustand - in der Tabelle ist eine Zeile inkl. AutoIncrement drin, weil durch den MS SQL Server Manager mit dem Statement eingefügt. Spalte1 hat den Wert 1, Spalte2 den Wert "String123".


Also erstmal...

SET IDENTITY_INSERT TestTabelle OFF;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (NULL,'Zeile222');

Dann kommt jenes...

DEFAULT und NULL sind nicht als explizite Identitätswerte zulässig.

Und es wird auch nichts eingefügt - ist ja auch logisch. Die Spalte wurde ja auf "NOT NULL" gesetzt bzw. ist das "NOT NULL" setzen der Spalte eine Voraussetzung dafür, daß die Tabelle angelegt wird ... aber klar - ein Versuch war es Wert.


Dann...

INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (0,'Zeile2');

Kommt jenes...
Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden.

Dann ...

INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (1,'Zeile2');

Kommt ...
Ein expliziter Wert für die Identitätsspalte kann nicht in der 'TestTabelle'-Tabelle eingefügt werden, wenn IDENTITY_INSERT auf OFF festgelegt ist.

Jetzt sehe ich auf einmal, der Wert in obiger Zeile 1 hat sich von "String123" auf "Zeile2" geändert. :shock:

Also nochmal verifiziert....

INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (1,'Zeile277777');

Kommt wieder jenes ....
Ein expliziter Wert für die Identitätsspalte kann nicht in der 'TestTabelle'-Tabelle eingefügt werden, wenn IDENTITY_INSERT auf OFF festgelegt ist.

Aber der Wert der Spalte2 wurde von "Zeile2" auf "Zeile277777" gesetzt. :shock:

Nun also mal jenes ausprobiert....

SET IDENTITY_INSERT TestTabelle ON;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (1,'Zeile999');

Kommt logischerweise das....
Verletzung der PRIMARY KEY-Einschränkung 'pk_Spalte1_1234489708313'. Ein doppelter Schlüssel kann in das 'dbo.TestTabelle'-Objekt nicht eingefügt werden.

Aber der Wert der Spalte2 wurde von "Zeile277777" auf "Zeile999" gesetzt. :shock:

Als nächstes...

SET IDENTITY_INSERT TestTabelle ON;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (0,'Zeile555');

Kommt...
Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden.

Und die Zeile 1 mit "Zeile999" drin wurde Erwartungsgemäß nicht geändert.

Nun jenes getestet....

SET IDENTITY_INSERT TestTabelle ON;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (2,'Zeile444');

Die Zeile wird ohne zu meckern eingefügt.

Also nochmal ne Chance geben...

SET IDENTITY_INSERT TestTabelle OFF;
INSERT INTO TestTabelle (Spalte1,Spalte2) VALUES (0,'Zeile333');

Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden.

Es wurde auch nichts eingefügt.

Und die nächste Chance ganz ohne Spalte1 ...

SET IDENTITY_INSERT TestTabelle OFF;
INSERT INTO TestTabelle (Spalte2) VALUES ('Zeile111');

Die 'Spalte1'-Identitätsspalte kann nicht aktualisiert werden.



MFG,
speedy
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#4 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von speedy »

Nochmal was dazu - so ne komplizierte SQL Anweisung mache ich ja auch gar nicht - also irgendwas mit Update und so. Ich hab nur eine Tabelle erstellt und will da jetzt neue Zeilen einfügen.


EDIT: Die letzte SQL Anweisung nur mit der Spalte2 und Insert_Identitiy auf ON bringt trotzdem die Meldung.


MFG,
speedy
fireball

#5 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von fireball »

Lass mal den Primary Key auf der AutoWert-Spalte weg beim Erstellen der Tabelle...
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#6 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von speedy »

fireball hat geschrieben:Lass mal den Primary Key auf der AutoWert-Spalte weg beim Erstellen der Tabelle...
Damit hat es angefangen. Also ich hatte eine Tabelle mit 3 Spalten - die erste war Primary Key, die zweite nichts und die dritte die AutoIncrement. Dann hab ich gesehen, daß mein Zusammen bauen dann nicht funktioniert (wurde nen Komma zu viel gesetzt - also hinter die letzte Spalte und Wert), weil das AutoIncrement in der letzten Spalte ist. Also umgebaut - und seit dem kommt das.

Aber kann ich gern gleich nochmal testen.


MFG,
speedy
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#7 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von speedy »

Jetzt wird doch der Hahn in der Pfanne verrückt. :mrgreen: - aber nicht wirklich mit Erfolg. :(

Also hab eben jenes gemacht:

CREATE TABLE TestTabelle2 ( Spalte1 INT CONSTRAINT pk_Spalte1_1234523474765 PRIMARY KEY NOT NULL, Spalte2 INT IDENTITY(1,1) NOT NULL );

INSERT INTO TestTabelle2 (Spalte1) VALUES (1);

Es kommt:
Die 'Spalte2'-Identitätsspalte kann nicht aktualisiert werden.

Ich hab beide Befehle in einem Batch-Job Statement ausgeführt, wobei ich beide Zeilen separat hinzugefügt habe.

Jetzt das verrückte - die Zeile ist drin und der AutoIncrement auf 1 gesetzt. :shock: - trotz Fehlermeldung.

Also gleich noch paar Zeilen versucht hinzu zu fügen - hat nicht funktioniert. :(


Also reproduziert - neue Tabelle mit einer Zeile zusammen in einem Batch-Job .... funktioniert - aber mit Fehlermeldung.

Nochmal reproduziert - neue Tabelle jetzt ganz mutig mit 3 Zeilen - alles in einem Batch-Job .... funktioniert - das Increment wird jeweils hochgesetzt - aber trotzdem kommt die Fehlermeldung. :shock:

Eine weitere Zeile hinzugefügt in einem separaten Batch-Job - nur die Fehlermeldung.


MFG,
speedy
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#8 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von tracer »

Du bist ja immer noch auf Deutsch, das macht es keinen Spass zu lesen.
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#9 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von speedy »

tracer hat geschrieben:Du bist ja immer noch auf Deutsch, das macht es keinen Spass zu lesen.
Die englische Fehlermeldung hab ich dir doch extra ganz oben eingefügt. Oder soll ich jetzt meinen Text auch noch auf Englisch übersetzen ?


MFG,
speedy
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#10 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von tracer »

speedy hat geschrieben:Oder soll ich jetzt meinen Text auch noch auf Englisch übersetzen ?
Stell Dein System doch mal auf Standard um, wer in der IT nutzt lokalisierte Versionen?
Benutzeravatar
adrock
Beiträge: 1527
Registriert: 02.04.2008 11:00:26
Wohnort: Berlin

#11 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von adrock »

...führst Du die ganzen SQL-Statements jetzt von Java aus oder über den SQL Server Manager?

Ciao...
Markus

EDIT: Habe gesehen im SQL mgr. funktioniert es... sehr merkwürdig.

Stryker F-27Q Titan X50E Pterodactyl
Diverse FPV Copter
RC: MC-20 HoTT
speedy
Beiträge: 9028
Registriert: 22.10.2004 10:45:57
Wohnort: Stuttgart
Kontaktdaten:

#12 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von speedy »

tracer hat geschrieben:Stell Dein System doch mal auf Standard um, wer in der IT nutzt lokalisierte Versionen?
Die englische Version (runde 500 MB) muß ich erst runterladen und installieren. Außerdem ist es mir lieber, wenn ich bei Problemen oder in der Hilfe zum SQ nicht erst noch kapieren muß, was er von mir will - und da tue ich mich dann halt in meiner Muttersprache einfacher.
adrock hat geschrieben:...führst Du die ganzen SQL-Statements jetzt von Java aus oder über den SQL Server Manager?
Immer aus dem Java-Prog heraus - weil damit funktioniert es ja nicht.


MFG,
speedy
Benutzeravatar
tracer
Operator
Operator
Beiträge: 63851
Registriert: 18.08.2004 18:50:03
Wohnort: Kollmar
Has thanked: 5 times
Been thanked: 4 times
Kontaktdaten:

#13 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von tracer »

speedy hat geschrieben:Außerdem ist es mir lieber, wenn ich bei Problemen oder in der Hilfe zum SQ nicht erst noch kapieren muß, was er von mir will - und da tue ich mich dann halt in meiner Muttersprache einfacher.
Genau aus dem Grund setzt sogar MS selber immer die englischen Versionen auf.
Schau doch mal bei Fehlermeldungen auf nem Server in die Hilfe Datei: Englisch
TechNet: Englisch
Knowledge Base: Englisch
fireball

#14 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von fireball »

Funktionierts dem im SQL-Server Manager (ist der in der Express-Edition überhaupt dabei?) oder im Zweifelsfall am osql-Prompt?
Zuletzt geändert von fireball am 13.02.2009 15:23:41, insgesamt 1-mal geändert.
Benutzeravatar
adrock
Beiträge: 1527
Registriert: 02.04.2008 11:00:26
Wohnort: Berlin

#15 Re: Java & MS SQL - mal ein Problem für einen Profi

Beitrag von adrock »

tracer hat geschrieben: Genau aus dem Grund setzt sogar MS selber immer die englischen Versionen auf.
Schau doch mal bei Fehlermeldungen auf nem Server in die Hilfe Datei: Englisch
TechNet: Englisch
Knowledge Base: Englisch
Ja, die deutschen Knowlegde Base ist ein Witz... automatische Übersetzungen, die sind höchstens zur Erheiterung brauchbar :x Genau da liegt gerade oft ein Problem: Die MS-Suppe schmeisst irgendeine deutsche Fehlermeldung raus und man darf sich dann erstmal überlegen, wonach man in der englischen KB suchen muss :roll:

Ciao...
Markus

Stryker F-27Q Titan X50E Pterodactyl
Diverse FPV Copter
RC: MC-20 HoTT
Antworten

Zurück zu „Klönschnack“