マークを入力する対象の正確な数がわからない場合、それを行うためのクエリをどのように生成すればよいですか?
ストアド プロシージャに SQL を配置することで、SQL インジェクション攻撃から保護することができます。
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 インジェクション攻撃が防止されます。たとえば、学期の ddl/textbox に入力したとします (または FireBug を使用して要素の値を編集します) 1 UNION SELECT * FROM Master.Users - このアドホック SQL を実行すると、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;
}