Entity Framework 6 - 如何确定存储过程的输入参数

3

我正在使用EF6,已经导入了一些存储过程。有没有一种方法可以编程方式确定特定过程的输入参数?我想自动生成一些执行任何存储过程的C#代码,但我首先需要能够确定输入参数是什么。

例如,我目前已经导入了一个名为SellerModify的存储过程。我有部分C#代码来执行这个存储过程,如下所示:

DbContext.Database.ExecuteSqlCommand("SellerModify @MarketName, @BankLocationCountryCode, @BankAccountOwnerName”, 
    new SqlParameter("@MarketName", seller.MarketName),
    new SqlParameter("@BankLocationCountryCode", seller.BankLocationCountryCode),                   
    new SqlParameter("@BankAccountOwnerName", seller.BankAccountOwnerName));

我希望能够自动生成这段代码,但我需要先确定输入参数。
2个回答

3
你需要的是与ADO.NET的SqlCommandBuilder.DeriveParameters()方法相当的东西。不幸的是,据我所知,Entity Framework没有类似于此的功能。
话虽如此,假设使用Microsoft SQL Server数据库,您可以事先查询数据库以获取参数列表。可以使用类似以下SQL的内容来完成这个操作:
SELECT      PARAMETER_NAME, 
            DATA_TYPE
FROM        information_schema.parameters
WHERE       specific_name = 'SellerModify'

我知道这不完全是你要找的,但它可能为解决你的问题提供了一种替代方法。


1
我认为这实际上是OP正在寻找的。 - Chris Schaller

1

我也在寻找类似的解决方案,但一直没有找到。因此,我结合了 EF、SqlCommandSqlCommandBuilder.DeriveParameters(cmd)

/// <summary>
/// Prepare the SQL
/// </summary>
/// <param name="sqlText">sqlText contains stored procedure name</param>
/// <returns>Returns the prepared SQL</returns>
public (string sqlText, List<SqlParameter> parameters) PrepareSQL(string sqlText)
{
    List<SqlParameter> parameters = new List<SqlParameter>();

    using (var conn = new SqlConnection(db.Database.Connection.ConnectionString))
    {
        using (var cmd = new SqlCommand(sqlText, conn))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            conn.Open();
            SqlCommandBuilder.DeriveParameters(cmd);

            foreach (SqlParameter item in cmd.Parameters)
            {
                if (item.Direction != ParameterDirection.ReturnValue)
                {
                    sqlText += item.ParameterName + ",";
                }

                if (item.Direction == ParameterDirection.Output || item.Direction == ParameterDirection.InputOutput)
                {
                    item.Direction = ParameterDirection.Output;
                    parameters.Add(item);
                }
            }

            sqlText = sqlText.Trim(',');
            cmd.Parameters.Clear();
        }
    }

    return (sqlText, parameters);
}

在if语句中,您可以使用item.Direction == ParameterDirection.Input来表示输入参数。

您可以这样使用:

//Stored Procedure
string sqlText = "Report_Portfolio_Statement_Investor_Wise";
List<SqlParameter> parameters;
(sqlText, parameters) = PrepareSQL(sqlText);

// Input Parameters 
// I enter manually for now, could be automated later
parameters.AddRange(
    new List<SqlParameter>() 
    {
        new SqlParameter("@clientCode", clientCode),
        new SqlParameter("@reportDate", reportDate),
        new SqlParameter("@fromDate", fromDate)
    }
);

var data = db.Database.SqlQuery<PortfolioStatementInvestorReportVM>(sqlText, parameters.ToArray()).ToList();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接