Problema con la datatime.parsexact

lunedì 22 novembre 2010 - 15.52

mauri1961 Profilo | Senior Member

Riprendo un thread che è rimasto incompiuto.

Per poter risolvere in modo definitivo un problema di conversione di date (da gg/mm/aaaa da inputazione a yyyy-mm-dd su tabella sqlserver) ho utilizzato l'istruzione datatime.parsexact.

Ecco come ho agito:

Dim datestring As String
Dim result As Date
Dim format As String
Dim provider As CultureInfo = CultureInfo.InvariantCulture

datestring = comunica.Text
format = "yyyy-mm-dd"

result = Date.ParseExact(datestring, format, provider)

(lo faccio per altre due date ma per brevità evito....)


a questo punto devo effettuare un insert in un database sql server....



strsql = "insert into notifiche_01(not_comunicazione, not_opera, not_indirizzo, not_localita, not_committente, not_comm_cf, not_responsabile, not_resp_cf, not_coord1, not_cor1_cf, not_inizio, not_fine, not_impresa, not_impresa_noniscritta, not_impr_cf, not_comune, not_importo)" & _
"values (@comunica, '" & indirizzo.Text & "', '" & comune.SelectedValue & "', '" & committente.Text & "', '" & comm_cf.Text & "', '" & responsabile.Text & "', '" & resp_cf.Text & "', '" & coordinatore.Text & "', '" & coord_cf.Text & "', @dataini, @datafin, '" & impresa.SelectedValue & "', '" & impresanoniscritta.Text & "', '" & partitaiva.Text & "', '" & comunesede.Text & "', '" & CInt(importo.Text) & "')"

strdiv = "RECORD INSERITO CORRETTAMENTE <br /><a href='PAGEINI.aspx'>CLICCARE QUI PER TORNARE AL MENU</


conn = New SqlConnection(strconn)
command = New SqlCommand(strsql, conn)

command.Parameters.AddWithValue("@comunica", result)

command.Connection.Open()
command.ExecuteNonQuery()
command.Connection.Close()
risultato.Visible = True
risultato.InnerHtml = strdiv
form_blocco.Visible = False
Else
risultato.InnerHtml = "Form non valido"
End If
End Sub


come potete vedere utilizzo @comunica per effettuare la insert ma il campo RESULT dove dovrebbe essere contenuto la data convertita mi da errore in compilazione nella parameters.addwithvalue dicendo che il campo non è definito.

Grazie, Maurizio

alx_81 Profilo | Guru

>come potete vedere utilizzo @comunica per effettuare la insert
>ma il campo RESULT dove dovrebbe essere contenuto la data convertita
>mi da errore in compilazione nella parameters.addwithvalue dicendo
>che il campo non è definito.
perchè usi il @param solo in comunica? Non concatenare, usa le query parametriche.. ti rendi sicuro e poi è molto più leggibile.
elenco di param e elenco di addwithvalue. Il tipo lo capisce già AddWithValue.
Hai fatto un debug sulla variabile result? è un formato che ti aspetti? Il format che indichi non deve essere quello di destinazione, ma quello con cui vai a leggere la stringa e che poi il parser usa per tornarti la data. Non è il formato di output.
Se imposti il formato che hai messo, l'utente che riempie la text box deve immettere 2010-11-26.
Se invece vuoi che l'utente metta 26/11/2010, il formato da usare è dd/mm/yyyy.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

mauri1961 Profilo | Senior Member

Ti ringrazio per la risposta, devo dire che ho seguito il Tuo ottimo consiglio e ho parametrizzato i valori comq puoi vedere di seguito nel codice.

Ho anche modificato i valori inserendo nella stringa datadritta il valore proveniente dall’inserimento della data in formato gg/mm/aaaa (comunica.text). Tale data è controllata in fase di inserimento e non pùo essere confermata in formato anomalo.
Il codice si presenta ora cosi :


Dim provider As System.IFormatProvider
Dim datadritta, format As String
Dim result As Date
format = "dd/mm/yyyy"
datadritta = comunica.Text

result = Date.ParseExact(datadritta, format, provider)

strsql = "insert into notifiche_01(not_comunicazione, not_opera, not_indirizzo, not_localita, not_committente, not_comm_cf, not_responsabile, not_resp_cf, not_coord1, not_cor1_cf, not_inizio, not_fine, not_impresa, not_impresa_noniscritta, not_impr_cf, not_comune, not_importo)" & _
"values (@comunica, @opera, @indirizzo, @comune, @committente, @comm_cf, @responsabile, @resp_cf, @coordinatore, @coord_cf, @dataini, @datafin, @impresa, @impresanoniscritta, @partitaiva, @comunesede, @importo)"
conn = New SqlConnection(strconn)
command = New SqlCommand(strsql, conn)

