Avatar billede kischi Novice
20. februar 2009 - 23:51 Der er 35 kommentarer og
1 løsning

en lille fejl i min kode

Hej jeg prøver at tjekke om et tidspunkt er i den samme time som systemtiden.

Men der kommer en rød streg under noget af koden, så det ikke virker, sådan ser alt min kode ud:

SqlConnection ObjConn = new SqlConnection();

        ObjConn.Open();
        SqlCommand ObjCmd = new SqlCommand();
        ObjCmd = new SqlCommand("dbo.spGetTimeHour", ObjConn);
        ObjCmd.CommandType = CommandType.StoredProcedure;
        ObjCmd.Connection = ObjConn;
        SqlDataReader reader = ObjCmd.ExecuteReader();

        System.DateTime tid = null;

        while (reader.Read())
        {
            tid = reader[0];
        }

        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;
        }


        reader.Close();
        ObjConn.Close();

Fejlen kommer ved:

System.DateTime tid = null;

hvis jeg holder musen over siger den:

cannot convert null to 'system.datetime' because it is a non-nullable value type.


og der kommer også fejl her:

tid = reader[0];

hvis jeg holder musen over siger den:

cannot implicitly convert type 'object' to 'system.datetime'. An explixit conversion exists (are you missing a cast?)


Så ved i hvad jeg gør forkert? Og ved i hvordan jeg undgår fejlen?
Håber også i forstår hvad jeg mener?
Avatar billede arne_v Ekspert
20. februar 2009 - 23:59 #1
DateTime? tid = null;

og

tid = (DateTime)reader[0];

bør compile (om de gør det du ønsker er så en anden sag)
Avatar billede kischi Novice
21. februar 2009 - 00:09 #2
Ja ok, så fjernede jeg ihvertfald de fejl, men så kom der en ny nede i min if sætning:

            test.Text = "Vi sammenligner " + DateTime.Now.Hour + " med " + tid.Hour + " de er faktisk " + DateTime.Now + " og " + tid;


der er en rød streg ved:

tid.Hour

Den siger: system.nullable<system.datetime> does not contain a definition for 'Hour' and no extension method 'Hour' acepting a first arguement of type system.nullable<system.datetime> could be found (are you missing a using directive or an assembly reference?)

Ved du så hvad jeg skal gøre med det nu?

Tak
Avatar billede kischi Novice
21. februar 2009 - 00:10 #3
Du kan se fejlen på: http://radio.web.surftown.dk/
Avatar billede arne_v Ekspert
21. februar 2009 - 00:17 #4
+ tid.Value.Hour +
Avatar billede kischi Novice
21. februar 2009 - 00:27 #5
Ok tak, nu kommer der ihvertfald ikke fejl i det mere.
Men ved du hvad fejlen kan være nu.

Der var en som hjalp mig med at lave en stored procedure i sql forummet, og han hjalp mig også med lidt kodning, men han skrev normalt i vb sagde han og jeg skriver jo i c#
Så det kan godt være at han havde lavet nogle fejl, og jeg har prøvet at ændre det til c# så godt som jeg kunne, men ved ikke om det er helt rigtigt.

Nu kommer der ihvertfald en fejl som du kan se på: http://radio.web.surftown.dk/

og alt min kode ser sådan ud nu:

SqlConnection ObjConn = new SqlConnection();

        ObjConn.Open();
        SqlCommand ObjCmd = new SqlCommand();
        ObjCmd = new SqlCommand("dbo.spGetTimeHour", ObjConn);
        ObjCmd.CommandType = CommandType.StoredProcedure;
        ObjCmd.Connection = ObjConn;
        SqlDataReader reader = ObjCmd.ExecuteReader();

        System.DateTime? tid = null;

        while (reader.Read())
        {
            tid = (DateTime)reader[0];
        }

        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.Value.Hour + " de er faktisk " + DateTime.Now + " og " + tid;
        }


        reader.Close();
        ObjConn.Close();
Avatar billede arne_v Ekspert
22. februar 2009 - 02:42 #6
Der mangler en connection string.

SqlConnection ObjConn = new SqlConnection("et eller andet her");
Avatar billede kischi Novice
22. februar 2009 - 09:55 #7
Jeg tror ikke helt det kan være det.
Fordi jeg har min connectionstring over pageload, så den burde også virke hernede. Men nu har jeg da taget den herned også, men det virker stadig ikke.

Kan det være noget med at det skal stå i stored procedure eller et eller andet?

Nu ser min kode sådan her ud:

SqlConnection objconn = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstring"].ToString());

        SqlConnection ObjConn = new SqlConnection();

        ObjConn.Open();
        SqlCommand ObjCmd = new SqlCommand();
        ObjCmd = new SqlCommand("dbo.spGetTimeHour", ObjConn);
        ObjCmd.CommandType = CommandType.StoredProcedure;
        ObjCmd.Connection = ObjConn;
        SqlDataReader reader = ObjCmd.ExecuteReader();

        System.DateTime? tid = null;

        while (reader.Read())
        {
            tid = (DateTime)reader[0];
        }

        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.Value.Hour + " de er faktisk " + DateTime.Now + " og " + tid;
        }


        reader.Close();
        ObjConn.Close();
Avatar billede arne_v Ekspert
22. februar 2009 - 16:01 #8
Det der hjælper ikke.

// connection ved navn objconn som har en connection string
SqlConnection objconn = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstring"].ToString());
// connection ved navn ObjConn som ikke her connection string
SqlConnection ObjConn = new SqlConnection();
// du bruger ObjConn

brug:

SqlConnection ObjConn = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstring"].ToString());
Avatar billede kischi Novice
22. februar 2009 - 18:37 #9
Ok tak, men nu kommer den med en ny fejl:

Invalid object name 'PROGRAM'.

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

min kode ser nu sådan ud:


SqlConnection ObjConn = new SqlConnection(ConfigurationManager.ConnectionStrings["connectionstring"].ToString());

        ObjConn.Open();
        SqlCommand ObjCmd = new SqlCommand();
        ObjCmd = new SqlCommand("dbo.spGetTimeHour", ObjConn);
        ObjCmd.CommandType = CommandType.StoredProcedure;
        ObjCmd.Connection = ObjConn;
        SqlDataReader reader = ObjCmd.ExecuteReader();

        System.DateTime? tid = null;

        while (reader.Read())
        {
            tid = (DateTime)reader[0];
        }

        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.Value.Hour + " de er faktisk " + DateTime.Now + " og " + tid;
        }


        reader.Close();
        ObjConn.Close();

???
Avatar billede arne_v Ekspert
22. februar 2009 - 23:51 #10
Det ligner en fejl i din SP.
Avatar billede arne_v Ekspert
22. februar 2009 - 23:52 #11
Men jeg tror at det her er på vej ud af en forkert tangent.

Kan du prøve og forklare hvilket problem som dem kode skal løse for brugerne ?
Avatar billede kischi Novice
23. februar 2009 - 06:04 #12
Ja det vil jeg prøve.

Det som skal ske for brugerne er at når system tiden for eksempel er klokken 15:00, og hvis der er noget på programmet den dag klokken 15:00 så skal der komme en rød prik ud for den program som har den samme tid som systemtiden, og der skal den være indtil næste program starter.

Det er det der skal ske i sidste endne.

Du kan muligvis se hvad jeg mener med forskellige tidspunkter her: http://radiojazz.dk/default.aspx

Forstår du hvad jeg mener?
Avatar billede arne_v Ekspert
24. februar 2009 - 04:29 #13
noget a la:

DateTime now = DateTime.Now;
SqlCommand cmd = new SqlCommand("SELECT starttid,sluttid,emne FROM dintabel", con);
SqlDataReader rdr = cmd.ExecuteReader();
while(rdr.Read())
{
    DateTime starttid = (DateTime)rdr[0];
    DateTime sluttid;
    if(rdr.IsDBNull(1))
      sluttid = starttid.AddHours(1);
    else
      sluttid = (DateTime)rdr[1];
    string emne = (string)rsr[2];
    boolean reddot = starttid <= now && now < sluttid;
    // whatever
}
rdr.Close();
Avatar billede kischi Novice
24. februar 2009 - 06:56 #14
Ok det vil jeg prøve. Men der kommer en fejl ved Boolean.

Den siger: the type or namespace name boolean could not be found (Are you missing a using directive or an assembly refference?)

Og så lige et andet spørgsmål, nu står der faktisk kun start tidspunkter i min db. Ville man godt kunne gøre så den røde prik bare rykker ned til det næste punkt når næste program starter, så man ikke behøver en sluttid? eller ville det være optimalt at oprette en ny collonne i db til sluttid?

Og der hvor der står: reddot efter boolean, skal det udskiftes med et billede eller hvordan finder den bare en rød prik?

Tak
Avatar billede arne_v Ekspert
24. februar 2009 - 14:19 #15
ups - det hedder bool i C#

