Avatar billede larsny Nybegynder
23. september 2004 - 18:42 Der er 39 kommentarer og
1 løsning

Loop i asp.net (c#)

(kalender)
Jeg skal lave en løkke der køre igennem alle 24 timer, hvor den ved hver time skal hente alle de data'er i db'en som starter i den time...

jeg har denne executer:
OleDbDataReader MyDataReader = MyCommand.ExecuteReader();

navn på colonne med start tid:
starttime

havde tænkt noget i stilen med:
for (int i=0; i <24; i++) {
--Hvis starttime.hour == i så læg ind i tabel--
label += MyDataReader["subject"] + "<br>";
}
tabel.Text = label;

jeg ved bare ikke hvordan den skal se ud...?
Avatar billede arne_v Ekspert
23. september 2004 - 18:49 #1
Måske:

OleDbDataReader MyDataReader = MyCommand.ExecuteReader();
int stix = MyDataReader.GetOrdinal("starttime");
while(MyDataReader.Read())
{
  DateTime st = MyDataReader.GetDateTime(stix);
  if(st.Hour == denrigtigetime)
  {
      // den passer
  }
}
}
Avatar billede arne_v Ekspert
23. september 2004 - 18:50 #2
Men var det ikke bedre at bruge en WHERE betingelse på SELECT statement ?
Avatar billede larsny Nybegynder
23. september 2004 - 18:55 #3
på select har jeg en where der tjekker at det kune er dem der passer til dagen i dag så den ikke henter hele db'en...
men hvordan kan den kode sørge for at det kommer i den rigtige rækkefølge...?

havde tænkte på at den skulle tage alle dem der passer til klokken 1 og sætte dem ind i samme <td></td>.. og så gå videre til klokken 2 og sætte dem ind i <td></td> så du får en liste lige som Outlook kalenderen...
Avatar billede jakobandersen Nybegynder
23. september 2004 - 18:57 #4
Prøv at kigge på GROUP BY og data/tids funktionerne i dit DBMS
Avatar billede arne_v Ekspert
23. september 2004 - 18:58 #5
Du kan vel også sætte time betingelsen på i WHERE.

Det er ganske vist ikke standard SQL, men de fleste SQL varianter kan det.

Hvilken database bruger du ?
Avatar billede larsny Nybegynder
23. september 2004 - 18:59 #6
arne v->
hvordan gør jeg det i en løkke...?
lige nu bruger jeg acces men det skal senere konventeres til MSSQL
Avatar billede arne_v Ekspert
23. september 2004 - 19:02 #7
SQLServer:

WHERE DATEPART(hh,feltnavn) = 17
Avatar billede jakobandersen Nybegynder
23. september 2004 - 19:03 #8
arne_v: Vil det sige at du vil lave 24 SQL forespørgsler for at få udfyldt kalenderen?
Avatar billede arne_v Ekspert
23. september 2004 - 19:03 #9
Access:

WHERE DATEPART("h",feltnavn)=17
Avatar billede arne_v Ekspert
23. september 2004 - 19:04 #10
Så du laver en for løkke fra 0 til 23, indeni løkken konstruerer du en SQL
sætning som henter dem du skal bruge ved at sætte WHERE betingelse på.
Avatar billede arne_v Ekspert
23. september 2004 - 19:05 #11
Kan en WHERE som sikrer sig at tiden ligger mellem f.eks. 23-09-2004 17:00
og 23-09-2004 18:00 ikke bruges til det samme ?
Avatar billede larsny Nybegynder
23. september 2004 - 19:07 #12
jo bare fra kl 00:00 til 01:00 og så 01:00 til 02:00
jeg prøver lige at sætte den ind, og så skriver jeg tilbage :)
tak
Avatar billede arne_v Ekspert
23. september 2004 - 19:07 #13
Er det en kalender ?

Så forstår jeg slet ikke problemet !

Til en kalender henter du vel alle poster og viser dem uden at fravælge nogen !?
Avatar billede larsny Nybegynder
23. september 2004 - 20:05 #14
jeg får: CS1002: ; var forventet ----> (i linje 2)

ved denne kode:

for (int i=0; i < 24; i++) {
String SQLString2 = "SELECT subject, eventdate, allday, starttime, id FROM calendar where eventdate = #" + DateTime.Now.Date + "# and DATEPART("h", timestart)=" + i + "";
}
Avatar billede arne_v Ekspert
23. september 2004 - 20:07 #15
"" bruges i C# og skal derfor escapes.

String SQLString2 = "SELECT subject, eventdate, allday, starttime, id FROM calendar where eventdate = #" + DateTime.Now.Date + "# and DATEPART(\"h\", timestart)=" + i + "";
Avatar billede arne_v Ekspert
23. september 2004 - 20:07 #16
Og jeg forstå som sagt ikke helt ideen i den kalender
Avatar billede larsny Nybegynder
23. september 2004 - 20:34 #17
har nu prøvet at lave denne kode:

string TestLabel = "";
    for (int i=0; i < 24; i++) {
    String SQLString2 = "SELECT subject, eventdate, allday, starttime, id FROM calendar where eventdate = #" + DateTime.Now.Date + "# and DATEPART(\"h\", timestart)=" + i;
    OleDbCommand MyCommand2 = new OleDbCommand(SQLString2, MyConnection);
    OleDbDataReader MyDataReader2 = MyCommand2.ExecuteReader();
    TestLabel += MyDataReader2 + "<br>";
    MyDataReader2.Close();
    }
testlabel.Text = TestLabel;

men får denne fejl:
System.Data.OleDb.OleDbException: Der er ikke angivet nogen værdi for en eller flere krævede parametre.

Det der er meningen her er at den kun skal vise de ting der er på kalenderen i dag... derfor skal den ikke vise de andre... det laver jeg script til senere...
Avatar billede arne_v Ekspert
23. september 2004 - 20:52 #18
Kommer den dato ud i det rigtige format ?
Avatar billede larsny Nybegynder
23. september 2004 - 20:58 #19
ups var kommet til at skrive timestart i stedet for starttime... undskyld..

Nu viser den noget men ikke det rigtige :)
den skriver:
System.Data.OleDb.OleDbDataReader
24 gange :S hvorfor det?
Avatar billede jakobandersen Nybegynder
23. september 2004 - 21:00 #20
Skift Linien:

TestLabel += MyDataReader2 + "<br>";

ud med:

TestLabel += MyDataReader2["subject"] + "<br>";
Avatar billede larsny Nybegynder
23. september 2004 - 21:05 #21
arh ja...
hvordan undgår jeg at få denne fejl:
Der findes ingen data for rækken eller kolonnen.

ved hvordan man gør i asp men ikke lige i asp.net :)
Avatar billede arne_v Ekspert
23. september 2004 - 21:11 #22
Du kan teste for om en værdi er NULL.
Avatar billede arne_v Ekspert
23. september 2004 - 21:12 #23
if(MyDataReader2().IsDBNull())
{
  ...
}
Avatar billede larsny Nybegynder
23. september 2004 - 21:15 #24
hvilket giver denne fejl:
CS0118: 'MyDataReader2' angiver 'variabel', hvor 'metode' var forventet
Avatar billede arne_v Ekspert
23. september 2004 - 21:21 #25
Jeg vrøvler også:

if(MyDataReader2.IsDBNull(kolonnenr))
{
  ...
}
Avatar billede larsny Nybegynder
23. september 2004 - 21:42 #26
damn det er sq en del sværere end jeg troede :)
hvad skal jeg skrive ved kolonnenr?
jeg har prøvet at skrive 1 da den første kolonne er "subject"... er det det eller har jeg misforstået det?

fejl:
System.InvalidOperationException: Der findes ingen data for rækken eller kolonnen.
Avatar billede arne_v Ekspert
23. september 2004 - 21:43 #27
kolonnenumrene starter med 0
Avatar billede larsny Nybegynder
23. september 2004 - 21:45 #28
det giver samme fejl
Avatar billede larsny Nybegynder
24. september 2004 - 13:21 #29
Findes der ikke en kode som i asp --if not (rs.eof or rs.bof) then-- ?
Koden nu:
for (int i=0; i < 24; i++) {
    String SQLString2 = "SELECT id, subject, eventdate, allday, starttime FROM calendar where eventdate = #" + DateTime.Now.Date + "# and DATEPART(\"h\", starttime)=" + i;
    OleDbCommand MyCommand2 = new OleDbCommand(SQLString2, MyConnection);
    OleDbDataReader MyDataReader2 = MyCommand2.ExecuteReader();
    if(MyDataReader2.IsDBNull(0)) {

den første kolonne er et id med autonummer...

Tænkte lige jeg ville ligge staksporing til:
[InvalidOperationException: Der findes ingen data for rækken eller kolonnen.]
  System.Data.OleDb.OleDbDataReader.DoValueCheck(Int32 ordinal) +46
  System.Data.OleDb.OleDbDataReader.IsDBNull(Int32 ordinal) +16
  ASP.default_aspx.ShowDayData() +265
  ASP.default_aspx.Page_Load(Object sender, EventArgs e) +5
  System.Web.UI.Control.OnLoad(EventArgs e) +67
  System.Web.UI.Control.LoadRecursive() +35
  System.Web.UI.Page.ProcessRequestMain() +750
Avatar billede arne_v Ekspert
24. september 2004 - 13:27 #30
Du skal kalde MyDataReader2.Read() førend du har data at teste på !
Avatar billede arne_v Ekspert
24. september 2004 - 13:28 #31
OleDbCommand MyCommand2 = new OleDbCommand(SQLString2, MyConnection);
    OleDbDataReader MyDataReader2 = MyCommand2.ExecuteReader();
    MyDataReader2.Read();
    if(MyDataReader2.IsDBNull(0)) {
Avatar billede arne_v Ekspert
24. september 2004 - 13:29 #32
Det ekvivalente til den ASP konstruktion du efterlyser er:

OleDbCommand MyCommand2 = new OleDbCommand(SQLString2, MyConnection);
OleDbDataReader MyDataReader2 = MyCommand2.ExecuteReader();
while(MyDataReader2.Read()) {
    ...
}
Avatar billede larsny Nybegynder
24. september 2004 - 13:45 #33
hehe nu begynder det at blive lidt irriterende at jeg ikke kan få det til at fungere :)

kode:
string TestLabel = "";
    for (int i=0; i < 24; i++) {
    String SQLString2 = "SELECT id, subject, eventdate, allday, starttime FROM calendar where eventdate = #" + DateTime.Now.Date + "# and DATEPART(\"h\", starttime)=" + i;
    OleDbCommand MyCommand2 = new OleDbCommand(SQLString2, MyConnection);
    OleDbDataReader MyDataReader2 = MyCommand2.ExecuteReader();
    MyDataReader2.Read();
        if(MyDataReader2.IsDBNull(0)) {
            TestLabel += MyDataReader2["subject"] + "<br>";
        }else{
            TestLabel += "intet<br>";
        }
    MyDataReader2.Close();
    }
testlabel.Text = TestLabel;

fejl:
System.Data.OleDb.OleDbException: Rækkehandlen er ugyldig.

Staksporing:
[OleDbException (0x80040e04): Rækkehandlen er ugyldig.]
  System.Data.OleDb.OleDbDataReader.ProcessResults(Int32 hr) +63
  System.Data.OleDb.OleDbDataReader.GetRowDataFromHandle() +105
  System.Data.OleDb.OleDbDataReader.FindValueBinding(Int32 index) +34
  System.Data.OleDb.OleDbDataReader.PeekValueBinding(Int32 index) +16
  System.Data.OleDb.OleDbDataReader.IsDBNull(Int32 ordinal) +40
  ASP.default_aspx.ShowDayData() +267
  ASP.default_aspx.Page_Load(Object sender, EventArgs e) +5
  System.Web.UI.Control.OnLoad(EventArgs e) +67
  System.Web.UI.Control.LoadRecursive() +35
  System.Web.UI.Page.ProcessRequestMain() +750
Avatar billede arne_v Ekspert
24. september 2004 - 18:22 #34
Jeg tror at der ikke er nogen rækker.

Så prøv at erstat
MyDataReader2.Read();
        if(MyDataReader2.IsDBNull(0)) {
            TestLabel += MyDataReader2["subject"] + "<br>";
        }else{
            TestLabel += "intet<br>";
        }

med:

        if(MyDataReader2.Read() && !MyDataReader2.IsDBNull(0)) {
            TestLabel += MyDataReader2["subject"] + "<br>";
        }else{
            TestLabel += "intet<br>";
        }
Avatar billede larsny Nybegynder
24. september 2004 - 18:26 #35
nu får jeg ikke fejlen mere... men den skriver ikke noget ud... hverken "subject" eller "intet"
Avatar billede arne_v Ekspert
24. september 2004 - 18:28 #36
Og bliver TestLabel vist ?
Avatar billede larsny Nybegynder
24. september 2004 - 18:31 #37
jo nu viser den det :D det var fordi jeg ikke havde sat text="et eller andet" i label... troede ikke man skulle det først... så leger jeg lige lidt med det og vender tilbage hvis der er mere :D
Avatar billede arne_v Ekspert
24. september 2004 - 18:36 #38
så ligger jeg et svar
Avatar billede larsny Nybegynder
25. september 2004 - 12:10 #39
lige et sidste spørgsmål... :)
Nu er det jo sådan at man godt kan have flere events inden for samme time...
Kan det lade sig gøre at lave en løkke inden i den løkke vi har nu?
I vores SQLString har vi jo hentet alle dem der er i den time...

ex:
if(MyDataReader2.Read() && !MyDataReader2.IsDBNull(0)) {
    --kør løkken igennem og skriv alle ud--
    TestLabel += MyDataReader2["subject"] + "<br>";
    --slut løkke--
}else{
    TestLabel += "intet<br>";
}
Avatar billede arne_v Ekspert
25. september 2004 - 13:03 #40
Se 24/09-2004 13:29:05

Det er meget normalt at kalde Read i en while løkke og så processe hver række
inden i den løkke.
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