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

时间:2014-10-28 14:41:08

标签: c# sql sql-server stored-procedures parameters

我只是想知道是否有办法在不命名参数的情况下执行存储过程。这意味着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;
}

3 个答案:

答案 0 :(得分:3)

根据MSDN

  

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

Another MSDN针对SqlCommand的文章:

  

无名,也称为序数,不支持参数   用于SQL Server的.NET Framework数据提供程序。

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

答案 1 :(得分:3)

你的意思是派生参数之类的东西。这个MSDN article给出了概述:

  

也可以使用the从存储过程派生参数   DbCommandBuilder类。 SqlCommandBuilder和   OleDbCommandBuilder类提供静态方法DeriveParameters,   它会自动填充命令的参数集合   使用存储过程中的参数信息的对象。注意   DeriveParameters会覆盖任何现有参数信息   为命令。

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

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

但无论如何,你必须使用参数名称。

答案 2 :(得分:3)

执行命令,并传入参数' @ 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是一个巨大的性能反模式。见How Data Access Code Affects Database Performance