# Data truncation: Incorrect date value: 'null' for column



## zhermann (10. Okt 2017)

Hallo Leute,

ich steh/sitze jetzt seit 3 Tagen vor dem Problem "Incorrect date value...."

DB:  mySQL
Betroffene Feld:
      Name:      ERLEDIGT_AM
      Typ:          Date
      NULL:       ja
      Standard: NULL

Um die Daten in die SQL DB zu schreiben habe ich folgenden SQLSTR:

```
static String strSQL_saveSAPImport =
       "INSERT INTO SAPIMPORT ("
               + "MELDUNG,"
               + "MASSNAHMENCODE,"
               + "MASS_CODE_TXT,"
               + "CODIERUNG,"
               + "CODIER_CODE_TXT,"
               + "TECHN_PLATZ,"
               + "AUSFUEHRENDER,"
               + "ANGELEGT_VON,"
               + "ANGELEGT_AM,"
               + "ANGELEGT_UM,"
               + "ERLEDIGT_VON,"
               + "ERLEDIGT_AM,"
               + "ERLEDG_ZEIT,"
               + "BEZUGSZEIT,"
               + "GEAENDERT_AM,"
               + "GEAENDERT_VON,"
               + "GEAENDERT_UM,"
               + "BESCHREIBUNG,"
               + "EQUIPMENT,IMPORTID)"
               +"VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
```

Der Import wird dann wie folgt ausgeführt:


```
private void impData() {
       String name = this.getImportName();   // Name für das Speichern des Import erfragen (DIALOG)
       if (!name.equals(null)) {
           
           // Import speichern
           String[] sqlData = new String[1];
           sqlData[0] = name;
           this.appDB.updateSQL(sqlData, SQLCommand.strSQL_saveImport);
           sqlData = null;
           sqlData = new String[20];
           for (ImportRecord item : this.importTable.getItems()) {
               
               sqlData[0] = item.getF1_Meldung().toString();
               sqlData[1] = item.getF2_Massnahmencode().toString();
               sqlData[2] = item.getF3_Mass_Code_Txt().toString();
               sqlData[3] = item.getF4_Codierung().toString();
               sqlData[4] = item.getF5_Codier_Code_Txt().toString();
               sqlData[5] = item.getF6_Tech_Platz().toString();
               sqlData[6] = item.getF7_Ausfuehrender().toString();
               sqlData[7] = item.getF8_Angelegt_von().toString();
               sqlData[8] = item.getF9_Angelegt_am().toString();
               sqlData[9] = item.getF10_Angelegt_um().toString();
               sqlData[10] = item.getF11_Erledigt_von().toString();
               sqlData[11] = item.getF12_Erledigt_am().toString();
               sqlData[12] = item.getF13_Erledg_Zeit().toString();
               sqlData[13] = item.getF14_Bezugszeit().toString();
               sqlData[14] = item.getF15_Geaendert_aon().toString();
               sqlData[15] = item.getF16_Geaendert_von().toString();
               sqlData[16] = item.getF17_Geaendert_um().toString();
               sqlData[17] = item.getF18_Beschreibung().toString();
               sqlData[18] = item.getF19_Equipment().toString();
               sqlData[19] = "35";
               
               this.updateSQL(sqlData, SQLCommand.strSQL_saveSAPImport);
           }
       }
   }

   public void updateSQL(String[] sqlData, SQLCommand sqlCommand) {
       try {
           String command = null;
           switch(sqlCommand) {
               case strSQL_saveSAPImport:
                   command = DBInterface.strSQL_saveSAPImport;
                   break;
               case strSQL_saveImport:
                   command = DBInterface.strSQL_saveImport;
                   break;
               case strSQL_saveReport:
                   command = DBInterface.strSQL_saveImport;
                   break;
               default:
                   break;
           }
           if (!command.equals(null)) {
               PreparedStatement dbexecute =  (PreparedStatement) this.dbConnect.prepareStatement(command);
               for (int i = 0; i < sqlData.length; i++) {
                   dbexecute.setString(i+1, sqlData[i]);
               }
               dbexecute.executeUpdate();
           }
       } catch (SQLException e) {
           e.printStackTrace();
       }
   }
```

