Avatar billede djthomas Nybegynder
31. maj 2010 - 10:19 Der er 10 kommentarer og
1 løsning

Hvorfor fejler returnering i denne metode?

Jeg har lavet denne lille metode, som blot skal returnere en int, med antallet af nogle stemmer.

protected int getResults()
    {

        try
        {
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            conn.Open();

            SqlCommand cmdResult1 = new SqlCommand(@"SELECT COUNT(vote) as NumVotes FROM pollVotes WHERE vote = 1", conn);
            SqlDataReader reader = cmdResult1.ExecuteReader();

            while (reader.Read())
            {
                return (int) reader["NumVotes"];
            }

            conn.Close();

        }
        finally
        {
        }

    }


Men jeg får en fejl: ikke alle kodestier returnerer en værdi

Jeg har testet min SQL sætning manualt og der kommer der et resultat ud, som det skal - nogen der kan foreklare mig hvad hulen jeg gør forkert?
Avatar billede ksoren2 Nybegynder
31. maj 2010 - 10:22 #1
Den er ked af, at du ikke returnerer noget i tilfældet af 1) der bliver kastet en exception 2) din reader ikke returnerer noget
Avatar billede djthomas Nybegynder
31. maj 2010 - 10:28 #2
Men hvordan man min reader ikke retunere noget, når nu der faktisk kommer et validt svar fra SQL sætningen af?
Avatar billede jokkejensen Novice
31. maj 2010 - 10:30 #3
... du får heller ikke lukket den forbindelse til databasen..
Avatar billede keysersoze Guru
31. maj 2010 - 10:31 #4
sætter du koden op så du kan have flere forskellig udfald skal du uanset hvad returnere noget i samtlige tilfælde - hvis du er sikker på at din sql aldrig fejler etc skal du ikke pakke din kode ind i en try/catch og ellers skal du bare returnere noget i alle tilfælde.
Avatar billede djthomas Nybegynder
31. maj 2010 - 10:34 #5
Nu lukker jeg forbindelsen før mit return og jeg har nu fjernet try/catch/finaly

Men det hjælper ikke noget
Avatar billede djthomas Nybegynder
31. maj 2010 - 10:37 #6
Så min metode nu ser sådan her ud:
protected int getResults()
    {
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            conn.Open();

            SqlCommand cmdResult1 = new SqlCommand(@"SELECT COUNT(vote) as NumVotes FROM pollVotes WHERE vote = 1", conn);
            SqlDataReader reader = cmdResult1.ExecuteReader();

            conn.Close();

            while (reader.Read())
            {
                return (int) reader["NumVotes"];
            }

    }
Avatar billede jokkejensen Novice
31. maj 2010 - 10:37 #7
protected int getResults()
    {
SqlConnection conn = new SqlConnection();
int y = 0;
        try
        {
         
            conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            conn.Open();

            SqlCommand cmdResult1 = new SqlCommand(@"SELECT COUNT(vote) as NumVotes FROM pollVotes WHERE vote = 1", conn);
            SqlDataReader reader = cmdResult1.ExecuteReader();

            while (reader.Read())
            {
                y=(int) reader["NumVotes"];
            }

           

        }
        finally
        {
conn.Close();
        }
return y;

    }
Avatar billede djthomas Nybegynder
31. maj 2010 - 10:41 #8
Tak Jokke.

Det virker - jeg skal bare blive bedre til at bruge try/catch/finaly noget mer eog rigtigt - det goder vi jo ikke rigtigt bruge i PHP verden, hvor jeg kommer fra ;-)

Smidder du et svar, så skal jeg give dig point
Avatar billede jokkejensen Novice
31. maj 2010 - 10:42 #9
Deler gerne med de andre !
Avatar billede bitmatic Nybegynder
31. maj 2010 - 11:37 #10
Hvis man skulle være helt korrekt omkring at rydde op, så bør man bruge en using til at håndtere det. De objekter der bliver brugt implementerer jo IDisposable, så man skal som programmør sørge for at kalde Dispose på dem. Det gør using for os... Så ender man med noget i stil med:

protected int getResults()
{
    int y = 0;
    using (SqlConnection conn = new SqlConnection())
    {
        conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        conn.Open();
        using (SqlCommand cmdResult1 = new SqlCommand(@"SELECT COUNT(vote) as NumVotes FROM pollVotes WHERE vote = 1", conn))
        {
            using (SqlDataReader reader = cmdResult1.ExecuteReader())
            {
                while (reader.Read())
                {
                    y = (int)reader["NumVotes"];
                }
            }
        }
    }
    return y;
}
Avatar billede arne_v Ekspert
31. maj 2010 - 16:11 #11
Hvis SQL returnerer 0 eller 1 række, så er forskellen ens, men hvis der kunne returneres flere rækker, så er det:

if(.Read())
{
    =
}
return

der svarer til:

while(.Read())
{
    return
}
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

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



IT-JOB

IT & Co ApS

IT-tekniker

Cognizant Technology Solutions Denmark ApS

Graduate - Software Automation Program

Azets Insight A/S

QA Test Analyst

Saab Danmark A/S

System Engineer