Quesito su DateTime

mercoledì 13 maggio 2009 - 12.21

danvagna Profilo | Junior Member

ho una domanda (credo banale ma...) sui Datetime...vorrei fare una query che mi dia dei valori relativi al giorno di "ieri" ossia ieri dipendentemente dalla data attuale..in pratica il seguente codice:
DateTime data = DateTime.Now;//data odierna
data = data.AddDays(-1);//data di ieri
DateTime anno = data.AddYears(-2);//data di ieri e di 2 anni fa
il problema nasce nella query...quando vado a scrivere
SELECT x,y,x
FROM tabella1
WHERE creatdate(è il nome della colonna della tabella) >= anno
credo che il problema sia che non mi riconosce il formato di anno....ovviamente se al posto di anno ci metto '20070512' (ad esempio 12 maggio 2007) la query funziona..in che modo potrei formattare la variabile anno per essere riconosciuta?

Jeremy Profilo | Guru

Ciao Daniele.
Cosa vuol dire "Non ti riconosce il formato di anno"??
anno per te, nella query, è un parametro,vero???E ti sei solo dimenticato di farlo precedere dall'indicatore di parametro @???
Puoi indicarci il tipo di errore che ricevi??

Facci sapere..
Ciao

danvagna Profilo | Junior Member

ho provato ad aggiungere la @ ma non va lo stesso...in realtà non mi da errore bensì non mi esegue la query e mi restituisce una pagina bianca

alx_81 Profilo | Guru

>ho provato ad aggiungere la @ ma non va lo stesso...in realtà
>non mi da errore bensì non mi esegue la query e mi restituisce
>una pagina bianca
scusate se intervengo.. ma hai definito il parametro nell'oggetto command?
E, ancora prima, come la esegui la query? che oggetti usi?
--

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

danvagna Profilo | Junior Member

hem....perdona la mia ignoramza...il parametro nell oggetto command? sarebbe?...

Jeremy Profilo | Guru

Sapevo che c'era qualcosa che non cubava.
Se hai intenzione di eseguire la query usando la *tecnica* di concatenazione delle stringhe, allora dovresti scrivere qualcosa del genere:

"SELECT x,y,x FROM tabella1 WHERE creatdate >=#" + anno + "#"

In sostanza, devi racchiudere il valore della variabile anno(poichè di tipo Date), fra i simboli cancelletto.
Ci sarebbe poi da considerare il fatto che Access, per esempio, pretende, nei criteri di ricerca(e non solo), i valori data con la formattazione MM/gg/aaaa

E' inutile dirti che è sicuramente più corretto utilizzare delle query parametriche(il motivo viene ampliamente spiegato in rete...cerca SqlInjection,tra l'altro se non sbaglio c'è un articolo proprio di Alessandro in merito), ma questo implica che tu abbia conoscenze riguardo ADO.NET(o precedenti) e sull'uso di oggetti quali Command,Connection e Parameter.

Riamaniamo comunque a disposizione per ulteriori info.

Facci sapere...
Ciao

danvagna Profilo | Junior Member

grazie :) alla fine ho risolto mettendo la data a mano...meno elegante ma almeno funziona :P
una curiosità...per scorrere un fil xml ho creato il seguente codice

using System.Xml;
...
XmlDocument doc = new System.Xml.XmlDocument();
String testoquery = "";
XmlNodeList nodi;
doc.Load("C:/Documents and Settings/..../queries.xml");
nodi = doc.GetElementsByTagName("query");

foreach (XmlNode nodo in nodi)
{
if (nodo.item("query").InnerText = "default")
testoquery = nodo.item("testo");
}


e il file xml è il seguente

<?xml version="1.0" encoding="utf-8" ?>
<queries>
<query>
<nome>default</nome>
<testo>select ...from... where...</testo>
</query>
<query>
<nome>pagina1</nome>
<testo>select...from...where...</testo>
</query>

<query>
<nome>pagina2</nome>
<testo>select ...from... where...</testo>
</query>

