Din SQL:
Dim strMasterID AS string = Request.Form("MasterID$newsletter")
SELECT COUNT(*) AS Entries
FROM news_users
WHERE (newsuser_mail = '" & strMasterID & ')"
AND (newsuser_status = 1);
I stedet for at trække alle data ud, nøjes du med at tælle antallet af records der passer på dine kriterier. Dette er både hurtigere og kræver færre ressourcer.
Din IF:
Dim intEntries AS int = 0
If reader.HasRows Then
intEntries = CInt(reader("Entries"))
End If
If intEntries = 0 Then
MultiView.SetActiveView(ActivateMail)
Else
MultiView.SetActiveView(DeleteMail)
End If
Når du åbner en forbindelse til din database, skal du kun hente data, og så lukke forbindelsen igen bagefter. Evt logik der er afhængig af data fra databasen, skal foregå efter du har lukket forbindelsen. Det forhindrer at forbindelsen er åben i lang tid, hvis det er tung logik, og sparer ressourcer.
Hele koden:
Sub DBConn()
Dim strSQL AS string = ""
Dim strMasterID AS string = ""
Dim intEntries AS int = 0
strMasterID = Request.Form("MasterID$newsletter")
<!-- Indsæt validering af MasterID -->
...
...
...
<!-- Sæt til default værdi, hvis ikke valid -->
strSQL = "" & _
"SELECT COUNT(*) AS Entries " & _
"FROM news_users " & _
"WHERE (newsuser_mail = '" & strMasterID & ') " & _
" AND (newsuser_status = 1);"
Using connection As OleDbConnection = New OleDbConnection(ConfigurationManager.ConnectionStrings("MyConnStr").ConnectionString)
Using command As OleDbCommand = New OleDbCommand(strSQL, connection)
command.Connection.Open()
Using reader As OleDbDataReader = command.ExecuteReader(CommandBehavior.CloseConnection)
If reader.HasRows Then
intEntries = CInt(reader("Entries"))
End If
End Using
End Using
End Using
If intEntries = 0 Then
MultiView.SetActiveView(ActivateMail)
Else
MultiView.SetActiveView(DeleteMail)
End If
End Sub
Her har du fået lukket din forbindelse til databasen, så den er fri til brug i den logik du har i dit View.
Der er også lavet noget (skal du selv) validering af dine parametere for at forhindre SQL-injections.
Sidst, men ikke mindst, er koden også mere læselig, hvilket gør det nemmere at fejlfinde og vedjligeholde.
I VB finder jeg det bedst at angive variablers type sammen med navnet, så man hurtigt ved, hvad man har med at gøre. Jeg har dog ikke rodet med det i .NET, så ved ikke om det er nødvendigt da IntelliSense fortæller dig, hvilken type en variabel er.
Til sidst vil jeg minde dig om ALDRIG at indsætte parametre fra formularer eller querystrengen direkte i din SQL. Der skal altid være en form for validering inden. Derfor hjælper det ofte, at gemme parametre ned i typebestemte variabler, således at et tal-ID ikke kan indeholde bogstaver.