Soweit alles gut, *ABER* wenn das Feld "_*getF12_Erledigt_am*_" keinen Wert enthält, schmiert mir dbexecute ab.

Wie kann ich aber trotzdem einen Datensatz in die DB schreiben, wenn das Feld "getF12..." nicht belegt/leer/null/ ist? Wenn ich den SQL Befehl über phpMyAdmin mache funktioniert er. 

Gruß ZHermann


----------



## mrBrown (10. Okt 2017)

Sicher, dass du eine "Data truncation: Incorrect date value: 'null' for column" und keine NullPointerException bekommst
toString sollte eine NPE werfen, wenn das Feld null ist


----------



## zhermann (10. Okt 2017)

```
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'ERLEDIGT_AM' at row 1
   at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3971)
   at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
   at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
   at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
   at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2487)
   at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
   at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
```


----------



## mrBrown (10. Okt 2017)

Der Interessante Teil der Exception fehlt 

BTW: Wie sieht "nicht belegt/leer/null" bei diesem Feld aus?


----------



## zhermann (10. Okt 2017)

```
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Incorrect date value: 'null' for column 'ERLEDIGT_AM' at row 1
   at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3971)
   at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3909)
   at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2527)
   at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2680)
   at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2487)
   at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1858)
   at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2079)
   at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2013)
   at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5104)
   at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1998)
   at application.database.DBConnection.updateSQL(DBConnection.java:94)
   at application.controller.SAPImportController.impData(SAPImportController.java:267)
   at application.controller.SAPImportController.btnStartImport(SAPImportController.java:344)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
   at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at sun.reflect.misc.Trampoline.invoke(Unknown Source)
   at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at sun.reflect.misc.MethodUtil.invoke(Unknown Source)
   at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
   at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
   at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
   at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
   at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
   at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
   at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
   at javafx.event.Event.fireEvent(Event.java:198)
   at javafx.scene.Node.fireEvent(Node.java:8413)
   at javafx.scene.control.Button.fire(Button.java:185)
   at com.sun.javafx.scene.control.behavior.ButtonBehavior.mouseReleased(ButtonBehavior.java:182)
   at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:96)
   at com.sun.javafx.scene.control.skin.BehaviorSkinBase$1.handle(BehaviorSkinBase.java:89)
   at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
   at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
   at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
   at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
   at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
   at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
   at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
   at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
   at javafx.event.Event.fireEvent(Event.java:198)
   at javafx.scene.Scene$MouseHandler.process(Scene.java:3757)
   at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
   at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
   at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
   at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
   at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
   at java.security.AccessController.doPrivileged(Native Method)
   at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$354(GlassViewEventHandler.java:417)
   at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
   at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
   at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
   at com.sun.glass.ui.View.notifyMouse(View.java:937)
   at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
   at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
   at java.lang.Thread.run(Unknown Source)
```


----------



## mrBrown (10. Okt 2017)

Wie sieht "nicht belegt/leer/null" bei diesem Feld aus?


----------



## zhermann (10. Okt 2017)

So sieht der Datensatz aus:

```
[300198320, 510, BAG IT, 20, Service Anforderung, BAG-G-SCZ-PA_, LUTZ, LUTZ, 2017-01-02, 09:34:17, , , , 09:34:17, null, , null, Schichtplanung 2018, 0, 35]
```
An der 12 Stelle wäre das betroffene Feld. Und so übergebe ich es auch an den SQL Server.


----------



## mrBrown (10. Okt 2017)

Wie sieht denn in dem Java-Objeckt das Feld aus, wenn es "nicht belegt/leer/null" ist?

Wie die Tabelle oder ein funktionierender Insert aussieht ist egal, da gibts ja keinen Fehler...


----------



## thet1983 (10. Okt 2017)

zhermann hat gesagt.:


> Typ: Date





zhermann hat gesagt.:


> dbexecute.setString(i+1, sqlData_);_


das passt nicht ganz zusammen!!
du willst nur strings reinschmeissen... das funktioniert nicht...

wenn die db ein date verlangt, dann musst du dieser auch ein java.sql.Date liefern
wenn du einen wert hast der 'null' ist dann schau dir bitte mal java.sql.Types.* an


----------



## mrBrown (10. Okt 2017)