<query>
<nome>pagina3</nome>
<testo>select ...from... where...</testo>
</query>
</queries>


mi da errore su "Item"..essendo un codice che mi ha passato un amico che usa VB potrebbe essere che Item è qualcosa di sconosciuto a c#?

Jeremy Profilo | Guru

Probabilmente è sufficiente che tu sostituisca le parentesi tonde con quelle quadre(nel contesto di identificazione dell'item).

if (nodo.item["query"].InnerText = "default") testoquery = nodo.item["testo"].tostring;

Facci sapere...
Ciao

danvagna Profilo | Junior Member

ok ho risolto in questo modo..era diversa la sintassi da vb a c#

if (nodo.FirstChild.InnerText == "xxxx")
testoquery = nodo.FirstChild.NextSibling.InnerText;
beh anche questo è risolto :D

Jeremy Profilo | Guru

Ciao Daniele.
l'unica cosa che mi viene da dirti in questo momento è di provare a fare così:

XmlDocument doc = new System.Xml.XmlDocument(); String testoquery = ""; XmlNodeList nodi = default(XmlNodeList); doc.Load("D:/Documents and Settings/..../queries.xml"); nodi = doc.GetElementsByTagName("query"); for (int i = 0; i <= nodi.Count - 1; i++) { if (nodi.ItemOf(i).Item("query").InnerText == "default") { testoquery = nodi.ItemOf(i).Item("nome").ToString; }

Facci sapere...
Ciao.

danvagna Profilo | Junior Member

grazie ho risolto con questo codice

if (nodo.FirstChild.InnerText == "xxxx")
testoquery = nodo.FirstChild.NextSibling.InnerText;

grazie ancora per la disponibilità :)

danvagna Profilo | Junior Member

hem ritorno su quest argomento perchè purtroppo è una cosa che mi potrebbe servire(lavoro con c# vs 2005 e microsoft sql)
provo a rispiegare meglio il problema..ho creato un file xml nel quale ho inserito diverse query.
quando mando in esecuzione il programma che ho fatto questo apre diverse pagine del browser e ogni pagina cerca la query che deve eseguire all interno del file xml..e fino a qui non ci sono problemi. i problemi nascono nel momento in cui invece di scrivere la data che mi interessa (esempio '20090514' ..in questo caso funziona tutto correttemente) gli passo un datetime che contiene la data che mi interessa..per farvi un esempio...se oggi eseguisse la query il mio programma mi darebbe dei risultati..ma se domani ,al momento dell avvio, riformulasse la query con la data del giorno in cui l esegue mi darebbe un risltato diverso; per questo motivo volevo passare un parametro contenente la data del giorno (qualcosa tipo DateTime today = new DateTime(); today = DateTime.Now;//data di oggi) piuttosto che cambiarla a mano all interno del file xml
grazie a tutti

Jeremy Profilo | Guru

Ciao Daniele.
E quindi, torniamo indietro di 6 post!!
Rileggi quel post e formula una domanda un pò più specifica.

Facci sapere...
Ciao

danvagna Profilo | Junior Member

ok ci provo....nella mia pagina pagina1.aspx.cs ho inserito il seguente codice

XmlDocument doc = new XmlDocument(); //XmlNode nodo; String testoquery = ""; XmlNodeList nodi; doc.Load("C:/Documents and Settings/.../queries.xml"); nodi = doc.GetElementsByTagName("query"); DateTime today = new DateTime(); today = DateTime.Now;//data di oggi DateTime oneYear = today.AddYears(-1);//scorso anno DateTime twoYears = today.AddYears(-2);//due anni fa foreach (XmlNode nodo in nodi) { if (nodo.FirstChild.InnerText == "pagina1") testoquery = nodo.FirstChild.NextSibling.InnerText; } SqlCommand cmd = new SqlCommand(testoquery, cn);

all interno del file xml invece c è il seguente nodo

<query> <nome>pagina4</nome> <testo>SELECT x,y,z FROM tabella1 join tabella2 on .... WHERE tabella1.docdate='20090514' </testo> </query>

ora invece di '20090514' mi piacerebbe metterci 'today' ossia una variabile(contenuta in pagina1.aspx.cs)che contiene la data odierna.

quando però metto 'today' la query non funziona e ovviamente mi restituisce una tabella vuota...
se vi servono più info per capire il problema dite pure....

Jeremy Profilo | Guru

Come ti dicevamo io ed Alessandro, per fare ciò che vuoi fare tu, devi parametrizzare le tue query.
Quindi, nel caso specifico, nel file xml, la tua query diventerà così:

<query> <nome>pagina4</nome> <testo>SELECT x,y,z FROM tabella1 join tabella2 on .... WHERE tabella1.docdate=@data </testo> </query>

Ovviamente, dopo, dovrai valorizzare quel parametro(@data) per far sì che il command possa interpretare correttamente la query.
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra


Facci sapere se serve altro.....
Ciao

danvagna Profilo | Junior Member

lo so che mi stai odiando..però dai l ultimo sforzo :P

cmd.Parameters.Add(new SqlParameter {.Type=SqlDbType.DateTime,.Parametername="@data",.Value=DateTime.Now});


prima del punto(.Type..) che ci dovrei mettere?
e nel caso volessi usare più parametri? immagino mi basti aggiungere tante righe cmd.Parameters.Add..
quanti sono i parametri

grazie ancora

Jeremy Profilo | Guru

Ciao Daniele
>lo so che mi stai odiando..però dai l ultimo sforzo :P
Non ti odio affatto.
E' solo che ho mischiato un pò di C# con un pò di VB.
il codice giusto è questo:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Senza punto.

Facci sapere...
Ciao

danvagna Profilo | Junior Member

pèurtroppo continua a non funzionare :( è come se non legasse il valore che gli passo alla variabile che ho messo nel file xml

SqlCommand cmd = new SqlCommand(testoquery, cn);
cmd.Parameters.Add(new SqlParameter("@anno", DateTime.Now.ToShortDateString() ));

danvagna Profilo | Junior Member

mi sta venendo da piangere!! ci sono riuscito...posto il codice magari può servire a qualcuno

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Jeremy Profilo | Guru

Allora .... secondo me stai facendo un pò di confusione tra data ed anno che, ovviamente, sono due cose diverse.
Facciamo una cosa......rispondi a queste domande.

-Di che tipo è il campo docdate della tabella1?
-Eventualmente fosse DateTime ..... con che formattazione??
-In base a quale criterio di ricerca vuoi estrarre i dati??
-Perchè non sei riuscito a scrivere il codice esattamente come te l'ho passato io????(ovviamente su questa scherzo...ma ha comunque un'importanza sulla definizione del tipo del parametro.)
-Ricevi una qualche eccezione??
-E se si, che tipo??
-E se no, sei sicuro di non aver coperto il tuo codice in un costrutto Try Catch senza averne gestito il catch???

Facci sapere...
Ciao

danvagna Profilo | Junior Member

il tuo codice non lo potevo utilizzare in quanto non esisteva un costruttore che prendesse 3 argomenti :)

il campo docdate è di tipo datetime, la formattazione non è importante diciamo che per ragioni estetiche la shotdate mi piace di più(quella del tipo 14/05/2009)

ora provo a rovinarmi la vita mettendoci un blocco try catch...

Jeremy Profilo | Guru

Ciao Daniele.
Te lo dico solo per completezza e per chiarezza.
Se guardi bene, il costruttore che ho usato io, è senza parametri.
Quelli che vedi tra parentesi graffe, è la possibilità che ti dà il compilatore di valorizzare alcune proprietà grazie all' object initializer.

Ciao.


danvagna Profilo | Junior Member

ah...io credevo fosse il costruttore con 3 paramteri ....vabbè sono io ad essere rinc..... :D
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