webForumDet fria alternativet

Variable 'myValue' is used before it has been assigned a value

4 svar · 350 visningar · startad av CatZ

CatZMedlem sedan jan. 20022 440 inlägg
#1
    Function dbExecuteScalar(ByVal strSQL) As String
        Dim objConn As SqlClient.SqlConnection
        Dim objCmd As SqlClient.SqlCommand
        Dim myValue As String

        Try
            objConn = New SqlClient.SqlConnection(myConnectionString)
            objConn.Open()

            objCmd = New SqlClient.SqlCommand(strSQL, objConn)
            objCmd.CommandType = CommandType.Text
            myValue = objCmd.ExecuteScalar()
            objConn.Close()
        Catch

        End Try
        Return myValue
    End Function

Varfor far jag detta meddelandet?

GladhMedlem sedan maj 20012 812 inlägg
#2
 Function dbExecuteScalar(ByVal strSQL) As String
        Dim objConn As SqlClient.SqlConnection
        Dim objCmd As SqlClient.SqlCommand
        Dim myValue As String

        Try
            objConn = New SqlClient.SqlConnection(myConnectionString)
            objConn.Open()

            objCmd = New SqlClient.SqlCommand(strSQL, objConn)
            objCmd.CommandType = CommandType.Text
            [b]myValue = objCmd.ExecuteScalar()[/b]
            objConn.Close()
        Catch

        End Try
        Return myValue
    End Function

Du kan inte garantera att myValue verkligen får ett värde, då du kanske får ett fel när du försöker koppla upp dig mot databasen.

Så antingen ger du myValue ett default value när du skapar variablen, eller så får du ge myValue ett värde i din catch funktion.

En annan sak är att det är inte speciellt lyckat att lägga objConn.Close() där du har lagt den eftersom du återigen inte kan vara garanterad att den kodraden verkligen exekveras, vilket kan leda till att du inte får stängt din koppling till databasen. Din stängning av kopplingen skall ske i ett Finally-block eftersom det är garanterat att exekveras även om du får något fel i ditt try-catch block.

- M

PMedlem sedan jan. 20012 204 inlägg
#3

Enklast är väl alltså

Dim myValue as String = ""
CatZMedlem sedan jan. 20022 440 inlägg
#4

Gladh! Nu blev jag riktigt glad, det var en mycket bra förklaring!!

P tack för det, visste inte man kunde göra på det viset.

GladhMedlem sedan maj 20012 812 inlägg
#5

En sak som jag glömde säga, att göra en try-cath så som du gjort där du inte gör något som helst i din catch, är en verklig no-no. Det är vad man kallar: exception-swallower.

Alltså att du får ett fel, men du kommer aldrig märka det eftersom du fångar det, men sedan gör du inget mer med det, du loggar inte det, du meddelar inte programet genom att kasta det vidare. Det kommer leda till problem senare när programmet sedan kör i skarp drift.

Vi hade just det problemmet i en av våra standard komponenter som hanterar databaskommunikationen, man hade gjort följande:

try{
connection.close();
}catch(Exception e){}

så trodde personen att allt var bra, problemet var bara i det lägget var connection objectet null, men kopplingen låg öppen via ett transactionsobjekt och detta resulterade i att kopplingen aldrig stängdes och tillslut så fick vi fel från connectionpoolen att det inte fanns några lediga connections att använda, detta skedde helt oregelbundet eftersom man använde komponenten olika mycket vid olika tider, så det tog lång tid innan vi hittade felet.

- M

128 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)