यदि आप अंक दर्ज करने के लिए विषयों की सटीक संख्या नहीं जानते हैं - तो हम इसे करने के लिए एक क्वेरी कैसे उत्पन्न करेंगे?
एसक्यूएल इंजेक्शन हमलों के खिलाफ सुरक्षा के लिए आपको दिखाने के लिए कभी भी कम नहीं है आपने एसक्यूएल को संग्रहित प्रक्रियाओं में रखा है:
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
फिर कोड में हम संग्रहित प्रक्रिया को कॉल करते हैं, पैरामीटरयुक्त कमांड को नोटिस करते हैं, यह SQL इंजेक्शन हमलों को रोकता है। उदाहरण के लिए मान लें कि हमने सेमेस्टर डीडीएल/टेक्स्टबॉक्स में टाइप किया है (या तत्वों के मूल्य को संपादित करने के लिए फायरबग का उपयोग कर रहा है) समस्या से बचाता है:
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;
}