11. februar 2009 - 22:43Der er
35 kommentarer og 1 løsning
WHERE i min sql sætning
Hej jeg har en hjemmeside hvor jeg prøver at få noget til at ske hvis system tiden er den samme som tiden i min ms sql database.
Men jeg ved ikke helt hvordan jeg skal skrive det, der er flere poster i min db med forskellige tidspunkter så den tager bare den første og sammenligner system tiden med den.
Prøv med: SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND CONVERT(VARCHAR, tid, 108) = CONVERT(VARCHAR, GETDATE(), 108)
Det synes jeg er mystisk, har prøvet at lave en Query i SQL 2005 Express på min db med en lignende sql forespørgsel, og her virker det fint. Hvis du lige dumper koden du har prøvet med, så vil jeg godt kigge på det, men det bliver først i morgen tidlig, da jeg logger af nu...
SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND CONVERT(VARCHAR, tid, 108) = CONVERT(VARCHAR, GETDATE(), 108) "
og fejlen siger: Object reference not set to an instance of an object.
Ok, men den fortæller ikke hvor i koden den fejler.
Hvis jeg har forstået spørgsmålet rigtigt, dvs. at du vil checke om den største dato/tid i databasen er lig med systemdato, var det så ikke bedre at hente den, og så efterfølgende lave check:
"SELECT TOP(1) tid FROM Program ORDER BY convert(VARCHAR(10), date, 102) DESC, ORDER BY convert(VARCHAR(10), tid, 108) DESC";
og vil du checke mere en den første/højeste dato/tid skriver du blot f.eks. top(10).
Skal checket være indenfor samme dato tilføjer du blot en where i ovenstående:
WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)
Nej, jeg tror du har misforstået det lidt, eller også er det bare mig der ikke har forklaret det ordentligt. :-D
Den skal ikke tjække om systemtiden er det samme som den højeste tid i min db.
Men den skal tjække om system tiden er det samme som bare 1 af tiderne i min db.
Det jeg vil have skal ske i slutningen, nu prøver jeg jo lige at tage et skridt af gangen :-)
der skal være et lille billede ved siden af den tid det er nu. Så den skal jo tjække om system tiden er det samme som 1 af tiderne i min db, og så skal der ske noget i min if sætning.
Som jeg nu forstår det, er det du vil at checke, om den aktuelle time (hour) findes i databasen indenfor den samme dag. Hvis jeg nu har fattet det rigtigt, vil jeg foreslå:
'Vi finder aktuel time og time + 1 Dim intTime As Integer = Date.Now.Hour Dim intTime1 As Integer = intTime + 1
'Konverterer til en streng og tilføjer et 0 hvis mindre end 10 Dim strTime As String = Trim(Str(intTime)) Dim strTime1 As String = Trim(Str(intTime1)) If intTime < 10 Then strTime = "0" + strTime If intTime1 < 10 Then strTime1 = "0" + strTime1
"SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND convert(varchar, dato,108) >= '" + strtime + "' and convert(varchar,dato,108) < '" + strtime1 + "'"
Ups, jo det er vb, var ikke opmærksom på det var i c#.
Så laver vi det direkte i sql. Jeg har ikke testet det, men prøv med:
SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND datepart("hh",Dato) >= datepart("hh",getdate()) AND datepart("hh",dato) < datepart("hh",getdate())+1
rettelse: SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND datepart("hh",date) >= datepart("hh",getdate()) AND datepart("hh",date) < datepart("hh",getdate())+1
Smid sql sætningen ind i en query eller stored procedure, så kan du se hvad der fejler. Hvis du har felterne tid og date i tabellen Program, burde det virke.
Jeg forstår ikke helt det med en stored procedure.
Men min sql sætning ser sådan ud:
"SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND datepart(hh,date) >= datepart(hh,getdate())AND datepart(hh,date) < datepart(hh,getdate())+1";
Du har glemt gåseøjne omkring "hh" alle steder. Prøv at køre sætningen i en query med "hh". Har du ikke SQL Server Express, ellers kan den hentes gratis hos Microsoft.
Jeg har nu testet sql sætningen i min egen db, og her virker det på en tabel med et datofelt. Jeg har dog fratrukket en dag fra aktuel dato, da der ikke er poster fra i dag:
SELECT Login, Dato FROM dbo.login WHERE CONVERT(VARCHAR, dato, 105) = CONVERT(VARCHAR, GETDATE()-1, 105) AND datepart("hh",dato) >= datepart("hh",getdate()) AND datepart("hh",dato) < datepart("hh",getdate())+1
Jeg vil godt hjælpe med en stored procedure og et kald til denne fra koden, men prøv lige sql fra en query...
Ja det glemte jeg at fortælle dig, men hvis der er gåseøjne omkring "hh" så kommer der en rød streg under somom det er forkert kode.
og når jeg køre musen hen over står der: ; expected
men jeg ved bare ikke hvor jeg skulle placere den, nu ser min sql query sådan ud:
objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND datepart("hh",dato) >= datepart("hh",getdate()) AND datepart("hh",dato) < datepart("hh",getdate())+1 ";
Ja, men da "hh" er i en streng, skal du nok bruge ""hh"" ?? Nu koder jeg i VB, men mon ikke det også gælder i c#:
objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND datepart(""hh"",dato) >= datepart(""hh"",getdate()) AND datepart(""hh"",dato) < datepart(""hh"",getdate())+1 ";
Nej den gør desværre det samme, jeg ville da også tro at det ville virke selv om du bruger vb fordi det her er jo sql.
men nu ser den bare sådan ud:
objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND datepart(""hh"",dato) >= datepart(""hh"",getdate()) AND datepart(""hh"",dato) < datepart(""hh"",getdate())+1 ";
Lav en Stored Procedure og prøv at køre den direkte:
CREATE PROCEDURE dbo.spGetTimeHour AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements. SET NOCOUNT ON; SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND datepart("hh",date) >= datepart("hh",getdate()) AND datepart("hh",date) < datepart("hh",getdate())+1
END GO
Når du skal kalde den fra programmet skal du erstatte CommandType.Text med CommandType.StoredProcedure og angive navnet på stored procedure, her 'dbo.getTimeHour'
Ok, men nu tror jeg at jeg ikke helt har forstået det, fordi der kommer røde streger under næsten det hele, og det ser og ud som om det er lidt ude af context.
CREATE PROCEDURE dbo.spGetTimeHour AS BEGIN // SET NOCOUNT ON added to prevent extra result sets from // interfering with SELECT statements. SET NOCOUNT ON; SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105) AND datepart("hh",date) >= datepart("hh",getdate()) AND datepart("hh",date) < datepart("hh",getdate())+1
END GO
objconn.Open();
DateTime tid = (DateTime)objcmd.ExecuteScalar(); if (DateTime.Now.Hour == tid.Hour) { test.Text = "Vi sammenligner " + DateTime.Now.Hour + " med " + tid.Hour + " de er faktisk " + DateTime.Now + " og " + tid; } else { ikke.Text = "Vi sammenligner " + DateTime.Now.Hour + " med " + tid.Hour + " de er faktisk " + DateTime.Now + " og " + tid; }
objconn.Close();
Og også, hvor skal man skrive navnet på stored procedure efter objcmd.CommandType = CommandType.StoredProcedure;
No, no, du skal oprette en stored procedure direkte i databasen, enten i MS-SQL Server 2005 Express, eller du kan også gøre det i Visual Studio under View, Server Explorer og Stored Procedure. Du skal selvfølgelig være opkoblet til databasen her.
Jeg foretrækker selv SQL Server 2005 Express at arbejde i, og den er gratis.
Når du har oprettet SP, og selvfølgelig uden den melder fejl, prøver du at vælge Executing, og kan så se resultatet direkte. Herefter når alt er ok, kan du kalde den fra programkoden.
Som jeg kan se, er du ikke helt med på dette, men når du har fået Stored Procedure til at virke direkte på DB niviau, så skal jeg nok prøve at hjælpe med programkoden, hvis du ikke selv kan finde eksempler via Google til kald af SP.
Ok nu executer min stored procedure ihvertfald uden fejl, men hvordan er det jeg skulle kalde navnet, fordi jeg kan ikke bare skrive det sådan her: objcmd.CommandType = CommandType.StoredProcedure dbo.getTimeHour;
Jeg har trukket et eksempel ud fra min code og konverteret fra VB til C#. Du kan nok selv tilpasse det til din kode, jeg har ikke meget tid her til morgen.
Ja, men som jeg skrev, skulle du selv tilpasse det eksempel jeg blot trak ud fra min kode. SQLCheckDBAdgang og intOrdbogCount er nogle globale variabler i min kode, og dem har du jo ikke. Dvs. f.eks.
if (reader.Read) { //Der er poster indenfor aktuel time //Her indsætter du så din kode og //henter værdien i tid fra reader(0) som kommer fra SP; } else { // Der er ingen poster indenfor aktuel time //Her indsætter du så din kode til håndtering af dette }
ok nu har jeg defineret tid så der ikke kommer en rød streg under, sådan her: string tid; men jeg prøver også at trække Hour ud af strengen som du siger jeg skal men jeg tror ikke at jeg gør det rigtigt, fordi der er stadig en rød streg under Hour.
'Du trækker time ud fra strengen som indeholder dato og tid 'Et eksempel: tid = 20-02-2009 06:05:40 string hour = Strings.mid(tid, 12, 2); 'Så bliver hour = "06"
'Men lad os i stedet lave det sådan:
System.DateTime tid = null; while (rdr.Read) { tid = rdr(0); } if (tid == null) { //Erstat dette med din kode ikke.Text = "Ingen poster"; } else { //Erstat dette med din kode tekst.text = tid; }
if (tid == null) { ikke.Text = "Ingen tidspunkter fundet i databasen indenfor denne time : " + DateTime.Now.Hour; } else { text.Text = "Vi sammenligner " + DateTime.Now.Hour + " med " + tid.Hour + " de er faktisk " + DateTime.Now + " og " + tid; }
if (tid == null) { ikke.Text = "Ingen tidspunkter fundet i databasen indenfor denne time : " + DateTime.Now.Hour; } else { test.Text = "Vi sammenligner " + DateTime.Now.Hour + " med " + tid.Hour + " de er faktisk " + DateTime.Now + " og " + tid; }
Det er nok mig der ikke skriver det helt rigtigt i C#.
Jeg koder som tidligere nævnt i VB, og prøver at oversætte det.
Du bliver nok nødt til at bede om hjælp hos en som koder i C#, men du er da nået et skridt videre, og du har fået en Stored Procedure til at virke.
Synes du skal arbejde videre ud fra denne, pga. :
1. SP er betydelig mere effektiv, arbejder direkte på Serveren. 2. Er nem at vedligeholde og indeholder SQL i SP fremfor i koden. 3. Kan indeholde parametre, som du så kalder med disse fra koden. 4. Du ser straks om SQL syntaksen er OK. 5. Se resultat af forespørgelsen direkte i DB. 6. Kan forespørge med parametre også i databasen. 7. Nem at kalde fra koden.
Ja, sidstnævnte er du nok ikke enig i, men når du først lærer det, så vil du garantere være enig.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.