webForumDet fria alternativet

Skriva ut 0 värde om värde inte finns i databasen

.NET

11 svar · 884 visningar · startad av phred

Medlem sedan nov. 2005314 inlägg
Frågan#1

Hej postar detta under denna kategori och hoppas det blir rätt.


sQuery = "SELECT COUNT(ID) as CNT, datepart(hh,TimeStamp) FROM CS WHERE ID=? GROUP BY datepart(hh,TimeStamp)"

......

While oReader.Read()

  strXML = strXML & "<set name='" & oReader.GetInt32(1) & "' value='" & oReader.GetInt32(0) & "' />"

End While

Denna skriver då ut antal poster som har timm 14 tex.
Men problemet är att jag måste skriva ut alla timmar oavsett om dem inte har något värde.
Om det nu finns två poster i databasen som har timme 14 och 18 så kommer jag få ut två rader med värdet 14 och 18.

då skriver den alltså ut något sånt här: 4st kl 14 och 15st kl 18.
men jag skulle vilja skriva ut 0st kl 01, 0st kl 02 osv fram till 14 kommer.

Jag har försökt fått in nån For loop men det skiter sig bara :D

Ja hoppas nån fattar :)

Medlem sedan maj 20033 218 inlägg
#2

kanske är fel ut men något liknande detta kanske?

sQuery = "SELECT isnull( COUNT(ID), 0)  as CNT, datepart(hh,TimeStamp) FROM CS WHERE ID=? GROUP BY datepart(hh,TimeStamp)"
Medlem sedan nov. 2005314 inlägg
#3

Tack för svaret.
Dock gav det inget resultat, det jag vill göra är att skriva ut alla timmar på ett dygn ex:

strXML = strXML & "<set name='" 01 "' value='" & 0 & "' />"
strXML = strXML & "<set name='" 02 "' value='" & 0 & "' />"
strXML = strXML & "<set name='" 03 "' value='" & 0 & "' />"
osv.

Ända tills det finns ett klockslag(timme) som har ett värde högre än 0 då ska det komma in följande
strXML = strXML & "<set name='" & oReader.GetInt32(1) & "' value='" & oReader.GetInt32(0) & "' />"

Tack för hjälpen.

EDIT*
Det kanske inte ens är rätt väg att gå med OdbcDataReader, While oReader.Read() ?

Medlem sedan maj 20033 218 inlägg
#4

Var nog mest din rubrik jag fastnade för ; )

Skriva ut 0 värde om värde inte finns i databasen

Medlem sedan nov. 2005314 inlägg
#5
For i = 0 To 23
            oReader.Read()
            If oReader.GetInt32(1) = i Then
                strXML = strXML & "<set name='" & i & "' value='" & oReader.GetInt32(0) & "' />"
                oReader.Read()
            Else
                strXML = strXML & "<set name='" & i & "' value='0' />"
            End If
        Next

Detta är ett av alla mina tappra försök ;)
Jag sitter just nu och rispar mig på mjälten för det är det enda som får mig att må lite bra i detta..

Felmeddelandet jag får är: "Det finns inga data för raden/kolumnen."

Men hur ska jag hantera detta på bästa sätt ?

Tack!
/F

Medlem sedan jan. 20022 440 inlägg
#6

kolla på

if (oReader[1] == DBNull.Value)

//Ursäkta såg inte att du kodar i VB :)

Medlem sedan nov. 2005314 inlägg
#7

Det går väl att "skriva om" C# till vb också.

Jag kanske tänker fel, men om jag kör koden jag skrev tidigare så läser jag ju från oReader oavsett om den skriver ut något eller inte, då tar ju raderna "slut" innan jag kommit till rätt ställe i loopen ?

Rätta mig om jag har fel här.

Hjälp mig gärna också :D

Medlem sedan dec. 200012 464 inlägg
#8

Du måste flytta ut din första read utanför for-loopen. Sen så behöver du lägga in en kontroll om du har kommit till slutet av ditt resultat.

Nu vet jag inte hur man kontrollerar om det finns något data i en reader men pseudokodsmässigt

oReader.Read()
For i = 0 To 23
          if  not oReader.eof  and oReader.GetInt32(1) = i Then
                strXML = strXML & "<set name='" & i & "' value='" & oReader.GetInt32(0) & "' />"
                oReader.Read()
            Else
                strXML = strXML & "<set name='" & i & "' value='0' />"
            End If
        Next

Du får alltså byta oReader.eof till något lämpligt

Medlem sedan okt. 20041 556 inlägg
#9
if not oReader(1) is DBNull.Value and oReader.GetInt32(1) = i

...kanske.

Medlem sedan nov. 2005314 inlägg
#10

Tack LarsG (och ni andra)

Jag hade på känn att det var något liknande.

if oReader.HasRows and oReader.GetInt32(1) = i Then

fungerade finfint.

Medlem sedan nov. 2005314 inlägg
#11

Jag var nog lite snabb att sätta tråden som löst. Det fungerade fint när jag testade, dock hade jag ett hårdkodat värde för vilket id den skulle hämta från databasen.

När jag sen byter till ett dynamiskt värde så fungerar det inte alls (jag får med mig ett värde). Då får jag bara "Det finns ingen data..." igen OM jag inte väljer den posten som jag använde när jag hårdkodade det hela.

sQuery = "SELECT COUNT(ID) as CNT, datepart(hh,TimeStamp) FROM CS WHERE ID=? GROUP BY datepart(hh,TimeStamp)"
        oCommand = PCommand(sQuery, oConn)
        oCommand.Parameters.Add("", intid) 'Detta fungerar bara med en enda post i databasen.
        oReader = oCommand.ExecuteReader()
oReader.Read()
        For i = 0 To 23
            If oReader.HasRows And oReader.GetInt32(1) = i Then    
                If oReader.GetInt32(1) < 10 Then
                    strXML = strXML & "<set name='0" & i & ":00' value='" & oReader.GetInt32(0) & "' />"
                Else
                    strXML = strXML & "<set name='" & i & ":00' value='" & oReader.GetInt32(0) & "' />"
                End If
                oReader.Read()
            Else
                If i < 10 Then
                    strXML = strXML & "<set name='0" & i & ":00' value='0' />"
                Else
                    strXML = strXML & "<set name='" & i & ":00' value='0' />"
                End If
            End If
        Next
Medlem sedan nov. 2005314 inlägg
#12

Nu 'r det dags igen!


        sQuery = "SELECT COUNT(EMAIL_ID)as CNT, datepart(hh, TimeStamp) FROM CLICK_STAT WHERE MAILING_ID=? and LINK_ID=0 GROUP BY datepart(hh, TimeStamp)"
        oCommand = PCommand(sQuery, oConn)
        oCommand.Parameters.Add("", intid) 
        oReader = oCommand.ExecuteReader

        While oReader.Read

            If oReader.GetInt32(1) < 10 Then
                strXML = strXML & "<set name='0" & oReader.GetInt32(1) & ":00' value='" & oReader.GetInt32(0) & "' />"
            Else
                strXML = strXML & "<set name='" & oReader.GetInt32(1) & ":00' value='" & oReader.GetInt32(0) & "' />"
            End If

        End While

        strXML = strXML & "</graph>"
        oReader.Close()

Det här fungerar finfint.
MEN! mitt problem är alltså att jag vill skriva ut timmar som inte finns i datepart(hh, TimeStamp) mellan 00 och 23, i exemplet ovan så har jag värden i timme 02, 11, 15 och 18. Det skulle alltså betyda att jag vill i rätt ordning skriva ut:

01
värde från datbasen
03
04
05
06
07
08
09
10
värde från databasen
12
13
14
värde från databasen
osv...

Som ni ser så har jag återgått till denna while istället för min tidigare For i = 0 osv. Just för att få en "fresh start".
Jag kanske tänker helt fel, men snälla hjälp mig i rätt riktning i så fall :stud

/F

268 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)