# Keine leeren Felder bei Access



## Waldi (31. Jan 2006)

Hallo Java Gemeinde

Ich habe eine Oberfläche für eine Access Datenbank programmiert. Wenn ich Daten hinzufügen möchte, benutze ich das PreparedStatement was auch wunderbar funktioniert. Nun ist es so das in meinem Formular nicht alle Felder Pflichtfelder sind. Wenn ich jetzt ein Feld leer lasse wird mir ein SQLException geworfen das dass Feld xyz keine Zeichenfolge der länge null sein darf. Der Datensatz wird natürlich nicht angefügt. In Access ist eindeutig eingestellt das dass Feld xyz keine Eingabe erfordert.

Was kann man da machen??

MfG

Waldi


----------



## bronks (31. Jan 2006)

Zeig mal den Quälcode mit dem SQL ...


----------



## Timmah (31. Jan 2006)

Du könntest den SQL-Befehl so umstellen, dass er die Spalten in der Tabelle der DB manuell setzt.

Oder du prüfst vorher ab, ob die Variablen, die du reinschreiben willst, leer sind, und fügst dann "" ein.


----------



## Waldi (31. Jan 2006)

```
// Methode zum Aufbauen der Datenbankverbindung
	    	FktVerbAufb.fktVerbAufb();

	    	
	    	String sQuery1 = "INSERT INTO Lager ( LName, Firma, LFirma, LStraße, LPLZ, LOrt, LTelNr, LFaxNr, 
LAnspPart, Abkürzung, Bemerkung, BemerkungFB, Warenannahme )SELECT ?,?,?,?,?,?,?,?,?,?,?,?,?;";
	    	String sQuery2 = "INSERT INTO Lagerauswahl (Land, Lager) SELECT ?, ?"; 
	    	
	    	
	    	// Statement erzeugen
	    	PreparedStatement psStatement1 = FktVerbAufb.verbindung.prepareStatement(sQuery1);
	    	PreparedStatement psStatement2 = FktVerbAufb.verbindung.prepareStatement(sQuery2);
	    		    	
	    	//Werte für Spalten festlegen
	    	psStatement1.setString(1, sLName);
	    	psStatement1.setInt(2, iFirma);
	    	psStatement1.setString(3, sLFirma);
	    	psStatement1.setString(4, sLStraße);
	    	psStatement1.setString(5, sLPLZ);
	    	psStatement1.setString(6, sLOrt);
	    	psStatement1.setString(7, sLTelNr);
	    	psStatement1.setString(8, sLFaxNr);
	    	psStatement1.setString(9, sLAnspPart);
	    	psStatement1.setString(10, sAbkürzung);
	    	psStatement1.setString(11, sBemerkung);
	    	psStatement1.setString(12, sBemerkungFB);
	    	psStatement1.setString(13, sWarenannahme);
	    	
	    	psStatement1.executeUpdate();
	    	psStatement1.close();
	    	
	    	psStatement2.setInt(1, iLLand);
	    	
	    	int iLager = GetID.iGetID("SELECT Lager.LName, Lager.ID FROM Lager WHERE (((Lager.LName)= ? ));",sLName);
	    	System.out.println(sLName);
	    	System.out.println(iLager);
	    		    
	    	while (iLager <=0) 
	    	{
	    		iLager = GetID.iGetID("SELECT Lager.LName, Lager.ID FROM Lager WHERE (((Lager.LName)= ? ));",sLName);
			}
	    	
	    	psStatement2.setInt(2, iLager);
	    	
	    	psStatement2.executeUpdate();

	    	FktVerbAufb.fktVerbTrennen();
```

So hier mal den Code.

@Timmah: Ok ich probiers gleich aus. Aber komisch ist das schon oder?? Ich meine das ist doch kein Problem wenn da einfach nix reingeschrieben wird. Dein erster Lösungsvorschlag kann ich  nicht nachvollziehen: Die Tabelle mit den Spaltennamen sind ja schon fertig.


