Avatar billede kischi Novice
11. februar 2009 - 17:53 Der er 27 kommentarer og
1 løsning

If sætning

hej jeg prøver at lave en if sætning, hvor der også er kaldt på min ms sql database i forvejen.
og så vil jeg have noget til at ske hvis system tiden er det samme som tiden i min db.
Men jeg ved ikke om man kan skrive kollonne navnet i if sætningen eller hvordan man ellers skulle skrive det.

kollonnen i min db hedder tid.
men tid kan ikke bare skrives sådan i if sætningen.

Sådan ser koden ud som jeg har skrevet det:

objcmd.CommandText = "SELECT * FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";

                if (DateTime.Now.Hour == tid )
                {
                    test.Text = "test 1";
                }
                else
                {
                    ikke.Text = "test 2";
                }

Jeg håber i forstår hvad jeg mener og i kan hjælpe mig?
Avatar billede arne_v Ekspert
11. februar 2009 - 18:00 #1
Noget a la:

objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";
DateTime tid = (DateTime)objcmd.ExecuteScalar();
if (DateTime.Now.Hour == tid )

vil jeg tro
Avatar billede kischi Novice
11. februar 2009 - 18:13 #2
Det virker stadig ikke, der kommer en rød streg under(DateTime.Now.Hour == tid)

så den er nok stadig skrevet forkert.

Men nu ser det sådan ud:

objcmd.CommandText = "SELECT * FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";
                DateTime tid = (DateTime)objcmd.ExecuteScalar();

                if (DateTime.Now.Hour == tid)
                {
                    test.Text = "test 1";
                }
                else
                {
                    ikke.Text = "test 2";
                }

?
Avatar billede arne_v Ekspert
11. februar 2009 - 18:15 #3
if (DateTime.Now.Hour == tid.Hour)
Avatar billede kischi Novice
11. februar 2009 - 18:56 #4
Ok, men nu kommer der en fejl når jeg prøver at se siden, den skriver:
ExecuteScalar requires an open and available Connection. The connection's current state is closed.

du kan selv se det på:
http://radio.web.surftown.dk/default.aspx
Avatar billede arne_v Ekspert
11. februar 2009 - 19:02 #5
Saa mangler du at kalde Open paa din Connection (det er udenfor koden vi har kigget paa hidtil).
Avatar billede kischi Novice
11. februar 2009 - 19:23 #6
Jeg har prøvet at placere kodestumpen lidt forskellige steder på siden, men kan ikke rigtigt få det til at virke.

Kan du overskue hvor koden skal ind henne, så ser alt min kode ud:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web.Security;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page
{
                SqlConnection objconn = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstring"].ToString());


    protected void Page_Load(object sender, EventArgs e)
    {
       

            SqlCommand objcmd = new SqlCommand();


            objcmd.Connection = objconn;
            objcmd.CommandType = CommandType.Text;

            if (DateTime.Now.Hour > 3)
            {

                objcmd.CommandText = "SELECT * FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";
                DateTime tid = (DateTime)objcmd.ExecuteScalar();
                if (DateTime.Now.Hour == tid.Hour)
                {
                    test.Text = "test 1";
                }
                else
                {
                    ikke.Text = "test 2";
                }
         
            SqlDataReader reader = null;

            objconn.Open();
            reader = objcmd.ExecuteReader();
            program.DataSource = reader;
            program.DataBind();

            objconn.Close();
            }
   
        else
            {
                objcmd.CommandText = "SELECT * FROM PROGRAM WHERE DATE = DATEADD(day, DATEDIFF(day, 1, GETDATE()), 0)";

             

                SqlDataReader reader = null;

                objconn.Open();
                reader = objcmd.ExecuteReader();
                program.DataSource = reader;
                program.DataBind();

               

            }
    }


        }
Avatar billede arne_v Ekspert
11. februar 2009 - 19:39 #7
Der mangler:

objconn.Open();
Avatar billede kischi Novice
11. februar 2009 - 20:00 #8
Ok så nu har jeg sat objconn.Open(); ind over
DateTime tid = (DateTime)objcmd.ExecuteScalar();

så det ser sådan her ud:

objcmd.CommandText = "SELECT * FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";

                objconn.Open();
               
                DateTime tid = (DateTime)objcmd.ExecuteScalar();
                if (DateTime.Now.Hour == tid.Hour)
                {
                    test.Text = "over 3";
                }
                else
                {
                    ikke.Text = "under 3";
                }

