我正在尝试在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()"
在尝试之外是一个好主意。有什么建议吗?
答案 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个参数,值将相应地传递