----------



## Guest (1. Feb 2006)

"INSERT INTO Lagerauswahl (Land, Lager) *SELECT* ?, ?"  :autsch: 

Versuche es zuerst mit korrektem SQL

"INSERT INTO Lagerauswahl (Land, Lager) *VALUES*(?, ?)"  

Gleiches mit der anderen Anweisung.


----------



## SamHotte (1. Feb 2006)

Nach meiner Erfahrung mag Access keine Nullwerte via JDBC ... schreib einen leeren String rein, dann passts.


----------



## Waldi (7. Feb 2006)

Hab ich probiert. Funzt ned. Ich habe beim laden des Fensters alle Felder auf .setText("") gesetzt. Danach schreibe ich die Werte rein und fürhre die SQL Anweisung aus. Wieder der gleiche Fehler. Oder hab ich ein Denkfehler??


----------



## SamHotte (7. Feb 2006)

Hast du auch probiert, die SQL-Anweisungen so wie "Gast" schrieb umzubauen? Wie genau lautet die Fehlermeldung?


----------



## Waldi (7. Feb 2006)

ist die gleiche Fehlermeldung wie oben beschrieben. Ja ich habe die SQL anweisung umgebaut wie Gast beschrieben. Das gleiche resultat. Hatte schon mal den Quellcode gepostet das problem ist nur das Forum hat ned so ganz funktioniert. Ich poste morgen den Code nochmal ausführlich


----------



## Waldi (8. Feb 2006)

Das hier list die Textfelder in Stringvariablen (verkürzt)


```
String sLagerName = jTextFieldLgrName.getText();
					String sLagerStraße = jTextFieldLgrStraße.getText();
					String sLagerPLZ = jTextFieldLgrPlz.getText();
```

Und das ist der Code der gleich nach öffnen des Fensters gestartet wird (verkürzt)


```
this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowOpened(java.awt.event.WindowEvent e) {
				System.out.println("windowOpened()"); // TODO Auto-generated Event stub windowOpened()
				jTextFieldLagerFirma.setText("");
				jTextFieldLgrName.setText("");
				jTextFieldLgrStraße.setText("");
```

Und das hier schreibt den ganzen krempel in die DB. (ungekürzt)


```
String sQuery1 = "INSERT INTO Lager ( LName, Firma, LFirma, LStraße, LPLZ, LOrt, LTelNr, LFaxNr, LAnspPart, Abkürzung, Bemerkung, BemerkungFB, Warenannahme )VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?);";
	    	String sQuery2 = "INSERT INTO Lagerauswahl (Land, Lager) VALUES (?,?)"; 
	    	
	    	
	    	// Statement erzeugen
	    	PreparedStatement psStatement1 = FktVerbAufb.verbindung.prepareStatement(sQuery1);
	    	PreparedStatement psStatement2 = FktVerbAufb.verbindung.prepareStatement(sQuery2);
	    		    	
	    	//Werte für Spalten festlegen
	    	psStatement1.setString(1, sLName);
	    	psStatement1.setInt(2, iFirma);
	    	psStatement1.setString(3, sLFirma);
	    	psStatement1.setString(4, sLStraße);
	    	psStatement1.setString(5, sLPLZ);
	    	psStatement1.setString(6, sLOrt);
	    	psStatement1.setString(7, sLTelNr);
	    	psStatement1.setString(8, sLFaxNr);
	    	psStatement1.setString(9, sLAnspPart);
	    	psStatement1.setString(10, sAbkürzung);
	    	psStatement1.setString(11, sBemerkung);
	    	psStatement1.setString(12, sBemerkungFB);
	    	psStatement1.setString(13, sWarenannahme);
	    	
	    	psStatement1.executeUpdate();
	    	psStatement1.close();
	    	
	    	psStatement2.setInt(1, iLLand);
	    	
	    	int iLager = GetID.iGetID("SELECT Lager.LName, Lager.ID FROM Lager WHERE (((Lager.LName)= ? ));",sLName);
	    	System.out.println(sLName);
	    	System.out.println(iLager);
	    		    
	    	while (iLager <=0) 
	    	{
	    		iLager = GetID.iGetID("SELECT Lager.LName, Lager.ID FROM Lager WHERE (((Lager.LName)= ? ));",sLName);
			}
	    	
	    	psStatement2.setInt(2, iLager);
	    	
	    	psStatement2.executeUpdate();
```

