Nếu bạn không biết chính xác không có chủ đề nào để nhập điểm - làm cách nào chúng tôi phải tạo một truy vấn để thực hiện điều đó?
Không bao giờ ít hơn để cho bạn thấy để bảo vệ khỏi các cuộc tấn công SQL Injection mà bạn đặt bạn SQL trong Procs được lưu trữ:
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
Sau đó, trong mã chúng tôi gọi là thủ tục được lưu trữ, hãy chú ý đến các Lệnh được tham số, điều này ngăn chặn các cuộc tấn công SQL Injection. Ví dụ:giả sử chúng tôi đã nhập vào học kỳ ddl / hộp văn bản (hoặc sử dụng FireBug để chỉnh sửa giá trị các phần tử) 1 UNION SELECT * FROM Master.Users - thực thi SQL đặc biệt này có thể trả về danh sách tài khoản người dùng SQL nhưng được truyền thông qua lệnh được tham số hóa tránh vấn đề:
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;
}