[VB2005]Tipi di dato Date e DateTime

venerdì 12 dicembre 2008 - 14.46

Teech Profilo | Expert

Ho parametrizzato in un SQLCommand un campo passando al parametro un oggetto di tipo DateTime.
Eseguendo la query mi viene restituito un errore:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Parto dal presupposto che il valore del parametro può essere una Data o Nothing (NULL sul DB)... Per passare il parametro istanzio una variabile nel seguente modo:
Dim MiaVarData As DateTime = Nothing
Ovviamente se non assegno una valore alla variabile questa dovrebbe essere Nothing... Ma con questo modo di istanziare la variabile, in Debug, ho notato che il valore di MiaVarData è #12:00:00 AM#... Pechè? Questo comportamento l'ho anche istanziando la variabile di tipo Date (che da quanto ho capito dalla MSDN sono la stessa cosa).
Ovviamente, se istanzio la variabile
Dim MiaVarData As DateTime = Today
non vengono generate eccezioni , ma i valori restituiti non sono corretti...

Come posso fare?

Grazie!!!




--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

alx_81 Profilo | Guru

Ciao Teech!

>Parto dal presupposto che il valore del parametro può essere
>una Data o Nothing (NULL sul DB)... Per passare il parametro
>istanzio una variabile nel seguente modo:
>Dim MiaVarData As DateTime = Nothing
Se è nothing ti conviene però omettere il parametro, quindi, se possibile, fatti una stored procedure che ha un parametro opzionale. Poi nella stored procedure gestisci con un IF il lancio di un comando piuttosto che di un altro.

>Ovviamente se non assegno una valore alla variabile questa dovrebbe
>essere Nothing... Ma con questo modo di istanziare la variabile,
>in Debug, ho notato che il valore di MiaVarData è #12:00:00 AM#...
>Pechè? Questo comportamento l'ho anche istanziando la variabile
>di tipo Date (che da quanto ho capito dalla MSDN sono la stessa
>cosa).
Puoi usare il MinValue ed in base a quello non passare il parametro al comando.

DateTime.Minvalue (System)
http://msdn.microsoft.com/en-us/library/system.datetime.minvalue.aspx

>Come posso fare?
Ti consiglio una stored tipo questa:

CREATE PROCEDURE dbo.proc_Cerca @Data smalldatetime = NULL AS BEGIN SET NOCOUNT ON; IF @Data IS NULL SELECT ... ELSE SELECT ... WHERE Data >= @Data END


>Grazie!!!
di nulla!
--

Alessandro Alpi | SQL Server MVP

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

Teech Profilo | Expert

Uso già una SP però fatta così:
CREATE PROCEDURE dbo.proc_Cerca @Data smalldatetime = NULL AS BEGIN SET NOCOUNT ON; SELECT ... WHERE (Data >= @Data OR @Data IS NULL) END
Il problema è che da VB.NET non riesco a passare il parametro di Defualt (o sbaglio?)... Utilizzando il DateTime.MinValue posso fare una verifica al momento dell'assegnazione del valore al parametro:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
E' un pò poco elegante come codice e aggira il problema invece che risolverlo direttamente (ma se non c'è altro modo), ma dovrebbe funzionare...
Provo e ti so dire...
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

alx_81 Profilo | Guru

>Il problema è che da VB.NET non riesco a passare il parametro
>di Defualt (o sbaglio?)...
Potresti ma non è bello..

>Utilizzando il DateTime.MinValue posso
>fare una verifica al momento dell'assegnazione del valore al
>parametro
Ed è proprio quello che ti tocca fare. Potresti farti dei default tuoi che poi vengono mappati come NULL nelle tue SP.
>E' un pò poco elegante come codice e aggira il problema invece
>che risolverlo direttamente (ma se non c'è altro modo), ma dovrebbe
>funzionare...
>Provo e ti so dire...
Più che altro, torno su un mio post.. Sto usando un intelligente datamapper che si arrangia da solo a gestire questo tipo di operazioni.
Ti invito a leggere questo post e a provarlo. Secondo me rimarrai piacevolmente sorpreso ed eviterai di fare a manina il solito DAL.

http://blogs.dotnethell.it/suxstellino/iBatis-for-.Net-un-DataMapper-da-tenere-in-considerazione__14524.aspx

Ciao!
--

Alessandro Alpi | SQL Server MVP

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

Teech Profilo | Expert

Ho guardato sia IBatis che NHibernate e mi sono sembrati 2 framework "concorrenti".
Per una maggiore produttività in questo progetto agirò manualmente effettuando il controllo sulla proprietà MinValue, ma in futuro potrebbero essere ottime alternative (sempre che trovo il tempo per studiarli)

Grazie!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole

alx_81 Profilo | Guru

>Ho guardato sia IBatis che NHibernate e mi sono sembrati 2 framework
>"concorrenti".
>Per una maggiore produttività in questo progetto agirò manualmente
>effettuando il controllo sulla proprietà MinValue, ma in futuro
>potrebbero essere ottime alternative (sempre che trovo il tempo
>per studiarli)
Credimi, non serve nemmeno il tempo. E se vuoi posso darti una mano anche al volo, è talmente semplice ed intuitivo che non farai alcuna fatica. In più sul sito c'è un buon manualino che spiega perfettamente tutto. Buttatici.. risparmi investendo
Comunque IBatis è un datamapper, non è proprio un ORM come NHibernate..

>Grazie!!!
di nulla!
--

Alessandro Alpi | SQL Server MVP

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
http://italy.mvps.org
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5