Nachtrag: Fehlermeldung


```
INFO: Verbindung zur Datenbank erfolgreich durchgefuehrt.
**************************************************************************
ERROR: Datenbankfehler: [Microsoft][ODBC Microsoft Access Driver] Feld 'Lager.Abkürzung' darf keine Zeichenfolge der Länge Null sein.
--------------------------------------------------------------------------
java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] Feld 'Lager.Abkürzung' darf keine Zeichenfolge der Länge Null sein.
	at sun.jdbc.odbc.JdbcOdbc.createSQLException(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.standardError(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbc.SQLExecute(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcPreparedStatement.execute(Unknown Source)
	at sun.jdbc.odbc.JdbcOdbcPreparedStatement.executeUpdate(Unknown Source)
	at Funktionen.FktAnlegen.setLager(FktAnlegen.java:88)
	at Fenster.LagerAnlegen$2.actionPerformed(LagerAnlegen.java:546)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
**************************************************************************
```


----------



## SamHotte (8. Feb 2006)

Typischer Fall von schlechter Fehlermeldung. Ersetze das "ü" durch nicht-Umlaut, SQL mag keine Sonderzeichen. Möglicherweise ist das bereits die Lösung ...
[edit] --> das "ü" in "Lager.Abkürzung" ist gemeint  [/edit]


----------



## Waldi (8. Feb 2006)

Da gibt es ein paar Wiedersprüche:

1. Die Datenbank ist schon fertig und kann ned so einfach geändert werden. Auch wegen den ganzen anderen SQL Commands die sich darauf beziehen. 

2. Wenn ich ein anderes Feld leer lasse dann kommt der Fehler mit diesem Feld. 

3. Wenn ich das Feld  Abkürzungen fülle dann kommt kein fehler. Wie gesagt tritt nur dann auf wenn das Feld leer ist. 

Aber gibts sowas komisches????


----------



## Bleiglanz (9. Feb 2006)

gibts vielleicht einen Constraint der Form LENGTH>0

=> schau mal in Access die Tabellendefinition genau an


----------



## SamHotte (9. Feb 2006)

Hmm. Für mich sehen die Zuweisungen oben so aus, als ob du in "Abkürzung" nach wie vor eine NULL hineinschreiben möchtest; obwohl das eigentlich funktionieren müsste, habe ich mit Access jedesmal Probleme bei sowas gehabt. Teste doch mal, ob dein SQL-Befehl mit "VALUES ("","","", ...) funktionieren würde.
Wenn alle Stricke reißen: man kann über einen (mir leider momentan nicht im Kopfe seienden) bestimmten Befehl eine *sehr* ausführliche Protokollierung der Datenbank-Kommunikation einschalten - vielleicht weiß hier ja jemand diesen Befehl noch?


----------



## Waldi (9. Feb 2006)

So hab jetzt das Problem gelöst: Man muss in der Access Datenbank leere Zeichenfolge auf JA setzen. Leider ist mir die Sache nie aufgefallen weil ich immer nach Eingabe erforderlich gesucht habe.

@SamHotte: Ich weise den Feldern beim Start des Fensters schon "" zu. danach wird dies genommen und zur Datenbank übertragen. Auf jeden fall Funktioniert die Sache jetzt.


----------



## SamHotte (9. Feb 2006)

Ah, ok - das mit "Leere Zeichenfolge" müsste eigentlich standardmäßig auf "Ja" stehen, daher hatte ich die Fehlerquelle noch nicht. Sorry!


----------

