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