使用匿名参数执行存储过程

本文关键字:执行 存储过程 参数 | 更新日期: 2023-09-27 18:28:11

我只是想知道是否有一种方法可以在不命名参数的情况下执行存储过程。这意味着C#按照参数在存储过程中声明的顺序解析参数。

public static DataTable GetRelatedResources(string StoredProcedure, object[] Parameters)
{
   var Results = new DataTable();
   try
   {
        using (SqlConnection conn = new SqlConnection())
        {
            using (SqlCommand cmd = new SqlCommand(ConfigurationManager.ConnectionStrings["MK3Entities"].ConnectionString))
            {
                conn.Open();
                cmd.Connection = conn;
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.CommandText = StoredProcedure;
                if (Parameters!= null)
                {
                   foreach(var Param in Parameters)
                   { 
                       // I Want To Do something like this
                       cmd.Parameters.AddWithValue(Param);
                   }
                }
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                adapter.Fill(Results);
            }
        }
    }
    catch (Exception ex)
    {
       MMSLogger.Instance.WriteToLog("Exception Executing Stored Procedure:" + ex.Message);
    }
    return Results;
}

使用匿名参数执行存储过程

改为执行命令,并传入参数'@p1'、'@p2'等:

cmd.CommandType = CommandType.Text;
cmd.CommandText = 'exec ' + StoredProcedure;
int i=0;
string comma = ' ';
foreach(var Param in Parameters)
   {
   var paramName = String.Format("@P{0}", i);
   cmd.CommandText += comma + paramName;
   cmd.Parameters.AddWithValue(paramName, Param);
   ++i;
   comma = ', ';
   }

请注意,AddwithValue是一个巨大的性能反模式。请参阅数据访问代码如何影响数据库性能

根据MSDN:

ParameterName以@paramname的形式指定。您必须设置在执行依赖于参数的SqlCommand之前使用ParameterName。

SqlCommand的另一篇MSDN文章:

不支持Nameless(也称为序数)参数用于SQL Server的.NET Framework数据提供程序。

所以答案是否定的,不命名参数就无法执行存储过程。

您的意思是类似于派生参数。MSDN的这篇文章概述了:

还可以使用DbCommandBuilder类。SqlCommandBuilder和OleDbCommandBuilder类提供了一个静态方法DeriveParameters,它自动填充命令的参数集合对象,该对象使用存储过程中的参数信息。笔记DeriveParameters覆盖任何现有参数信息用于命令。

另一种解决方案是从sql数据库中获取存储过程的参数,然后在代码中设置它们。但这需要一个额外的查询。要获取参数,请使用:

select * from dbo.parameters where specific_name='procedure-name'

但在任何情况下,都必须使用参数名称。