用asp.net执行存储过程

时间:2012-09-27 19:18:06

标签: asp.net stored-procedures

我正在尝试在asp.net中执行存储过程。存储过程需要3个参数,所有3个都是ID(int)。 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();
        }

但是我的数据库不能正常工作。什么都没有添加。我的猜测是,因为它是迭代而不是执行,所以每次都会不断更换“exhibitID”,然后最终尝试执行它。但我不认为只是添加"comLinkExhibitToTask.ExecuteNonQuery()" 在尝试之外是一个好主意。有什么建议吗?

3 个答案:

答案 0 :(得分:1)

您可以将try块移动到foreach循环中,也可以使用try块包装foreach循环。 (取决于您希望的错误处理 - 继续下一个错误展示或完全中止执行)​​

答案 1 :(得分:1)

我从未使用过AddWithValue,所以我不能说它的功能。以下是我通常如此编写数据库调用的方式。

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

答案 2 :(得分: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个参数,值将相应地传递