thet1983 hat gesagt.:


> das passt nicht ganz zusammen!!
> du willst nur strings reinschmeissen... das funktioniert nicht...
> 
> wenn die db ein date verlangt, dann musst du dieser auch ein java.sql.Date liefern
> wenn du einen wert hast der 'null' ist dann schau dir bitte mal java.sql.Types.* an


afaik funktioniert das auch mit passend formatierten Strings.

`null` (im Java-Sinn) ist der Wert bei ihm aber zumindest auch nicht...


----------



## zhermann (10. Okt 2017)

@thet1983:
Das leuchtet ein!
Aber wie kann ich dann eine allgemeingülte Routine erstellen, wo ich per parameter den SQL String aufrufe und befülle?
Ich dachte, das die Typ-Formatierung bei prepareStatement automatisch erfolgt. Ich habe ja auch Felder, welche Integer sind und ich übergebe einfach einen String als Wert. Da ist er zufrieden und mach es einfach.

@mrbroen:

wenn ich das Feld wie folgt vorher prüfe:

```
sqlData[11] = (item.getF12_Erledigt_am() != null ? item.getF12_Erledigt_am().toString(): "" );
```
Sollte es doch bei null leer sein. In der TableView stelle ich sicher das das Feld null ist, wenn der Importwert für das Feld leer ist.

Aber auch mal zum Versuch 0000-00-00 einzufügen bei null funktioniert nicht.


----------



## mrBrown (10. Okt 2017)

zhermann hat gesagt.:


> wenn ich das Feld wie folgt vorher prüfe:
> 
> ```
> sqlData[11] = (item.getF12_Erledigt_am() != null ? item.getF12_Erledigt_am().toString(): "" );
> ...



Dein zu erst geposteter Code in Verbindung mit der Exception schließt `null` für das Feld aus.

Also noch mal die Frage: Was steht drin in dem Feld? Und welchen Typ hat es - String, Date, irgendwas abstruses?


Und ja - mit dem jetzigen Codeschnipsel wäre es entweder das Ergebnis oder bei null ein leerer String. `null` kam aber eben in deinem vorherigem Code nicht vor.[/user]


----------



## thet1983 (10. Okt 2017)

@mrBrown: wenn ich die Typen parse dann funktioniert es...

@zhermann:
versuch mal sowas in der art: !! sollte nur als anstoss dienen!!

```
// Pair muss nicht benutzt werden ( eine collection die dem KeyValue Prinzip folgt )
public int executeSqlStatement(String sqlCommand, Pair<Integer,Object>...parameter){
   int result = 0;
   try{
      connection = /* connection to db */
      PreparedStatement pstmt = connection.prepareStatement(sqlCommand);
      // so könnte man die einzelnen pairs durchlaufen...
      for(Pair<integer,object> pair : parameter){
           int key = pair.getKey();
          // wobei getValue() richtig überprüft werden sollte..
           pstmt.setObject(key, pair.getValue() == null? java.sql.Types.Null : pair.getValue());
      }
      result = pstmt.executeupdate();
      connection.close()
   } catch( /* Exceptions fangen */ ){
      // rollback
   }
   return result;
}

