Toon posts:

[ASP.NET - VB] SUM functie werkt niet goed

Pagina: 1
Acties:
  • 134 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik heb een vaag probleem. Ik heb de volgende query:
Visual Basic:
1
"SELECT SUM(frequentie) FROM PollAntwoorden WHERE pollID=" & Request.QueryString("PollID")
Als ik deze query in MS Access draai dan werkt ie zonder problemen en krijg ik de som van alle frequentie rijen. Als ik de waarde in ASP.NET probeer op te vragen, krijg ik de foutmelding "De opgegeven conversie is ongeldig". Als ik de query opvraag die uitgevoerd wordt en deze in MS Access draai, doet ie het ook perfect.

Iemand een idee wat hier mis gaat?

  • dominic
  • Registratie: Juli 2000
  • Laatst online: 08-02 14:55

dominic

will code for food

Wat is 'pollID' voor veld? (String, integer...)

Download my music on SoundCloud


Verwijderd

Topicstarter
dominic schreef op zondag 21 augustus 2005 @ 01:15:
Wat is 'pollID' voor veld? (String, integer...)
Zowel pollID als frequentie zijn Integers (Numbers in MS Access)
Ik vraag de SUM(frequentie) op met objSelectReader.GetInt32(0), als Integer dus.
Als ik de SUM met COUNT vervang dan werkt ie wel gewoon, maar ik heb de SUM nodig.

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat genereerd de error? ASP.NET of de Acces database. Trouwens is het niet echt handing om je SQL statement zo op te stellen. Stel nou dat ik naar de url

http://www.jouwdomein.nl/page.aspx?PollID=1;Delete From PollAntwoorden;

invul dan ben jij je data kwijt

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 02-05 14:39
Print je query eerst eens naar het scherm alvorens je 'm uitvoert
code:
1
System.Diagnostics.Debug.WriteLine ("....")


Kijk ook eerst eens wat die Request.QueryString precies teruggeeft, alvorens het in je query te plaatsen. De fout moet 'm zeker daar ergens zitten.

En lees ook dit stukje eens:
Parametrized queries in.NET

[ Voor 36% gewijzigd door whoami op 21-08-2005 11:57 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
rwb schreef op zondag 21 augustus 2005 @ 11:54:
Wat genereerd de error? ASP.NET of de Acces database.
als ik de fout opvang in een try/catch krijg ik de exception:

code:
1
"De opgegeven conversie is ongeldig"
Trouwens is het niet echt handing om je SQL statement zo op te stellen. Stel nou dat ik naar de url

http://www.jouwdomein.nl/page.aspx?PollID=1;Delete From PollAntwoorden;

invul dan ben jij je data kwijt
Hier heb ik nooit aan gedacht, de gebruiker moet dan wel weten wat de namen van mijn tabellen zijn, maar kan idd beter het risico niet nemen. Wat is de beste manier om dit tegen te gaan? Een 'return functie' waarbij ik de pollID uit de url opvraag?
whoami schreef op zondag 21 augustus 2005 @ 11:56:
Print je query eerst eens naar het scherm alvorens je 'm uitvoert
code:
1
System.Diagnostics.Debug.WriteLine ("....")


Kijk ook eerst eens wat die Request.QueryString precies teruggeeft, alvorens het in je query te plaatsen. De fout moet 'm zeker daar ergens zitten.

En lees ook dit stukje eens:
Parametrized queries in.NET
Ben vergeten te vermelden dat als ik in plaats van Request.QueryString("PollID") gewoon een geldige waarde invul, ik dezelfde foutmelding krijg. De fout lijkt dus niet bij de Request.QueryString te zitten die overigens wel de goede waarde meegeeft

  • whoami
  • Registratie: December 2000
  • Laatst online: 02-05 14:39
Verwijderd schreef op zondag 21 augustus 2005 @ 19:55:
[...]
Ben vergeten te vermelden dat als ik in plaats van Request.QueryString("PollID") gewoon een geldige waarde invul, ik dezelfde foutmelding krijg. De fout lijkt dus niet bij de Request.QueryString te zitten die overigens wel de goede waarde meegeeft
Eh? Dan ligt de fout dus hoogstwaarschijnlijk wel bij de waardie die die request.querystring je teruggeeft, en die je aan jouw string wilt plakken.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op zondag 21 augustus 2005 @ 21:03:
[...]


Eh? Dan ligt de fout dus hoogstwaarschijnlijk wel bij de waardie die die request.querystring je teruggeeft, en die je aan jouw string wilt plakken.
Ik bedoel dat als ik niet Request.QueryString("PollID") gebruik maar gewoon een waarde.

Dus:
SQL:
1
"SELECT SUM(frequentie) FROM PollAntwoorden WHERE pollID=4"

i.p.v:
SQL:
1
"SELECT SUM(frequentie) FROM PollAntwoorden WHERE pollID=" & Request.QueryString("PollID")

  • whoami
  • Registratie: December 2000
  • Laatst online: 02-05 14:39
Van welk data-type is frequentie in die tabel ?
En van welk data-type is pollID ? Als pollId een alfanumeriek veld is, dan moet je quotes rond je criterium zetten.

https://fgheysels.github.io/


Verwijderd

SQL:
1
"SELECT SUM(frequentie) FROM PollAntwoorden WHERE pollID=" & int(Request.QueryString("PollID"))

?

[ Voor 55% gewijzigd door Verwijderd op 21-08-2005 22:41 ]


Verwijderd

Ik heb zo'n flauw vermoeden dat de fout helemaal lost staat van de query, aangezien die het gewoon goed doet onder Access. Kun je ons de omliggende code laten zien?

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op zondag 21 augustus 2005 @ 19:55:
[...]
als ik de fout opvang in een try/catch krijg ik de exception:

code:
1
"De opgegeven conversie is ongeldig"
Bij een exception heb je nog wel meer handige informatie zoals de stacktrace en het type exception.

[ Voor 3% gewijzigd door Woy op 22-08-2005 08:56 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

En om eventuele SQL injectie op te vangen
Visual Basic .NET:
1
2
Dim PollID as integer = cint(request.querystring("PollID"))
Dim Qeury as string =  "SELECT SUM(frequentie) FROM PollAntwoorden WHERE pollID=" & PollID.tostring


Maar dat gaat lichtelijk offtopic ;)

  • whoami
  • Registratie: December 2000
  • Laatst online: 02-05 14:39
Injection attacks los je het best op mbhv parametrized queries.

https://fgheysels.github.io/


Verwijderd

Topicstarter
whoami schreef op zondag 21 augustus 2005 @ 22:14:
Van welk data-type is frequentie in die tabel ?
En van welk data-type is pollID ? Als pollId een alfanumeriek veld is, dan moet je quotes rond je criterium zetten.
Zowel frequentie als pollID zijn Integers (Numbers in MS Access)
Verwijderd schreef op zondag 21 augustus 2005 @ 22:39:
SQL:
1
"SELECT SUM(frequentie) FROM PollAntwoorden WHERE pollID=" & int(Request.QueryString("PollID"))

?
Geeft dezelfde foutmelding, maar daar lijkt het probleem ook niet te liggen.
Verwijderd schreef op zondag 21 augustus 2005 @ 23:31:
Ik heb zo'n flauw vermoeden dat de fout helemaal lost staat van de query, aangezien die het gewoon goed doet onder Access. Kun je ons de omliggende code laten zien?
Dit is de functie waarin de query staat:
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Function SelectAantalAntwoorden()
    dim objConn as new OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" & DatabaseLocatie())

    dim aantalAntwoorden as Integer

    dim objSelectCmd as new OleDbCommand ("SELECT SUM(PollAntwoorden.frequentie) FROM PollAntwoorden WHERE pollID=4", objConn)

    dim objSelectReader as OleDbDataReader

    try
        objConn.Open
        objSelectReader = objSelectCmd.ExecuteReader

        if (objSelectReader.Read)
            if (objSelectReader.IsDBNull(0) = false)
                aantalAntwoorden = objSelectReader.GetInt32(0)
                Response.write("Hallo: " & objSelectReader.GetInt32(0))
            end if
        end if
        objConn.Close
    catch ex as Exception
        Response.write(ex.Message)
    end try

    return aantalAntwoorden
End Function

Deze wordt gewoon aangeroepen met SelectAantalAntwoorden() om het aantal antwoorden (SUM van alle frequenties) op te vragen.
rwb schreef op maandag 22 augustus 2005 @ 08:56:
[...]


Bij een exception heb je nog wel meer handige informatie zoals de stacktrace en het type exception.
Ik begrijp die foutmeldingen zelf niet echt, maar krijg (o.a) het volgende:
code:
1
Details van uitzondering: System.InvalidCastException: De opgegeven conversie is ongeldig.

De regel die gehighlight wordt is:
Visual Basic:
1
Regel 245:                    aantalAntwoorden = objSelectReader.GetInt32(0)

De stacktracering zegt mij ook niet zoveel:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[InvalidCastException: De opgegeven conversie is ongeldig.]
   System.Data.OleDb.OleDbDataReader.GetInt32(Int32 ordinal) +45
   ASP.PollWijzigen_aspx.SelectAantalAntwoorden() in C:\Development\Homepages\Almeerspin\Versie 2\CBS\Almeerspin - CBS\web-content\PollWijzigen.aspx:245
   ASP.PollWijzigen_aspx.AntwoordenRepeater_ItemDataBound(Object Sender, RepeaterItemEventArgs e) in C:\Development\Homepages\Almeerspin\Versie 2\CBS\Almeerspin - CBS\web-content\PollWijzigen.aspx:72
   System.Web.UI.WebControls.Repeater.OnItemDataBound(RepeaterItemEventArgs e) +84
   System.Web.UI.WebControls.Repeater.CreateItem(Int32 itemIndex, ListItemType itemType, Boolean dataBind, Object dataItem) +139
   System.Web.UI.WebControls.Repeater.CreateControlHierarchy(Boolean useDataSource) +475
   System.Web.UI.WebControls.Repeater.OnDataBinding(EventArgs e) +48
   System.Web.UI.WebControls.Repeater.DataBind() +10
   System.Web.UI.Control.DataBind() +78
   System.Web.UI.Control.DataBind() +78
   ASP.PollWijzigen_aspx.PollAntwoorden() in C:\Development\Homepages\Almeerspin\Versie 2\CBS\Almeerspin - CBS\web-content\PollWijzigen.aspx:61
   ASP.PollWijzigen_aspx.Page_Load(Object obj, EventArgs e) in C:\Development\Homepages\Almeerspin\Versie 2\CBS\Almeerspin - CBS\web-content\PollWijzigen.aspx:14
   System.Web.UI.Control.OnLoad(EventArgs e) +55
   System.Web.UI.Control.LoadRecursive() +27
   System.Web.UI.Page.ProcessRequestMain() +750

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
probeer eens te kijken dan welk type er op index 0 van je resultset zit.
C#:
1
objSelectReader[ 0 ].GetType();

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • whoami
  • Registratie: December 2000
  • Laatst online: 02-05 14:39
Als je een query uitvoert die slechts 1 resultaat returned (1 row, 1 column), dan gebruik je beter de ExcecuteScalar method van het Command object, ipv met een Reader de resultaten te gaan ophalen.
ExecuteScalar returned wel een object, dus dat moet je dan ff Converten naar een integer.

Zoals je ziet, heeft jouw foutmelding dus eigenlijk niets met die query te maken, maar met het uitlezen van de resultaten uit je reader.

Eigenlijk kan ik je maar één tip geven: leer debuggen.
In VS.NET heb je daar genoeg tools voor: breakpoints, watches, etc.... Leer daar eens mee om te gaan. Ga dan ook eens logisch nadenken, en interpreteer de exceptie die je krijgt: InvalidCast: het casten naar een integer is dus niet gelukt.

[ Voor 27% gewijzigd door whoami op 22-08-2005 14:08 ]

https://fgheysels.github.io/


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
idd wat whoami zegt en dan Convert.ToInt32( ... )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • cowgirl
  • Registratie: November 2000
  • Laatst online: 18-12-2025
Zet eens een breakpoint op regel 245 en kijk via je watch welk datatype opgegeven wordt voor dat veld. Het lukt nl. niet om dat datatype om te zetten naar int. Zelf doe ik normaal c# en daar zijn kolommen altijd van het type object. Je moet dus de juiste manier van converteren vinden.

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 01-05 20:17

Janoz

Moderator Devschuur®

!litemod

De stacktracering zegt mij ook niet zoveel:
Misschien moet je daar dan ietsje beter in oefenen. Deze laat namelijk duidelijk zien dat het fout gaat in je eigen code op regel 245. Deze komt afaik overeen met regel 16 van je geposte code. Dan had je sowieso dus kunnen zien dat de fout niet bij het uitvoeren van de query zat (dan was er immers een foutmelding op regel 12/241 opgetreden).

Ik verbaas me af en toe nogal over het gebrekkige vermogen een stacktrace fatsoenlijk te interpreteren. Heel vaak kon ik bij collega's met 1 blik op de stacktrace exact zien wat het probleem was waar ze al kwartieren naar op zoek waren.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Even een zijdelings tipje: zet je connection.close() in een finally blok:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
try
{
   conn.open();
   // data ophalen
}
catch
{
   // error handling
}
finally
{
   conn.close();
}

Hierdoor zorg je dat de connectie altijd gesloten wordt, ook als er een fout optreedt.

Verwijderd

Topicstarter
Top! Het is gelukt met ExecuteScalar, bedankt voor alle tips:

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Function SelectAantalAntwoorden()
    dim objConn as new OleDbConnection ("Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" & DatabaseLocatie())

    dim aantalAntwoorden as String

    dim PollID as Integer = Cint(Request.QueryString("PollID"))
    dim objSelectCmd as new OleDbCommand ("SELECT SUM(PollAntwoorden.frequentie) FROM PollAntwoorden WHERE pollID=" & PollID, objConn)

    try
        objConn.Open
            aantalAntwoorden = objSelectCmd.ExecuteScalar().ToString
    catch ex as Exception
        Response.write(ex.Message)
    finally
        objConn.Close
    end try

    return aantalAntwoorden
End Function

Verwijderd

Al zou ik er dan nog van maken
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
...
    catch ex as Exception 
        ' -1 als er een fout optreedt
        aantalAntwoordden=-1
        Response.write(ex.Message) 
    finally 
...
    return aantalAntwoorden 
End Function


Zodat je makkelijk kan afvangen of er antwoorden zijn... tenzij je als er een fout optreedt als antwoord "0" wil krijgen natuurlijk ;)
Pagina: 1