command.Parameters.AddWithValue("@comunica", "result")
command.Parameters.AddWithValue("@opera", ubicazione.Text)
command.Parameters.AddWithValue("@indirizzo", indirizzo.Text)
command.Parameters.AddWithValue("@comune", comune.SelectedValue)
command.Parameters.AddWithValue("@committente", committente.Text)
command.Parameters.AddWithValue("@comm_cf", comm_cf.Text)
command.Parameters.AddWithValue("@responsabile", responsabile.Text)
command.Parameters.AddWithValue("@resp_cf", resp_cf.Text)
command.Parameters.AddWithValue("@coordinatore", coordinatore.Text)
command.Parameters.AddWithValue("@coord_cf", coord_cf.Text)
command.Parameters.AddWithValue("@dataini", "result2")
command.Parameters.AddWithValue("@datafin", "result3")
command.Parameters.AddWithValue("@impresa", impresa.SelectedValue)
command.Parameters.AddWithValue("@impresanoniscritta", impresanoniscritta.Text)
command.Parameters.AddWithValue("@partitaiva", partitaiva.Text)
command.Parameters.AddWithValue("@comunesede", comunesede.Text)
command.Parameters.AddWithValue("@importo", CInt(importo.Text))

command.Connection.Open()
command.ExecuteNonQuery()
command.Connection.Close()
risultato.Visible = True
risultato.InnerHtml = strdiv
form_blocco.Visible = False


Ho lanciato il debug ma mi si blocca sulla execute.nonquery segnalandomi che la conversione non è riuscita.
A prima vista penso sia il provider che non è definito correttamente ma non riesco a trovare la soluzione.


Grazie come sempre, Maurizio.


alx_81 Profilo | Guru

>Ti ringrazio per la risposta, devo dire che ho seguito il Tuo
>ottimo consiglio e ho parametrizzato i valori comq puoi vedere
>di seguito nel codice.
più bello, più pulito, più sicuro, più manutenibile.. ottimo!

>Ho lanciato il debug ma mi si blocca sulla execute.nonquery segnalandomi
>che la conversione non è riuscita.
che valore ti trovi nella data se fai un quick watch? Prima della execute non query, controlla il valore passato al param coi watch.. valuta l'espressione e vedi se converte..
c'è da capire se l'errore è lato sql o codice..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

mauri1961 Profilo | Senior Member

ho una versione express. Mi sa di non poter usare la funzione quick watch.

Ciao, Maurizio


p.s. ma è corretto definire il provider as system.iformatprovider ? perchè rilascia un avviso che tale variabile è utilizzata prima di assegnarle un valore.

alx_81 Profilo | Guru

>p.s. ma è corretto definire il provider as system.iformatprovider?
>perchè rilascia un avviso che tale variabile è utilizzata prima di assegnarle un valore.
no, devi valorizzarlo così a CultureInfo.InvariantCulture
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

mauri1961 Profilo | Senior Member

ora l'avviso è sparito ma il debug continua a segnalarmi sempre che la conversione non è riuscita durante la executenonquery.

Ma il debug non dovrebbe segnalarmi anche i valori al momento del blocco ?

ciao, Maurizio.

alx_81 Profilo | Guru

>ora l'avviso è sparito ma il debug continua a segnalarmi sempre
>che la conversione non è riuscita durante la executenonquery.
>Ma il debug non dovrebbe segnalarmi anche i valori al momento
>del blocco ?
esatto.. alla fine è il sinonimo di un watch.. comunque, non avrai quick, ma nemmeno la voce Add Watch?
Per vedere il valore corrente, metti un break point la linea dopo della parseExact.. e passa sopra alla variabile potenzialmente convertita.
Dovresti poter vedere il valore corrente.. Se non hai eccezione durante la parseExact, mi sembra strano che non converta..
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

mauri1961 Profilo | Senior Member

mi scuso ma non conosco i break points. che istruzioni devo utilizzare per inserirlo?

grazie, Maurizio.

p.s. ma funzionando la conversione da stringa dd/mm/yyyy dovrebbe restituirmi yyyy-mm-dd hh:mm:ss ? (spero di si...)

alx_81 Profilo | Guru

>mi scuso ma non conosco i break points. che istruzioni devo utilizzare per inserirlo?
vai sulla riga e premi F9 oppure clicka col mouse nella barra grigia davanti all'editor di testo

>p.s. ma funzionando la conversione da stringa dd/mm/yyyy dovrebbe
>restituirmi yyyy-mm-dd hh:mm:ss ? (spero di si...)
no, dovrebbe restituirti un tipo DateTime .net che poi, tramite ADO.Net viene convertito in quello che serve a sql

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

mauri1961 Profilo | Senior Member

allora

datadritta contiene 02/12/2010 che è correttamente la data impostata a video
format ovviamente dd/mm/yyyy
provider (system.globalization.cultureinfo)

mentre result (che immagino dovrebbe contenere il campo date) contiene #12:00:00 am# ......

ciao, Maurizio

l'istruzione è result = date.parseexact(datadritta, format, provider)

alx_81 Profilo | Guru

>mentre result (che immagino dovrebbe contenere il campo date)
>contiene #12:00:00 am# ......
Guarda qui, così funziona, usa DateTime:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5