CatZMedlem sedan jan. 20022 440 inlägg 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 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 Enklast är väl alltså
Dim myValue as String = ""
CatZMedlem sedan jan. 20022 440 inlägg 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 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