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

zhermann

Mitglied
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:
Code:
    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:

Code:
    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

Super-Moderator
Mitarbeiter
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

Mitglied
Code:
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)
 

zhermann

Mitglied
Code:
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)
 

zhermann

Mitglied
So sieht der Datensatz aus:
Code:
[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

Super-Moderator
Mitarbeiter
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...
 

mrBrown

Super-Moderator
Mitarbeiter
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...
 
Zuletzt bearbeitet:

zhermann

Mitglied
@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:
Code:
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

Super-Moderator
Mitarbeiter
wenn ich das Feld wie folgt vorher prüfe:
Code:
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.[/USER]

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]
 
Zuletzt bearbeitet:

thet1983

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

@zhermann:
versuch mal sowas in der art: !! sollte nur als anstoss dienen!!
Java:
// 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

Mitglied
Ich hab den Fehler gefunden: :D

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.
 

zhermann

Mitglied
Jepp. Nach dem ich unter phpmyAdmin das Feld nochmal bearbeitet habe und alles wie siehe Bild eingestellt und gespeichert habe.
10-10-png.10270
 

Anhänge

  • 10.10.png
    10.10.png
    8,7 KB · Aufrufe: 491

zhermann

Mitglied
Nö nö, so schnell kommst Du mir nicht da raus. :D:p
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.
Code:
    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:

Code:
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

Super-Moderator
Mitarbeiter
Nö nö, so schnell kommst Du mir nicht da raus. :D:p
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.
 
Zuletzt bearbeitet:

zhermann

Mitglied
So richtig kapieren tue ich es im Moment nicht:

Im Moment fülle ich das StringArray sqlData so:
Code:
           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
Code:
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

Code:
String[] sqlData = new String[20];

so umschreiben:

Code:
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:

Code:
    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
Code:
Pair<Integer,Object> pair : sqlData
für sqlData rum.
 

mrBrown

Super-Moderator
Mitarbeiter
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

Mitglied
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

Top Contributor
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."
 

thet1983

Top Contributor
nur ein 'blödes' Beispiel:
Java:
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...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Data truncation Incorrect datetime value Datenbankprogrammierung 2
T Problem mit Data truncation Datenbankprogrammierung 3
T Cast-Fehler: Spring Data exists.... boolean??? Datenbankprogrammierung 1
sonalim21 Data from one Excel workbook in Alteryx Datenbankprogrammierung 0
O HOW TO INSERT PRIMARY INTO ANOTHER TABLE AND USE IT AS FOREIGN KEY TO DISPLAY DATA IN A RELATIONSHIP Datenbankprogrammierung 3
L LOAD DATA INFILE mit Oracle Datenbankprogrammierung 24
Dimax MySQL LOAD DATA INFILE -id aus dem Code und Rest aus dem File. Datenbankprogrammierung 5
B MySQL Data Tools Plattform - "Database Connections" findet den Treiber nicht Datenbankprogrammierung 1
B JDBC-Connection: Data source name too long Datenbankprogrammierung 3
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
E falscher Befehl executeQuery() issue data Datenbankprogrammierung 12
K MySQL Load Data InFile Datenbankprogrammierung 7
I java.sql.SQLException: No data found Datenbankprogrammierung 3
Dragonfire Entwurfsfragen zur Anbindung an einer MySQL DB - Klassenstruktur zum Data Model Datenbankprogrammierung 5
M Mit Java Data Objects Daten in einer MySQL-Datenbank manipul Datenbankprogrammierung 9
M java.sql.SQLException: No data found Datenbankprogrammierung 9
G Data Truncated Datenbankprogrammierung 23
R MySQL denies access to data source - java.sql.SQLException Datenbankprogrammierung 14
G NULL-data processing. Datenbankprogrammierung 11

Ähnliche Java Themen

Neue Themen


Oben