men så kommer der en anden fejl:

Specified cast is not valid.

kan ses på: http://radio.web.surftown.dk/

skal objconn(); placeres et andet sted eller er det det rigtige sted? Eller hvad er det så?
Avatar billede arne_v Ekspert
11. februar 2009 - 20:09 #9
Det sted er OK.

Men SQL skal vaere anderledes:

objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";
Avatar billede kischi Novice
11. februar 2009 - 20:27 #10
Ja nu kommer der ihvertfald ikke nogle fejl, men det jeg ville have skulle ske virker ikke.

Jeg ville have at hvis system tiden er det samme som tiden db så skal den skrive, virker ellers skal den skrive virker ikke.

men nu er klokken i den 20. time og jeg har indsat en post i db hvor kl. er 20.

Men den udskriver det som om den ikke registrere at en af posterne er samme tid som system tiden.

nu ser koden sådan ud:

SqlCommand objcmd = new SqlCommand();


        objcmd.Connection = objconn;
        objcmd.CommandType = CommandType.Text;

        objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";


        objconn.Open();

        DateTime tid = (DateTime)objcmd.ExecuteScalar();
        if (DateTime.Now.Hour == tid.Hour)
        {
            test.Text = "virker";
        }
        else
        {
            ikke.Text = "virker ikke";
        }

        objconn.Close();

du kan se hvad jeg mener på: http://radio.web.surftown.dk/

Ved du hvad problemmet kunne være og ved du hvad jeg mener?

Tak. :-D
Avatar billede arne_v Ekspert
11. februar 2009 - 20:34 #11
Jeg kan ikke gennemskue hvad fejlen er.

Proev og udskriv noget mere information, saa du kan se hvad der sker.
Avatar billede kischi Novice
11. februar 2009 - 20:45 #12
Ok, hvad mener du med at udskriv noget mere information?

Nu har jeg ihvertfald prøvet at ændre if sætningen til
if (DateTime.Now.Hour > 3)

og det virker, så den registrere åbenbart at klokken er over 3 men så er der nok problemer med at den ikke registrere hvad tiden er i min db. Så jeg ved ikke om det her er skrevet rigtigt:
== tid.Hour

Den kan jo godt registrere hvad system tiden er, bare ikke i min db.

Jeg har også lige svært ved at se hvad problemet kan være. :-(
Avatar billede arne_v Ekspert
11. februar 2009 - 20:53 #13
eksempel:

debugarea.Text = "Vi sammenligner " + DateTime.Now.Hour + " med " + tid.Hour + " de er faktisk " + DateTime.Now + " og " + tid;
Avatar billede kischi Novice
11. februar 2009 - 21:14 #14
Der står hele tiden at den sammenligner med kl. 21:00
jeg har også prøvet at skrive minute istedet for hour men der står stadig 21:00

Jeg startede på at teste den da kl. var 20:58 og der stod så at vi sammenligner 20 med 21 så der står hele tiden 21, jeg aner ikke hvorfår.

jeg kommer også i tanke om, der er jo flere poster i min db, alle sammen med forskellig tid, hvordan skulle den vide hvilken en den skulle sammenlignes med.

Ved du hvad jeg mener?
Og kan det være det, der er problemet?
Avatar billede arne_v Ekspert
11. februar 2009 - 21:20 #15
ExecuteScalar henter kun en vaerdi - den foerste kolonne i den foerste raekke.

Maaske skal du have en WHERE mere paa din SQL ??
Avatar billede kischi Novice
11. februar 2009 - 21:43 #16
Ja ok, nu sammenligner den ihvertfald med 12 som er den første kollonne i den første række.

Ja jeg skal nok lave en anden WHERE som siger hvor tid = system tid.

Det vil jeg prøve mig frem med.

Du ved ikke hvordan man skulle skrive det vel?
Jeg ved godt jeg ikke er i et sql forum nu næmlig.

Men tusind tak for hjælpen, det har været en stor hjælp med det indtil videre. :-D
Avatar billede kischi Novice
12. februar 2009 - 00:18 #17
Hej igen,

Jeg tænkte på at hvis jeg ændre min sql statement så den kun går efter tiden sådan:

objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, tid, 108) = CONVERT(VARCHAR, GETDATE(), 108)";

