用asp.net执行存储过程

Posted

技术标签:

【中文标题】用asp.net执行存储过程【英文标题】:Executing stored procedure with asp.net 【发布时间】:2012-09-27 19:18:05 【问题描述】:

我正在尝试在 asp.net 中执行存储过程。存储过程需要 3 个参数,所有 3 个都是 ID(整数)。这 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()" 外面试试是个好主意。有什么建议吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

我从未使用过 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();
    

【讨论】:

我认为是“AddWithValue”导致了这个问题,因为我得到一个“storedProcedureName 有太多参数”。我认为它只是不断添加参数。 会在几分钟内通知您。必须重新编译【参考方案3】:

解决办法:

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个参数,值会相应地传入

【讨论】:

同时考虑“使用”语句。它会自动处理你的 finally 块。

以上是关于用asp.net执行存储过程的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET MVC - 存储过程执行返回无效对象

在 ASP.NET MVC 中执行 SQL Server 存储过程时如何防止超时错误?

Asp.net(C#) 获取 执行sql server 语句/存储过程后的 多个返回值?

在 ASP.NET MVC Core(C#) 中执行 Oracle 存储过程 (PL/SQL)

C# & ASP.NET MVC 5 - 从按钮单击执行存储过程,没有返回值

(asp.net)求一Sqlserver存储过程和网页代码,根据不同参数执行不同的查询语句。