PDA

View Full Version : [MySQL] Problema con inserimento date -- URGENTE!!!


Bizkaiko
01-03-2008, 11:21
Ho un problema un po' strano:
ho 2 applicazioni sviluppate sullo stesso DB MySQL.
Una è un'applicazione Windows fatta in VB.NET, che deve girare solo su 3 pc destinati alla "gestione globale", e l'altra è un sito in Asp.net/vb.

Quando devo inserire un record nella tabella Segnalazioni, la stessa identica query funziona senza problemi nell'applicazione windows, mentre non va nella pagina web.

Ora, io trasformo la data nel formato aaaammgg, e quando lancio la query il risultato che viene fuori è una roba del genere:
INSERT INTO Segnalazioni (descrizione, datainserimento, datasegnalazione) SELECT 'abcabc', NOW(), 20080301)
La stringa è IDENTICA nei due programmi, ma da web non funziona. Connessione odbc per entrambi, tutto esattamente uguale. Perchè quel formato di data non va bene da una parte??? (ho provato a sostituirlo con NOW(), e la query gira, per cui non è la struttura della query il problema...)

Dovrei riuscire da web a sostituire il 20080301 con "20080301", ma se metto
la stringa DataSegnalaz= chr(39) & DataSegnalaz & Chr(39), me lo trasforma in '20080301', col singolo apice, e ovviamente non va bene!!!
:help: :help: :help:

gugoXX
01-03-2008, 11:27
Ma datasegnalazione che tipo di dati e' nella tabella? Stringa oppure data?

Bizkaiko
01-03-2008, 11:36
Ma datasegnalazione che tipo di dati e' nella tabella? Stringa oppure data?

E' di tipo data.
Non posso convertirlo in stringa, perchè altrimenti mi complicherebbe non poco i filtri sulle varie ricerche

gugoXX
01-03-2008, 11:55
E' di tipo data.
Non posso convertirlo in stringa, perchè altrimenti mi complicherebbe non poco i filtri sulle varie ricerche


Certo, certo, e' la scelta giusta, volevo solo capire se era stata scelta.
Per inserire un campo data direttamente da statement SQL in mysql (e sqlserver) occorre pero' passare una stringa. Sara' il motore a fare il parsing della stringa e trasformare il valore in data prima di memorizzarlo.
La tua prima istruzione dovrebbe essere scritta cosi':

INSERT INTO Segnalazioni (descrizione, datainserimento, datasegnalazione) VALUES ('abcabc', NOW(), '20080301')


Questo nel caso tu stessi componendo esplicitamente lo statement SQL da sottomettere al Database.

Perche' in realta' questa scelta non si dovrebbe fare, sopratutto nelle applicazioni WEB. Occorrerebbe lavorare sempre con i parametri, per evitare il dannosissimo e sottostimato problema della SQL-Injection.
Lavorando con i parametri ottieni anche che i dati da inserire per questa istruzione potrebbero rimanere nel loro fomato nativo .net, e non dovrai pensare tu a trasformarli nel formato analogo per il database che usi.

Bizkaiko
01-03-2008, 12:06
Ed esattamente con i parametri come dovrebbe essere?
Perchè ho fatto un paio di tentativi, ma se gli passavo 20080201 o 01/03/2008 mi dava comunque errore :(
(grazie per l'aiuto)

gugoXX
01-03-2008, 12:24
Ed esattamente con i parametri come dovrebbe essere?
Perchè ho fatto un paio di tentativi, ma se gli passavo 20080201 o 01/03/2008 mi dava comunque errore :(
(grazie per l'aiuto)

La getto li' al volo, perche' non ho visual studio su questa macchina.


string sql=@"INSERT INTO Segnalazioni (descrizione, datainserimento,
datasegnalazione) VALUES (@p1, NOW(), @p2) ";
ISqlCommand pippo=connection.CreateCommand(sql);
pippo.AddParameter("@p1",stringaabcabc);
pippo.AddParameter("@p2",datachevoglio);
pippo.ExecuteNonQuery();

In questo modo stringaabc sara' una stringa del .net, mentre datachevoglio sara' una data del .net, proprio un DateTime, senza mettere apici o altro. (E' una data)

cdimauro
01-03-2008, 12:41
Ed esattamente con i parametri come dovrebbe essere?
Perchè ho fatto un paio di tentativi, ma se gli passavo 20080201 o 01/03/2008 mi dava comunque errore :(
(grazie per l'aiuto)
Prova a passare 2008-02-01: con MySQL faccio così e non mi crea problemi.

Bizkaiko
01-03-2008, 13:41
Grazie mille. Adesso provo :)

Bizkaiko
03-03-2008, 09:22
Anche con i parametri, il problema rimaneva...
Se gli passavo 20080301 mi inseriva a riga nella tabella lasciandomi vuoto il campo corrispondente (!!!), passandogli 2008-03-01 mi dava errore di conversione, ho provato qualche altro formato ma niente...

Alla fine ho convertito i campi data in campi integer, la data viene passata col formato aaaammgg, e quando interrogo il db forzo una trasformazione del dato da integer a stringa nel formato "gg/mm/aaaa".
Non sarà il massimo, ma è l'unico modo che ho trovato, visto che dovevo assolutamente terminare per oggi...
Al massimo farò qualche altro tentativo nei prossimi giorni, se trovo una soluzione sostituirò il progetto.

gugoXX
03-03-2008, 09:28
Con i parametri il problema non deve accadere.
Non dovevi passare una stringa '20030801'
ma una vera e propria data, costruita in VB.net come preferito, tipo:

Datetime dt=new DateTime(2003,08,01); (C#, non conosco la sintassi analoga VB.net)
Passando dt come variabile sarebbe andato tutto a posto.

La soluzione con interi va altrettanto bene, a patto che tu non debba mai chiederti la differenza tra 2 date. Sottrarre 2 interi cosi' ovviamente restituisce valori che non hanno senso. Sottrarre invece 2 campi in formato data restituisce su quasi tutti i DB la differenza in giorni fra le 2 date.

Bizkaiko
03-03-2008, 09:49
Credimi, è stato forse il primo tentativo che ho fatto.
Ma la query lasciava il campo corrispondente vuoto :muro:

Ribadisco, la cosa che più mi lascia perplesso è che la stessa IDENTICA query sull'applicazione windows gira senza problemi, su asp.net no :(

Ad ogni modo, se dovrò ottenere una differenza tra date, trasformerò i campi corrispondenti da codice e poi userò il datediff: un po' più lento, lo so, ma (per ora) è l'unica