Si vous ne connaissez pas le nombre exact de sujets pour entrer les notes - comment sommes-nous censés générer une requête pour le faire ?
Néanmoins pour vous montrer que pour vous protéger contre les attaques SQL Injection vous mettez SQL en Stored Procs :
create PROCEDURE [dbo].[pr_GetAssignedSubjectsByFacultyIdAndSemester]
@FacultyID int,
@Semester nvarchar(MAX)
AS
BEGIN
SET NOCOUNT ON;
SELECT [Faculty], [Subjects],[CreatedBy],[CreatedDate],[ModifiedBy],[ModifiedDate]
FROM [dbo].[tblNotSure]
WHERE [FacultyID] = @FacultyID
AND [Semester] = @Semester
AND [IsDeleted] = 0
END
Ensuite, dans le code, nous appelons la procédure stockée, notez les commandes paramétrées, cela empêche les attaques par injection SQL. Par exemple, disons que nous avons tapé dans le ddl/textbox du semestre (ou en utilisant FireBug pour modifier la valeur des éléments) 1 UNION SELECT * FROM Master.Users - l'exécution de ce SQL ad hoc pourrait renvoyer la liste des comptes d'utilisateurs SQL mais transmis via une commande paramétrée évite le problème :
public static aClassCollection GetAssignedSubjectsByFacultyIdAndSemester(int facultyId, string semester)
{
var newClassCollection = new aClassCollection();
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["sqlConn"].ConnectionString))
{
using (var command = new SqlCommand("pr_GetAssignedSubjectsByFacultyIdAndSemester", connection))
{
try
{
command.CommandType = CommandType.StoredProcedure;
command.Parameters.AddWithValue("@facultyId", facultyId);
command.Parameters.AddWithValue("@semester", semester);
connection.Open();
SqlDataReader dr = command.ExecuteReader();
while (dr.Read())
{
newClassCollection.Add(new Class(){vals = dr["vals"].ToString()});
}
}
catch (SqlException sqlEx)
{
//at the very least log the error
}
finally
{
//This isn't needed as we're using the USING statement which is deterministic finalisation, but I put it here (in this answer) to explain the Using...
connection.Close();
}
}
}
return newClassCollection;
}