使用EntityCommand调用存储过程但结果始终为空

时间:2015-09-22 03:11:56

标签: c# sql-server entity-framework stored-procedures

我正在使用实体框架和azure用于db。事实是当EF不从模型返回字段时,EF对存储过程的效果不佳。 model.Context.cs文件中自动生成的代码返回整数。

       public virtual int GetLogTransaction(Nullable<long> transactionId)
    {
        var transactionIdParameter = transactionId.HasValue ?
            new ObjectParameter("transactionId", transactionId) :
            new ObjectParameter("transactionId", typeof(long));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("IHUBEntities.GetLogTransaction", transactionIdParameter);
    }

所以我决定避开这个文件并使用EntityCommand连接到db并执行我的程序。

      EntityConnection sqlConnection = new EntityConnection("name=IHUBEntities");
        sqlConnection.Open();
        using ( EntityCommand cmd = sqlConnection.CreateCommand())
        {

            LogTransactionInfor lgInfor = new LogTransactionInfor();
            try
            {
                cmd.CommandText = "IHUBEntities.GetLogTransaction";
                cmd.CommandType = CommandType.StoredProcedure;
                EntityParameter param = new EntityParameter();
                param.Value = transactionId;
                param.ParameterName = "transactionId";
                cmd.Parameters.Add(param);
                using (EntityDataReader reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
                {
                    while (reader.Read())
                    {
                      //get reader content here
                    }

                }
                cmd.Connection.Close();

            }catch (Exception ex)
            {
                lgInfor.err = ex.StackTrace;
                Console.Write(ex.StackTrace);
                cmd.Connection.Close();
            }
            finally
            {
                cmd.Dispose();
            }
            return lgInfor;
        } 

问题是读者总是空着,给我零结果。但是,当我使用相同的输入参数来测试db sql时,它将返回所需的结果。 所以,我认为问题可能是因为我编写程序的方式?

CREATE PROCEDURE [dbo].[GetLogTransaction]
@transactionId bigint = 0
 AS
 DECLARE
@tablename nvarchar(261),

@obj_name nvarchar(4000),
@pk bigint,
@pk_name nvarchar(500),
@opt nvarchar(20),
@usrId bigint,
@usrName nvarchar(200),
@sql nvarchar(4000),
@cn int
  DECLARE
@userTable table(
    usrId bigint,
    usrName nvarchar(200)
)
  BEGIN

 //select from different tables and set values to parameters
 ......

  select  @obj_name as obj_name, @pk as pk, @pk_name as pk_name, @opt as opt, @usrId as usrId, @usrName as usrName
  END

1 个答案:

答案 0 :(得分:0)

我假设你正在使用'数据库优先'。

您是否正确设置了存储过程的返回类型?

抱歉,我有点新,所以我不确定如何上传图片,但是: 1)打开.EDMX文件
2)在模型浏览器中,找到“功能导入”
3)双击存储过程。
4)单击“获取列信息” 5)单击“更新” 6)完成!

如果存储过程没有出现在“函数导入”中,则需要从数据库中更新模型。