0

ループ内のストアド プロシージャにパラメータを追加しようとしています。以下は、変数を宣言したコードです。

 SqlConnection con = new SqlConnection();
        Connect conn = new Connect();
        SqlDataReader readerCourseID = null;
        con = conn.getConnected();
        con.Open();
        SqlCommand cmdAssignCourse;
        cmdAssignCourse = new SqlCommand("assignCourse", con);
        cmdAssignCourse.CommandType = CommandType.StoredProcedure;
        cmdAssignCourse.Parameters.Add("@sID", System.Data.SqlDbType.VarChar);
        cmdAssignCourse.Parameters.Add("@cID", System.Data.SqlDbType.VarChar);
        SqlParameter retValue = cmdAssignCourse.Parameters.Add("return", System.Data.SqlDbType.Int);

以下は、以前に宣言した変数に値を挿入したコードです。

foreach (DataRow row in dt.Rows)
            {
                //get course id from course name. Pass  row["Course Name"].ToString()
                int i = getCourseID(row["Course Name"].ToString());



                //assignment of the course to student
                cmdAssignCourse.Parameters["@sID"].Value = studentCurrID.Value.ToString();
                cmdAssignCourse.Parameters["@cID"].Value = i;
                retValue.Direction = ParameterDirection.ReturnValue;
                cmdAssignCourse.ExecuteNonQuery();
                if (retValue.Value.ToString() == "0")
                {
                    MessageBox.Show("Added Course Successfully!");
                    //return 0;
                }
                else
                {
                    MessageBox.Show("An error occured! Possibly a duplication of data!");
                    //return -1;
                }

            }

ただし、このコードは正常に実行され、「コースが正常に追加されました!」というメッセージが表示されます。一度。しかし、最初の実行が成功した後、1回おきに実行すると、「エラーが発生しました!データが重複している可能性があります!」というメッセージが表示されます。メッセージ。考えられるエラーは、変数をクリアしていないことです。以下の変数をクリアする方法。これで私を助けてください。ありがとう!

4

1 に答える 1

1

同じ SqlCommand と SqlConnection を再利用しても、何も得られません。接続プーリングが面倒な作業をすべてやってくれるので、一からやり直す必要はありません。コードを分離した方が読みやすく、堅牢になるため、手順を実行する新しいメソッドを作成します。

private int GenerateReturnValue(int courseID, int studentID)
{
    using (var connection = new SqlConnection("Your Connection String"))
    using (var command = new SqlCommand("assingCourse", connection)
    {
        connection.Open();
        command.CommandType = CommandType.StoredProcedure;
        command.Parameters.Add("@sID", System.Data.SqlDbType.VarChar).Value = studentID.ToString();
        command.Parameters.Add("@cID", System.Data.SqlDbType.VarChar).Value = courseID.ToString();
        command.Parameters.Add("@Return", System.Data.SqlDbType.Int).Direction = ParameterDirection.ReturnValue;
        command.ExecuteNonQuery();

        return (int)command.Parameters["@Return"].Value;
    }
}

次に、ループ内でメソッドを呼び出すだけです。

foreach (DataRow row in dt.Rows)
{
    int i = GenerateReturnValue(getCourseID(row["Course Name"].ToString()), studentCurrID.Value);
    if (i = 0)
    {
        MessageBox.Show("Added Course Successfully!");
        //return 0;
    }
    else
    {
        MessageBox.Show("An error occured! Possibly a duplication of data!");
        //return -1;
    }
}

さらに、問題you never re-pull the return value from the query, you are missing that line after execution:

于 2012-10-18T09:33:25.413 に答える