0

asp.netでストアドプロシージャを実行しようとしています。ストアドプロシージャには3つのパラメータが必要で、3つすべてがID(ints)です。3つのパラメーターは、TaskID、ExhibitID、およびInvestigatorIDです。

javascript関数から取得したExhibitIDの配列を含む隠しフィールドがあります。私の質問は、配列をループしているときにクエリを実行するにはどうすればよいですか?

これが私のストアドプロシージャの例です:

var cnSaveTask = new SqlConnection(ConfigurationManager.ConnectionStrings["OSCIDConnectionString"].ToString());
        var comLinkExhibitToTask = new SqlCommand("p_CaseFileTasksExhibitLinkAdd", cnSaveTask) { CommandType = CommandType.StoredProcedure };
        foreach (string exhibit in hidExhibitsIDs.Value.Split(','))
        {
            comLinkExhibitToTask.Parameters.AddWithValue("@TaskID", taskID);
            comLinkExhibitToTask.Parameters.AddWithValue("@ExhibitID", Convert.ToInt32(exhibit));
            comLinkExhibitToTask.Parameters.AddWithValue("@InvestigatorID", int.Parse(Session["InvestigatorID"].ToString()));

        }

        try
        {
            cnSaveTask.Open();
            comLinkExhibitToTask.ExecuteNonQuery();
        }

しかし、私のDBでは機能していません。何も追加されません。私の推測では、反復して実行されていないため、毎回「exhibitID」を置き換え続け、最終的には実行しようとします。"comLinkExhibitToTask.ExecuteNonQuery()" しかし、トライの外に追加するだけでは良い考えではないと思います。助言がありますか?

4

3 に答える 3

1

tryブロックをforeachループに移動するか、foreachループをtryブロックでラップすることができます。(必要なエラー処理に応じて、エラーに関する次の展示を続行するか、実行を完全に中止します)

于 2012-09-27T19:22:28.787 に答える
1

AddWithValueを使用したことがないので、その機能について話すことができません。これが私が通常このようなDB呼び出しを書く方法です。

using (SqlConnection cnSaveTask = new SqlConnection(ConfigurationManager.ConnectionStrings["OSCIDConnectionString"].ConnectionString))
{
    cnSaveTask.Open();

    using (SqlCommand comLinkExhibitToTask = new SqlCommand("p_CaseFileTasksExhibitLinkAdd", cnSaveTask))
    {
        comLinkExhibitToTask.CommandType = CommandType.StoredProcedure;

        comLinkExhibitToTask.Parameters.Add(new SqlParameter("@TaskID", SqlDbType.Int) {Value = taskID});
        // etc.

        comLinkExhibitToTask.ExecuteNonQuery();
    }
}
于 2012-09-27T19:37:10.883 に答える
0

ソリューション:

var cnSaveTask = new SqlConnection(ConfigurationManager.ConnectionStrings["OSCIDConnectionString"].ToString());
        try
        {
            var comLinkExhibitToTask = new SqlCommand("p_CaseFileTasksExhibitLinkAdd", cnSaveTask) { CommandType = CommandType.StoredProcedure };
            cnSaveTask.Open();
            comLinkExhibitToTask.Parameters.Add(new SqlParameter("@TaskID", SqlDbType.Int));
            comLinkExhibitToTask.Parameters.Add(new SqlParameter("@ExhibitID", SqlDbType.Int));
            comLinkExhibitToTask.Parameters.Add(new SqlParameter("@InvestigatorID", SqlDbType.Int));

            foreach (string exhibit in hidExhibitsIDs.Value.Split(','))
            {
                comLinkExhibitToTask.Parameters["@TaskID"].Value = taskID;
                comLinkExhibitToTask.Parameters["@ExhibitID"].Value = Convert.ToInt32(exhibit);
                comLinkExhibitToTask.Parameters["@InvestigatorID"].Value = int.Parse(Session["InvestigatorID"].ToString());

                comLinkExhibitToTask.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            ErrorLogger.Log(0, ex.Source, ex.Message);
        }
        finally
        {
            if (cnSaveTask.State == ConnectionState.Open)
            {
                cnSaveTask.Close();
            }
        }

私はループに入っていたので、パラメータを追加し続けました。したがって、ループの外側でパラメータを宣言し、ループ内の値のみを渡すだけです。そうすれば、パラメータは3つだけになり、それに応じて値が渡されます。

于 2012-09-27T20:11:33.973 に答える