果园的存储过程

时间:2014-12-05 07:53:46

标签: sql orchardcms

您好我们正在开发一个项目,我正在尝试调用存储过程。我已经搜索了解决方案,但我没有找到任何方法来调用存储过程,所以任何人都可以告诉我如何执行存储过程。

3 个答案:

答案 0 :(得分:1)

我怎么最终使用下面的代码来执行存储过程并获得结果。

  using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress))
        {
            // temporary scope for new connection and setting stored procedure, parameters, and return RecordName list                               
            using (SqlConnection cn = new SqlConnection(_settingsManager.LoadSettings().First().DataConnectionString))
            {
                if (cn.State == ConnectionState.Closed)
                {
                    cn.Open();
                }
                const string storedProcedure = "usp_spName";
                SqlCommand cmd = new SqlCommand(storedProcedure, cn);  
                cmd.Parameters.AddWithValue("@IsVerified", "value");
                cmd.Parameters.AddWithValue("@page", "value"); 
                // for out put parameter
                cmd.Parameters.AddWithValue("@totalRows", 0);
                cmd.Parameters["@totalRows"].Direction = ParameterDirection.Output;
                cmd.CommandType = CommandType.StoredProcedure;
                IDataReader reader = cmd.ExecuteReader();
                while (reader.Read())
                {
                    // To Get The Values of the result
                    int id=Convert.ToInt32(reader["Id"].ToString()); 
                }
                reader.Close();
                try
                {
                    // To Get the Out Put Perameter
                    totalRecords = (int)cmd.Parameters["@totalRows"].Value;
                }
                catch
                {
                    totalRecords = 0;
                }
                cmd.Parameters.Clear();
                cmd.Dispose();
                cn.Close();
            }
        }

答案 1 :(得分:0)

实际上,我不知道存储过程,但您可以使用下面的examaple代码调用存储的函数。我是C#和果园的新手,所以我的方法可能不正确也不够好。首先,您应该使用ISessionLocator获取IOrchardServices对象实例,然后创建NHibernate ISession实例,然后使用IQuery/ISQLQuery创建CreateSQLQuery()

这里是Services class

的示例代码
public class ExampleService {
    private readonly IOrchardServices _oServices;          

    public EParamsServices(IOrchardServices oServices) {
         _oServices = oServices;
    }

    public float GetRegionPopulationDencity(int rId){

        //resolve ISession locator (you can do this using dependencies in ctor)
        ISessionLocator sl = _oServices.WorkContext.Resolve<ISessionLocator>();             

        //create session
        ISession _session = sl.For(null);

        // create raw SQL query
        return _session.CreateSQLQuery(@"SELECT data.RegionDencity(:rId) as result")
                        .AddScalar("result", NHibernateUtil.Single)
                        .SetParameter<int>("rId", rId)
                        .List<float>()
                        .FirstOrDefault<float>();             
    }

}

我认为你可以用同样的方式执行存储过程,只需改变SQL代码做exec yourProcNameExecuteUpdate()而不是List()方法(我不确定这部分)

您还应该在项目中添加对NHibernate程序集的引用,并添加NHibernate&amp; Orchard.Data部分using

答案 2 :(得分:0)

您必须在模块中引用 NHibernate System.Data ,然后才能使用以下代码

var cmd =  _transactionManager.GetSession().Connection.CreateCommand();

cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.CommandText = "MyStoredProcedure";

_transactionManager.GetSession().Transaction.Enlist(cmd);

cmd.ExecuteNonQuery();