reddot er bare et flag for om den røde prik skal vises - næste problem er så hvordan du får vist en rød prik når flaget er sat
Avatar billede kischi Novice
24. februar 2009 - 15:02 #16
Ja ok, nu kommer der ihvertfald ikke fejl ved bool mere :-D

Men så havde jeg også lige et andet spørgsmål som vidst lige blev glemt at svare på:

nu står der faktisk kun start tidspunkter i min db. Ville man godt kunne gøre så den røde prik bare rykker ned til det næste punkt når næste program starter, så man ikke behøver en sluttid? eller ville det være optimalt at oprette en ny collonne i db til sluttid?


Forstår du mit spørgsmål?
Avatar billede arne_v Ekspert
24. februar 2009 - 15:08 #17
DateTime now = DateTime.Now;
SqlCommand cmd = new SqlCommand("SELECT starttid,emne FROM dintabel", con);
SqlDataReader rdr = cmd.ExecuteReader();
while(rdr.Read())
{
    DateTime starttid = (DateTime)rdr[0];
    DateTime sluttid = starttid.AddHours(1);
    string emne = (string)rdr[2];
    bool reddot = starttid <= now && now < sluttid;
    // whatever
}
rdr.Close();
Avatar billede kischi Novice
24. februar 2009 - 15:38 #18
Nu kommer der en fejl med at
ExecuteReader requires an open and available Connection. The connection's current state is closed.

så har jeg prøvet at skrive: rdr.open();
nogle steder, men jeg ved ikke helt hvor fordi uanset hvor jeg skriver det kommer der en rød streg under?

Jeg har jo ændret lidt i min sql statement og på nogle navne, men jeg tror ikke det er det som gør forskellen.

Du kan se fejlen på: http://radio.web.surftown.dk/default.aspx

Og hele min kode ser nu sådan ud:

SqlCommand objcmd = new SqlCommand();

    objcmd.Connection = ObjConn;
    objcmd.CommandType = CommandType.Text;
       
        DateTime now = DateTime.Now;
        objcmd.CommandText = "SELECT tid FROM PROGRAM WHERE CONVERT(VARCHAR, date, 105) = CONVERT(VARCHAR, GETDATE(), 105";
        SqlDataReader rdr = objcmd.ExecuteReader();
     
        while(rdr.Read())
         
        {
           
            DateTime starttid = (DateTime)rdr[0];
            DateTime sluttid = starttid.AddHours(1);
            string emne = (string)rdr[2];
            bool reddot = starttid <= now && now < sluttid;
   
        }
       

            rdr.Close();
Avatar billede kischi Novice
28. februar 2009 - 13:54 #19
Nu har jeg prøvet igen, og nu kunne jeg godt indsætte ObjConn.open();

Men den kommer stadig med samme fejl:

ExecuteReader requires an open and available Connection. The connection's current state is closed.

Du kan se fejlen på: http://radio.web.surftown.dk/

Nu ser alt min kode sådan her ud:

DateTime now = DateTime.Now;
        SqlCommand cmd = new SqlCommand("SELECT tid FROM PROGRAM", ObjConn);
        SqlDataReader rdr = cmd.ExecuteReader();
        ObjConn.Open();
        while (rdr.Read())
        {
            DateTime starttid = (DateTime)rdr[0];
            DateTime sluttid = starttid.AddHours(1);
            string emne = (string)rdr[2];
            bool reddot = starttid <= now && now < sluttid;
           
        }
        rdr.Close();

Hvad gør jeg forkert?
Avatar billede arne_v Ekspert
28. februar 2009 - 13:57 #20
ObjConn.Open();

skal før

SqlDataReader rdr = cmd.ExecuteReader();
Avatar billede kischi Novice
28. februar 2009 - 14:05 #21
Ok det har jeg så prøvet nu, men så får jeg bare en ny fejl:

Index was outside the bounds of the array.

nu ser koden sådan ud:

DateTime now = DateTime.Now;
        SqlCommand cmd = new SqlCommand("SELECT tid FROM PROGRAM", ObjConn);

        ObjConn.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
       
        while (rdr.Read())
        {
            DateTime starttid = (DateTime)rdr[0];
            DateTime sluttid = starttid.AddHours(1);
            string emne = (string)rdr[2];
            bool reddot = starttid <= now && now < sluttid;
           
        }
        rdr.Close();
Avatar billede arne_v Ekspert
28. februar 2009 - 15:10 #22
string emne = (string)rdr[2];