Skal jeg så ikke også ændre
DateTime tid = (DateTime)objcmd.ExecuteScalar();

til noget andet, fordi du siger at den kun går efter første kollonne i første række, men det skal den jo ikke hvis den kan finde tiden længere nede på siden.

Forstår du mit spørgsmål?
Avatar billede arne_v Ekspert
12. februar 2009 - 02:30 #18
En SELECT returnerer et antal rækker - fra nul rækker til rigtigt mange rækker.

Den SELECT du viser - hvor mange rækker vil den returnere ?

Hvis mere end en - hvilken af værdierne skal bruges i testet ?
Avatar billede kischi Novice
12. februar 2009 - 08:58 #19
Jeg vil have sammenlignet alle tiderne med system tiden, og så hvis der er en af dem som er det samme som system tiden, så skal den udskrive testet ellers skal den gøre noget andet.

Men jeg tror det er det jeg gør i if sætningen, men nu skal jeg bare kunne sammenligne med alle tiderne istedet for kun første række. Men jeg ved ikke helt hvordan jeg gør det?

Forstår du hvad jeg mener?
Avatar billede arne_v Ekspert
15. februar 2009 - 05:23 #20
Så skal du enten:
- erstatte ExecuteScalar med en ExecuteReader
- have en while løkke
eller:
- putte en betingelse i din WHERE så du kun henter records der matcher dit kriterie
Avatar billede kischi Novice
16. februar 2009 - 22:59 #21
Nu har jeg prøvet at erstatte ExecuteScalar med en ExecuteReader

men det virker ikke, jeg tror at jeg mangler noget?

nu ser det bare sådan ud:

DateTime tid = (DateTime)objcmd.ExecuteReader();

Ved du hvad der er galt?
Avatar billede arne_v Ekspert
16. februar 2009 - 23:23 #22
objReader = objcmd.ExecuteReader();
while(objReader.Read())
{
    DateTime tid = (DateTime)objReader[0];
    // test om denne tid opfyler kriterie
}
objReader.Close();
Avatar billede kischi Novice
16. februar 2009 - 23:36 #23
Nu kommer der en rød streg under: objReader

og der står:
the name objreader does not exist in the current context.

jeg skal vel initialisere den ik?

nu ser koden sådan ud, er det rigtigt:

SqlCommand objcmd = new SqlCommand();


        objcmd.Connection = objconn;
        objcmd.CommandType = CommandType.Text;

        objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";


          objReader = objcmd.ExecuteReader();
        while(objReader.Read())
        {
            DateTime tid = (DateTime)objReader[0];        }

        objReader.Close();
Avatar billede arne_v Ekspert
17. februar 2009 - 00:02 #24
Den skal naturligvis erklæres som SqlDataReader et eller andet sted.
Avatar billede kischi Novice
17. februar 2009 - 00:28 #25
Ja ok, det virker også nu, men på samme måde som før, hvor den kun tester den øverste tid.

men den skal jo teste alle tiderne?

min kode ser nu sådan her ud:

SqlCommand objcmd = new SqlCommand();


        objcmd.Connection = objconn;
        objcmd.CommandType = CommandType.Text;

        objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105)";

        SqlDataReader objReader;


        objconn.Open();
        objReader = objcmd.ExecuteReader();
       
        while (objReader.Read())
        {
            DateTime tid = (DateTime)objReader[0];
            test.Text = "Vi sammenligner " + DateTime.Now.Hour + " med " + tid.Hour + " de er faktisk " + DateTime.Now + " og " + tid;
        }

        objReader.Close();

        objconn.Close();

du kan se det på: http://radio.web.surftown.dk/


Forstår du hvad jeg mener og hvad jeg vil have til at ske? :-D
Avatar billede arne_v Ekspert
17. februar 2009 - 00:39 #26
Den der kode vil teste alle de tider som SELECT returnerer.

(eller ville hvis der var et test inde i while løkken)
Avatar billede kischi Novice
17. februar 2009 - 00:50 #27
Men skulle der så ikke stå at den også sammenligner med 15 i denne linje, Vi sammenligner 0 med 13 de er faktisk 17-02-2009 00:47:14 og 02-02-2009 13:00:00

og hvad mener du med:
(eller ville hvis der var et test inde i while løkken)

Er der da ikke det?
Avatar billede kischi Novice
25. januar 2011 - 16:54 #28
Jeg lukker lige
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester