Avatar billede chw Nybegynder
04. april 2005 - 15:51 Der er 13 kommentarer

executescalar spørgsmål

jeg laver en select count (*) og bruger executer med executescalar.

Hvad retunere den hvis der ikke er nogen poster.

Jeg koder i vb.net
Avatar billede burningice Nybegynder
04. april 2005 - 15:58 #1
den returnere Nothing
Avatar billede arne_v Ekspert
04. april 2005 - 16:00 #2
umiddelbart ville jeg da tro at den returnerede numerisk nul (ikke null pointer).
Avatar billede burningice Nybegynder
04. april 2005 - 16:24 #3
ExecuteScalar returnerer altid object
Avatar billede arne_v Ekspert
04. april 2005 - 17:12 #4
ExecuteScalar af SELECT COUNT(*) returnerer helt præcist en
System.Int32 som egner sig glimrende til at blive castet til en
int og som er 0 ved ingen rækker
Avatar billede burningice Nybegynder
04. april 2005 - 18:50 #5
ExecuteScalar vil under alle omstændigheder returnere et object. Hvis man har hentet et tal ud skal unboxes for at få en System.Int32 ud, på samme måde som at du kan caste et tal til et object og tilbage igen.

:)

Men jeg kan godt se din pointe i, at SELECT COUNT(*) vil returnere 0 og ikke Nothing hvis der ikke blev fundet nogen poster, men det er så en feature i selve SQL og ikke .Net

F.eks.

SELECT id FROM tblUser WHERE name = 'cyberfessor'

ved en ExecuteScalar på den, vil der ikke blive returneret 0 men Nothing, hvis at der ikke fandtes en bruger med navnet 'cyberfessor'.


Hm. Hvorfor er det at vi altid kommer op og diskutere over sådanne banaliteter? :)
Avatar billede arne_v Ekspert
04. april 2005 - 19:01 #6
Ja - fordi ExecuteScalar på SELECT COUNT(*) FROM tabel returnerer en række
med en kolonne med et tal som er numerisk nul hvis der ingen rækker er, mens
ExecuteScalar pÅ SELECT felt FROM tabel WHERE noget som aldrig er opfyldt
returnerer ingen rækker.

Det lyder meget plausibelt at ExecuteScalar for ingen rækker returnerer
null/Nothing, men med en række skal den returnere værdien selvom den er numerisk
nul.
Avatar billede arne_v Ekspert
04. april 2005 - 19:06 #7
I C# kan du caste direkte til int:

        int n = (int)cmd.ExecuteScalar();

men i VB.NET behøver du ikke engang det:

        Dim n As Integer = cmd.ExecuteScalar
Avatar billede burningice Nybegynder
04. april 2005 - 19:11 #8
at caste fra object til int må vel være unboxing.

hvad er mest rigtigt at sige. At man caster til int, eller man unboxer. Og på samme måde, skal man sige man caster fra int til object, eller skal man sige at man boxer?
Avatar billede arne_v Ekspert
04. april 2005 - 19:17 #9
Aner det ikke.

int n = (int)cmd.ExecuteScalar();

kunne skrives som:

int n = (int)(Int32)cmd.ExecuteScalar();

hvor den første er en cast som ikke er en unboxing mens den sidste
er en cast som er en unboxing.

Så strenget taget er det vel en lidt blandet landhandel.
Avatar billede burningice Nybegynder
04. april 2005 - 19:24 #10
(int)(Int32)cmd.ExecuteScalar();

er vel dobbelkoffekt, i og med at keywordet int mapper til typen System.Int32. Så første gang (Int32) unboxer du, og anden gang (int), ja... det vil compileren vel bare ignorere. Det ville jo svare til at skrive følgende

string s = (string)"hej med dig";
Avatar billede burningice Nybegynder
04. april 2005 - 19:25 #11
chw>> du skal ikke tage dig af os. Vi er bare gode til at diskutere sådanne småting.
Avatar billede arne_v Ekspert
04. april 2005 - 19:34 #12
ja - det har du ret i - det kan ikke dekomponeres på den måde i .NET
Avatar billede chw Nybegynder
03. februar 2007 - 17:55 #13
lig et svar
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