sql >> Base de Datos >  >> RDS >> Sqlserver

inserte varios registros con un solo clic en el botón de forma dinámica

Si no conoce el número exacto de sujetos para ingresar las marcas, ¿cómo se supone que debemos generar una consulta para hacerlo?

Sin embargo, para mostrarle cómo protegerse contra los ataques de inyección de SQL, coloque su 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

Luego, en el código, llamamos al procedimiento almacenado, observe los comandos parametrizados, esto evita los ataques de inyección SQL. Por ejemplo, supongamos que escribimos en el semestre ddl/textbox (o usamos FireBug para editar el valor de los elementos) 1 UNION SELECT * FROM Master.Users:ejecutar este SQL ad-hoc podría devolver la lista de cuentas de usuario de SQL pero pasó a través de un comando parametrizado evita el problema:

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;
}