giver fejl fordi du kun selecter en kolonne som har index 0.
Avatar billede kischi Novice
28. februar 2009 - 15:32 #23
Ok, hvilket tal burde jeg så skrive istedet for 2? Eller hvor kan jeg se hvilket nummer kollonne det er?
Avatar billede arne_v Ekspert
28. februar 2009 - 15:38 #24
SqlCommand cmd = new SqlCommand("SELECT tid FROM PROGRAM", ObjConn);

tid = kolonne 0

ikke flere koloenner

SqlCommand cmd = new SqlCommand("SELECT tid,emne FROM PROGRAM", ObjConn);

tid = kolonne 0
emne = kolonne 1

o.s.v.
Avatar billede kischi Novice
28. februar 2009 - 15:48 #25
Ja ok, nu kommer der ikke nogle fejl :-D

Men der sker heller ikke noget, så jeg kan ikke se om koden virker.
Men nu kommer næste skridt vel ik?
Nu skal der jo ske noget tiden er den samme som systemtiden.

Ved du så hvad jeg skal gøre nu?
Avatar billede arne_v Ekspert
28. februar 2009 - 16:09 #26
Hvordan outputter du tid og emne nu ?
Avatar billede kischi Novice
28. februar 2009 - 16:15 #27
Min kode ser sådan ud nu:

DateTime now = DateTime.Now;
        SqlCommand cmd = new SqlCommand("SELECT tid,txt FROM PROGRAM", ObjConn);

        ObjConn.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
       
        while (rdr.Read())
        {
            DateTime starttid = (DateTime)rdr[0];
            DateTime sluttid = starttid.AddHours(1);
            string txt = (string)rdr[1];
            bool reddot = starttid <= now && now < sluttid;
           
        }
        rdr.Close();
        ObjConn.Close();


og min Db:

Tid er af datatype datetime.
og emne er af datatype text.

Var det svar nok?
Avatar billede arne_v Ekspert
28. februar 2009 - 16:40 #28
Faktisk ikke.

Det virker fint nu.

Men nu skal du vel have vist den røde dot.

Så nu skal vi derover hvor du skal vise tid, tekst og gerne rød dot.
Avatar billede kischi Novice
28. februar 2009 - 16:47 #29
Ja lige precis, altså teksten og tiden bliver jo egentlig vist. Men nu skal den røde dot bare også vises ud for den rigtige tid.

hvordan kan jeg så gøre det?
Forstår du hvad jeg mener?
Avatar billede arne_v Ekspert
28. februar 2009 - 16:56 #30
Ja.

Men jeg skal se den kode hvor du idag viser tid og tekst for at kunne forklare hvordan du også får vist den røde dot.
Avatar billede kischi Novice
28. februar 2009 - 17:08 #31
nå ok så har jeg forstået :-D

min kode ser sådan ud:


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)";



               
               
            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 kischi Novice
01. marts 2009 - 22:37 #32
Var det, det stykke kode du havde brug for. For at finde ud af hvordan jeg kunne få vist den røde prik?
Avatar billede arne_v Ekspert
03. marts 2009 - 04:07 #33
Nu er jeg forvirret.

den kode der har jo ikke noget med den kode vi lige har diskuteret at gøre.
Avatar billede kischi Novice
03. marts 2009 - 11:08 #34
Nej men den kode der står der, trækker dagens program ind på siden, og den kode du gav mig skulle så finde ud af om der var et tidspunkt på siden som var det samme som system tiden og så indsætte en rød prik ud fra det.

Her er koden for hele siden, så du kan se hvordan det hele ser 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)
    {
        GetLabel();

            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)";



               
               
            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();

               

            }
       

    }
    private void GetLabel()
    {

        DateTime now = DateTime.Now;
        SqlCommand cmd = new SqlCommand("SELECT tid,txt FROM PROGRAM", ObjConn);

        ObjConn.Open();
        SqlDataReader rdr = cmd.ExecuteReader();
       
        while (rdr.Read())
        {
            DateTime starttid = (DateTime)rdr[0];
            DateTime sluttid = starttid.AddHours(1);
            string txt = (string)rdr[1];
            bool reddot = starttid <= now && now < sluttid;
           
        }
        rdr.Close();
        ObjConn.Close();

    }

        }

   

Det er alt koden på codebehind siden, så det kode der står til sidst, det er det du gav mig. Men det er ikke det der trækker teksten ind på siden fra min db.

Forstår du nu hvad jeg mener? :-D
Avatar billede kischi Novice
07. marts 2009 - 19:10 #35
Forstod du nu hvad jeg menter med den kode jeg skrev?

Mvh. Adam
Avatar billede kischi Novice
25. januar 2011 - 16:52 #36
så lukker jeg 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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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