sql >> データベース >  >> RDS >> Sqlserver

ボタンのシングルクリックで複数のレコードを動的に挿入する

    マークを入力する対象の正確な数がわからない場合、それを行うためのクエリをどのように生成すればよいですか?

    ストアド プロシージャに 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;
    }
    



    1. 列の値を自動的に設定するためのOracleSQLトリガー

    2. 列の動的リストを含むSQLピボットデータ

    3. MYSQL日付が日時より古い行を選択します

    4. Javaを使用してOracleデータベースへの接続をテストする方法