【问题标题】:Entity Framework 6 - How to determine stored procedure input parametersEntity Framework 6 - 如何确定存储过程输入参数
【发布时间】:2015-06-09 23:04:46
【问题描述】:

我正在使用 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));

我想自动生成此代码,但我需要能够先确定输入参数。

【问题讨论】:

    标签: c# .net sql-server entity-framework entity-framework-6


    【解决方案1】:

    您正在寻找的是 ADO.NET 的 SqlCommandBuilder.DeriveParameters() method 的等价物。不幸的是,据我所知,Entity Framework 没有提供任何类似的功能。

    也就是说,假设一个 Microsoft SQL Server 数据库,您可以事先查询数据库以获取参数列表。这可以使用类似于以下 SQL 的内容来完成:

    SELECT      PARAMETER_NAME, 
                DATA_TYPE
    FROM        information_schema.parameters
    WHERE       specific_name = 'SellerModify'
    

    我知道这不是您正在寻找的,但它可能会提供一种替代方法来解决您的问题。

    【讨论】:

    • 我想说这实际上是 OP 正在寻找的。​​span>
    【解决方案2】:

    我也在寻找类似的解决方案,但直到现在才找到任何东西。所以我结合了EF、SqlCommandSqlCommandBuilder.DeriveParameters(cmd)

    /// <summary>
    /// Prepare the SQL
    /// </summary>
    /// <param name="sqlText">sqlText contains StoreProcedure 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 2017-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多