// aufruf ware
boolean ok = executeSqlStatement("<dml statement>", new Pair<>(1,"meinName"), new Pair<>(2,123456));
```


----------



## zhermann (10. Okt 2017)

Ich hab den Fehler gefunden: 

Lag nicht am Java und an meiner Routine, sondern in der DB.
Hab das Feld mal über phpmyAdmin bearbeitet und gespeichert. Danach hat er es ohne beanstandung gemacht.
Ich vermute, das er beim erstellen der DB/Table, was nicht richtig abgespeichert hat.


----------



## thet1983 (10. Okt 2017)

der import hat funktioniert? trotz dem date feld??


----------



## zhermann (10. Okt 2017)

Jepp. Nach dem ich unter phpmyAdmin das Feld nochmal bearbeitet habe und alles wie siehe Bild eingestellt und gespeichert habe.


----------



## thet1983 (10. Okt 2017)

hmm.... dann vergiss alles was ich gesagt habe....und hör nie wieder auf mich...


----------



## zhermann (10. Okt 2017)

Nö nö, so schnell kommst Du mir nicht da raus. 
Dein Vorschlag mit der allgemeingültigen Routine sieht interresant aus.
Wenn ich das aber richtig verstanden habe, muss ich jeden einzelnen Wert als Parameter übergeben, oder?
Ich wollte eigentlich eine Routine haben, wo ich per Array mir das PreperedStatment zusammen baue. Daher gibt es ja den zweiten Parameter "SQLCommand sqlCommand", welchen ich fest im interface definiert habe.

```
public void updateSQL(String[] sqlData, SQLCommand sqlCommand) {
       try {
           String command = null;
           switch(sqlCommand) {
               case strSQL_saveSAPImport:
                   command = DBInterface.strSQL_saveSAPImport;
                   break;
               case strSQL_saveImport:
                   command = DBInterface.strSQL_saveImport;
                   break;
               case strSQL_saveReport:
                   command = DBInterface.strSQL_saveImport;
                   break;
               default:
                   break;
           }
           if (!command.equals(null)) {
               PreparedStatement dbexecute =  (PreparedStatement) this.dbConnect.prepareStatement(command);
               for (int i = 0; i < sqlData.length; i++) {
                   dbexecute.setString(i+1, sqlData[i]);
               }
               System.out.println(dbexecute.getParameterMetaData());
               dbexecute.executeUpdate();
           }
       } catch (SQLException e) {
           e.printStackTrace();
       }
   }
```

Interface:


```
package application.interfaces;

import java.sql.DriverManager;
public interface DBInterface {

   public void setDBPath(String DBPath);
   public String getDBPath();
   public void setDBName(String DBName);
   public String getDBName();
   public void setDBUser(String DBUser);
   public String getDBUser();
   public void setDBPassword(String DBPassword);
   public String getDBPassword();
   public void setDBUrl(String DBUrl);
   public String getDBUrl();
   public void setDBTyp(String DBTyp);
   public String getDBTyp();
   public void setDBDriver(String DBDriver);
   public DriverManager getDBDriver();
  
   public enum SQLCommand {
       strSQL_saveSAPImport,
       strSQL_saveImport,
       strSQL_saveReport,
       strSQL_queryLastImport,
       strSQL_queryLastReport,
       strSQL_queryImports,
       strSQL_queryReports
   }
  
  
   static String strSQL_saveSAPImport =
       "INSERT INTO SAPIMPORT ("
               + "MELDUNG,"
               + "MASSNAHMENCODE,"
               + "MASS_CODE_TXT,"
               + "CODIERUNG,"
               + "CODIER_CODE_TXT,"
               + "TECHN_PLATZ,"
               + "AUSFUEHRENDER,"
               + "ANGELEGT_VON,"
               + "ANGELEGT_AM,"
               + "ANGELEGT_UM,"
               + "ERLEDIGT_VON,"
               + "ERLEDIGT_AM,"
               + "ERLEDG_ZEIT,"
               + "BEZUGSZEIT,"
               + "GEAENDERT_AM,"
               + "GEAENDERT_VON,"
               + "GEAENDERT_UM,"
               + "BESCHREIBUNG,"
               + "EQUIPMENT,"
               + "IMPORTID)"
               + " VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
  
   static String strSQL_saveImport =
       "INSERT INTO IMPORTS ("
           + "IMP_NAME) VALUES (?)";
  
   static String strSQL_saveReport =
       "INSERT INTO REPORTS ("
           + "REP_NAME) VALUES (?)";
  
  
   static String strSQL_queryImports =
       "SELECT * FROM `imports` ORDER BY IMP_ID ASC ";
  
   static String strSQL_queryLastImport = 
           "SELECT * FROM IMPORTS ORDER BY IMP_ID DESC LIMIT 1";
  
   static String strSQL_queryReports =
           "SELECT * FROM REPORTS ORDER BY REP_ID ASC";

