1

以下のサブルーチンを参照してください。

Private Sub UpdateGrade(ByVal studentID As Integer, ByVal grade As String)
        Dim objCommand As SqlCommand
        Dim objCon As SqlConnection
        Dim id As Integer
        Dim _ConString As String
        Try
            _ConString = ConfigurationManager.ConnectionStrings("TestConnection").ToString
            objCon = New SqlConnection(_ConString)
            objCommand = New SqlCommand("DECLARE @StudentID INT " & _
            "DECLARE @Grade char(1) " & _
            "SET @Grade = '" & grade & "'" & _
            "SET @StudentID = '" & studentID & "'" & _
            "If @Grade=1 " & _
            "begin " & _
            "update Student SET Grade = 'A' WHERE StudentID = @StudentID " & _
            "end " & _
            "Else If @Grade=2 " & _
            "begin " & _
            "update Student SET Grade = 'B' WHERE StudentID = @StudentID " & _
            "end " & _
            "If @Grade=3 " & _
            "begin " & _
            "update Student SET Grade = 'C' WHERE StudentID = @StudentID " & _
            "end " & _
            "Else If @Grade=4  " & _
            "begin " & _
            "update Student SET Grade = 'D' WHERE StudentID = @StudentID " & _
            "end")
            objCommand.Connection = objCon
            objCon.Open()
            objCommand.ExecuteNonQuery()
        Catch ex As Exception
            Throw
        Finally

        End Try

Command.CommandText を TSQL ステートメントに設定すると何か問題がありますか? TSQL は次のようになります (読みやすくするため)。

DECLARE @StudentID INT
DECLARE @Grade char(1)
SET @Grade = 
SET @StudentID = 
If @Grade=1 
begin
    update Student SET Grade = 'A'  WHERE StudentID = @StudentID
end 
Else If @Grade=2 
begin
    update Student SET Grade = 'B'  WHERE StudentID = @StudentID
end 
If @Grade=3
begin
    update Student SET Grade = 'C'  WHERE StudentID = @StudentID
end 
Else If @Grade=4 
begin
    update Student SET Grade = 'D'  WHERE StudentID = @StudentID
end 

while ループ内に UpdateGrade の呼び出しがあります。while ループは、500 万人の学生をループします。ライブ システムはこのために複雑であることに注意してください。そのため、説明のために上記のコードを提供しました。

過去に .NET コードからストアド プロシージャを呼び出す際に問題が発生しましたが、これは XACT_ABORT で解決されました。

4

1 に答える 1

3

コマンドを TSQL ステートメントに設定することが予想されますが、これは既に行っています。CommandTextただし、このビットに反対することを強くお勧めします。

        "DECLARE @StudentID INT " & _
        "DECLARE @Grade char(1) " & _
        "SET @Grade = '" & grade & "'" & _
        "SET @StudentID = '" & studentID & "'" & _

これは削除する必要があります (C# のセミコロンで申し訳ありません; 習慣の力):

objCommand.Parameters.AddWithValue("StudentID", studentID);
objCommand.Parameters.AddWithValue("Grade", grade);

これは、SQL インジェクションから安全です。

また、おそらく a select case、つまり (例として C# を使用):

objCommand.CommandText = @"
    update Student set Grade = select case @Grade
            when 1 then 'A' when 2 then 'B'
            when 3 then 'C' when 4 then 'C'
            else Grade end
    where StudentId = @StudentID";
objCommand.Parameters.AddWithValue("StudentID", studentID);
objCommand.Parameters.AddWithValue("Grade", grade);
于 2013-08-07T19:45:50.683 に答える