PDA

Visualizza la versione completa : Inserimento data nel database errato


felx
28-01-2020, 12:52
Salve a tutti, ho un problema nell'inserimento di una data nel mio database my sql. Vengo al dunque
ho questa porzione di codice:



else if(columnClass == Date.class) {
if(rs.getDate(columnNames[i])!=Date.[I]valueOf((String.valueOf(data)))) {
System.[I]out.println("Date value of "+Date.valueOf(String.valueOf(data[i]))+" date column: "+rs.getDate(columnNames[i]));
rs.updateDate(columnNames[i], Date.valueOf((String.valueOf(data[i]))));
}
che mi verifica che sia cambiata la data dalla rs ed il valore che ho nella jtable. Tuttavia ho due problemi. il primo che entra nel primo if anche quando la data non cambiata. ed il secondo alquanto strano che mi scrive la data nel db a meno di un giorno "2020-01-02" diventa "2020-01-01" non riesco a capire il problema. Nella println a video ho i due valori "uguali"

andbin
28-01-2020, 13:30
Tuttavia ho due problemi. il primo che entra nel primo if anche quando la data non cambiata. ed il secondo alquanto strano che mi scrive la data nel db a meno di un giorno "2020-01-02" diventa "2020-01-01" non riesco a capire il problema. Nella println a video ho i due valori "uguali"
Partiamo dalla premessa che cose del tipo Date.valueOf((String.valueOf(data[i]))) hanno davvero veramente poco senso. E inoltre il confronto con != NON ha affatto senso (sono oggetti ... queste sono "basi" di Java ..).

E comunque: da che cosa parti? (cosa quel data[i] ?) Se parti con l'avere una stringa con la data da salvare su DB, allora: a) stabilisci in che formato l'utente deve inserire la data; b) usa poi un apposito DateFormat per "parsare" la stringa in un java.util.Date (SimpleDateFormat se un formato personalizzato oppure il DateFormat ottenibile da uno dei metodi factory).
E poi per vedere se "diverso" si usa equals() (ovviamente in senso "negato": not equals).

felx
28-01-2020, 13:49
Partiamo dalla premessa che cose del tipo Date.valueOf((String.valueOf(data[i]))) hanno davvero veramente poco senso. E inoltre il confronto con != NON ha affatto senso (sono oggetti ... queste sono "basi" di Java ..).

E comunque: da che cosa parti? (cosa quel data ?) Se parti con l'avere una stringa con la data da salvare su DB, allora: a) stabilisci in che formato l'utente deve inserire la data; b) usa poi un apposito DateFormat per "parsare" la stringa in un java.util.Date (SimpleDateFormat se un formato personalizzato oppure il DateFormat ottenibile da uno dei metodi factory).
E poi per vedere se "diverso" si usa equals() (ovviamente in senso "negato": [I]not equals).

Ciao grazie per la risposta il vettore data un vettore di object. Ho sostituito il isequal per disperazione. Come sarebbe la sintassi giusta?
Il dataformat qullo di mysql che yyyy-mm-dd

andbin
28-01-2020, 14:49
Ciao grazie per la risposta il vettore data un vettore di object.
Ok, un Object[] . Ma quando entri in quel if(columnClass[i] == Date.class) l'oggetto REALE quale ? E' un java.util.Date o un String??

Se fosse gi un Date .. non devi fare alcun giro "strano" con i valueOf. realmente un Date, quindi basta fare un banale cast:

rs.updateDate(columnNames[i], (Date) date[i]);


Se fosse un String, va parsato in Date (come detto prima).


Ho sostituito il isequal per disperazione. Come sarebbe la sintassi giusta?
Ma non puoi andare avanti con "lacune" su queste basi di Java ...


Il dataformat qullo di mysql che yyyy-mm-dd
Quale sia il formato usato da MySQL, qui NON importa. Se usi updateDate, devi solo passare un Date (che NON ha un "formato" ... solo un istante nel tempo al millisecondo). Come deve essere passato a MySQL una questione che si gestisce il driver JDBC Connector/J di MySQL. ;)

felx
28-01-2020, 17:31
Ok, un Object[] . Ma quando entri in quel if(columnClass[I] == Date.class) l'oggetto REALE quale ? E' un java.util.Date o un String??

Se fosse gi un Date .. non devi fare alcun giro "strano" con i valueOf. realmente un Date, quindi basta fare un banale cast:

rs.updateDate(columnNames[i], (Date) date[i]);


Se fosse un String, va parsato in Date (come detto prima).


Ma non puoi andare avanti con "lacune" su queste basi di Java ...


Quale sia il formato usato da MySQL, qui NON importa. Se usi updateDate, devi solo passare un Date (che NON ha un "formato" ... solo un istante nel tempo al millisecondo). Come deve essere passato a MySQL una questione che si gestisce il driver JDBC Connector/J di MySQL. ;)

Ciao purtroppo non riesco a cavarci fuori. Sto impazzendo. Prendo una riga dalla jtable(che quella selezionata)


Object[] modified=dataModel.getDataVector().get(row).toArra y();


Il column questo


String[] richiamoColumns=new String[]{"ID", "Data", "CF", "Descrizione"};
Class<?>[] richiamoColumnClass=new Class<?>[]{Integer.class, Date.class, String.class, String.class};
Object[] richiamoDefaultValues=new Object[]{999, date, "AAAAAAAAAAAAAAAAA", "rthjtj"};

Chiamo una metodo updaterow(modified,row) dove row l'indice di riga selezionata.
mi sposto alla riga selezionata
[/CODE]rs.absolute(row+1);

dove scorrendo la rsset confronto le classi
[CODE]else if(columnClass == Date.class) {
else if(columnClass[i] == Date.class) {
if(!rs.getDate(columnNames[i]).equals(data[i])){
rs.updateDate(columnNames[i],Date.[I]valueOf((String) data[i]));
Mi inserisce la data, ma se la data 2020-01-02 mi inserisce il giorno prima non capisco cosa ci sia

Loading