   static String strSQL_queryLastReport =
           "SELECT * FROM REPORTS ORDER BY REP_ID LIMIT 1";

}
```


----------



## mrBrown (10. Okt 2017)

zhermann hat gesagt.:


> Nö nö, so schnell kommst Du mir nicht da raus.
> Dein Vorschlag mit der allgemeingültigen Routine sieht interresant aus.
> Wenn ich das aber richtig verstanden habe, muss ich jeden einzelnen Wert als Parameter übergeben, oder?
> Ich wollte eigentlich eine Routine haben, wo ich per Array mir das PreperedStatment zusammen baue. Daher gibt es ja den zweiten Parameter "SQLCommand sqlCommand", welchen ich fest im interface definiert habe.


Nein, du kannst den Code größtenteils so lassen, wie er bisher ist.
Du musst nur das `String[]` zu `Object[]` und `setString` zu `setObject` ändern.


----------



## thet1983 (10. Okt 2017)

solange dieser code funktioniert würde ich ihn lassen...


mrBrown hat gesagt.:


> Du musst nur das String[] zu Object[] und setString zu setObject[] ändern.


das würde ich ebenfalls empfehlen...


----------



## zhermann (10. Okt 2017)

OK, ich versuch es mal


----------



## zhermann (10. Okt 2017)

So richtig kapieren tue ich es im Moment nicht:

Im Moment fülle ich das StringArray sqlData so:

```
String[] sqlData = new String[20];
           for (ImportRecord item : this.importTable.getItems()) {
               
               sqlData[0] = item.getF1_Meldung().toString();
               sqlData[1] = item.getF2_Massnahmencode().toString();
               sqlData[2] = item.getF3_Mass_Code_Txt().toString();
               sqlData[3] = item.getF4_Codierung().toString();
               sqlData[4] = item.getF5_Codier_Code_Txt().toString();
               sqlData[5] = item.getF6_Tech_Platz().toString();
               sqlData[6] = item.getF7_Ausfuehrender().toString();
               sqlData[7] = item.getF8_Angelegt_von().toString();
               sqlData[8] = item.getF9_Angelegt_am().toString();
               sqlData[9] = item.getF10_Angelegt_um().toString();
               sqlData[10] = item.getF11_Erledigt_von().toString();
               sqlData[11] = (item.getF12_Erledigt_am() != null ? item.getF12_Erledigt_am().toString(): null );
               sqlData[12] = (item.getF13_Erledg_Zeit() != null ? item.getF13_Erledg_Zeit().toString(): null);
               sqlData[13] = item.getF14_Bezugszeit().toString();
               sqlData[14] = (item.getF15_Geaendert_aon() != null ? item.getF15_Geaendert_aon().toString(): null);
               sqlData[15] = item.getF16_Geaendert_von().toString();
               sqlData[16] = (item.getF17_Geaendert_um() != null ? item.getF17_Geaendert_um().toString(): null);
               sqlData[17] = item.getF18_Beschreibung().toString();
               sqlData[18] = item.getF19_Equipment().toString();
               
               // Letzten Import erfragen
               ResultSet rs = this.appDB.querySQL(SQLCommand.strSQL_queryLastImport);
               try {
                   rs.next();
                   System.out.println(rs.getString(1));
                   sqlData[19] = rs.getString(1);
               } catch (SQLException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
               this.appDB.updateSQL(sqlData, SQLCommand.strSQL_saveSAPImport);
           }
```

mit 

```
public void updateSQL(String[] sqlData, SQLCommand sqlCommand) {
       try {
           String command = null;
           switch(sqlCommand) {
               case strSQL_saveSAPImport:
                   command = DBInterface.strSQL_saveSAPImport;
                   break;
               case strSQL_saveImport:
                   command = DBInterface.strSQL_saveImport;
                   break;
               case strSQL_saveReport:
                   command = DBInterface.strSQL_saveImport;
                   break;
               default:
                   break;
           }
           if (!command.equals(null)) {
               PreparedStatement dbexecute =  (PreparedStatement) this.dbConnect.prepareStatement(command);
               for (int i = 0; i < sqlData.length; i++) {
                   dbexecute.setString(i+1, sqlData[i]);
               }
               System.out.println(dbexecute.getParameterMetaData());
               dbexecute.executeUpdate();
           }
       } catch (SQLException e) {
           e.printStackTrace();
       }
   }
```
speichere ich dann die Daten in die SQL DB

So wenn ich das richtig verstanden habe, muß ich


```
String[] sqlData = new String[20];
```

so umschreiben:


```
Object[] sqlData = new Object[20];
for (ImportRecord item : this.importTable.getItems()) {
               sqlData[0] = item.getF1_Meldung();

              ......

               // Letzten Import erfragen, um die ID mit dem Import abzuspeichern
               ResultSet rs = this.appDB.querySQL(SQLCommand.strSQL_queryLastImport);
               try {
                   rs.next();
                   System.out.println(rs.getString(1));
                   sqlData[19] = rs.getString(1);
               } catch (SQLException e) {
                   // TODO Auto-generated catch block
                   e.printStackTrace();
               }
               this.appDB.updateSQL(sqlData, SQLCommand.strSQL_saveSAPImport);
```

updateSQL wäre dann so:


```
public void updateSQL(Pair<Integer, Object> sqlData, SQLCommand sqlCommand) {
       try {
           String command = null;
           switch(sqlCommand) {
               case strSQL_saveSAPImport:
                   command = DBInterface.strSQL_saveSAPImport;
                   break;
               case strSQL_saveImport:
                   command = DBInterface.strSQL_saveImport;
                   break;
               case strSQL_saveReport:
                   command = DBInterface.strSQL_saveImport;
                   break;
               default:
                   break;
           }
           if (!command.equals(null)) {
               PreparedStatement dbexecute =  (PreparedStatement) this.dbConnect.prepareStatement(command);
               for(Pair<Integer,Object> pair : sqlData){
                   int key = pair.getKey();
                   dbexecute.setObject(pair.getKey(), pair.getValue() == null ? java.sql.Types.NULL : pair.getValue());
                 }
/*               
               for (int i = 0; i < sqlData.length; i++) {
                   dbexecute.setString(i+1, sqlData[i]);
               }
*/
               System.out.println(dbexecute.getParameterMetaData());
               dbexecute.executeUpdate();
           }
       } catch (SQLException e) {
           e.printStackTrace();
       }
   }
```

Nur mekert er mir bei 
	
	
	
	





```
Pair<Integer,Object> pair : sqlData
```
 für sqlData rum.


----------



## mrBrown (10. Okt 2017)

mrBrown hat gesagt.:


> Du musst *NUR* das `String[]` zu `Object[]` und `setString` zu `setObject` ändern.


----------



## zhermann (10. Okt 2017)

Many Sorry, hab irgend wie einen Hirnknoten.
Ich kapiers es nicht.


----------



## mrBrown (10. Okt 2017)

Wenn du nicht weißt, was der Code, den du einfügst, überhaupt macht, warum fügst du ihn dann ein? 


In den beiden von dir geposteten  Methoden kommt `String[] sqlData` vor, dessen Typ musst du einfach zu `Object[] sqlData` ändern.
In `updateSql` musst du `dbexecute.setString(i+1, sqlData[i]);` zu `dbexecute.setObject(i+1, sqlData[i]);` ändern.[/i][/i]


----------



## zhermann (10. Okt 2017)

Ok, jetzt hab ich es.
Jetzt muss ich noch eine dumme Frage stellen. Da ich ja Anfänger bin, was ist der Vorteil von Object gegenüber String?


----------



## thet1983 (10. Okt 2017)

String
Integer
Double
etc
leiten alle von Object ab


----------



## zhermann (10. Okt 2017)

Ich würde sagen Object ist variabler?  Ich bin nicht explizit festgelegt auf Sting, Number etc.?


----------



## thet1983 (10. Okt 2017)

schau mal hier
" Class Object is the *root* of the *class hierarchy*. *Every class has Object as a superclass*. All objects, including arrays, implement the methods of this class."


----------



## zhermann (10. Okt 2017)

ok. Jetzt denke ich, ich habs verstanden. Danke!


----------



## thet1983 (10. Okt 2017)

nur ein 'blödes' Beispiel:

```
public static Object getValue(Object object){
    return object;
}
// demo
String name = (String)getValue("Thomas"); // out: Thomas
int number = (int) getValue(1234); // out: 1234
double price = (double) getValue(12.34); // out: 12.34
```

du kannst alles rein schmeissen, nur musst du dann alles auf den Typen den du benötigst casten...


----------



## zhermann (10. Okt 2017)

Super danke, an blöden einfachen Beispielen lernt man(n) schneller und mehr


----------

