zoukankan      html  css  js  c++  java
  • Entity Framework 调用返回标量值的存储过程

    最近项目用到EF,虽然说EF与Linq To SQL有很多地方相似,但是EF(这里指3.5版,4.0版的还没去留意)确实有些地方做得不够方便。

    就拿存储过程来说吧,EF里面想调用存储过程不是直接在数据库里拖进来就可以用,还要做一个function import的步骤来建立映射。 如果你的存储过程返回的是一个select * from .....的语句的话,那恭喜你,你的存储过程可以直接使用了。但是如果你的存储过程是返回标量值的呢?那不行,你会发现你的代码提示里面还是没有出现想要的存储过程名称。
      DevExpress 控件 ;

    为什么呢?原因就是EF没有为返回标量值的存储过程自动生成cs代码,他只是在edmx文件里面写上了诸如

    <Function Name="GetOrder" Aggregate="false" BuiltIn="false" NiladicFunction="false" IsComposable="false" ParameterTypeSemantics="AllowImplicitConversion" Schema="dbo">
              <Parameter Name="OrderID" Type="int" Mode="In" />
    </Function> 

    这样一串映射配置。如需在EF中调用这种存储过程的话,就必须自己写一个通用的调用方法,以下是方法的代码:

    private T ExecuteFunction<T>(string functionName, System.Data.EntityClient.EntityParameter[] parameters) where T : struct

            {

                System.Data.EntityClient.EntityCommand cmd = ((System.Data.EntityClient.EntityConnection)this.Connection).CreateCommand();

                cmd.CommandType = System.Data.CommandType.StoredProcedure;

                cmd.Parameters.AddRange(parameters);

                cmd.CommandText = this.DefaultContainerName + "." + functionName;

                try

                {

                    if (cmd.Connection.State != System.Data.ConnectionState.Open)

                        cmd.Connection.Open();

                    var obj = cmd.ExecuteScalar();

                    return (T)obj;

                }

                catch (System.Exception)

                {

                    throw;

                }

                finally

                {

                    cmd.Connection.Close();

                }

            }

    其中泛型T就是你的存储过程返回值的类型。

    虽然说有了调用方法,但是你还不可以放松,注意到方法里面有这样一句 var obj = cmd.ExecuteScalar();这句的意思就是获取返回表格的第一行数据,这有什么问题呢?问题就在于他只能拿到形式为表格(table)的返回值,如果你的存储过程是用return来返回结果的话,那不好意思,上面的方法会抛出一个The data reader returned by the store data provider does not have enough columns for the query requested.的异常,原因是return的存储过程并没有返回表格。这样的话,我们必须还要修改一下存储过程,把return改成select,这样就能顺利调用了。
     

  • 相关阅读:
    修改python的pip下载源
    MySQL_Sql_打怪升级_进阶篇_进阶12: DDL常见数据类型
    【Xshell】SFTP子系统申请已拒绝,请确保SSH连接的SFTP子系统设置有效
    MySQL_Sql_打怪升级_进阶篇_进阶11: DDL数据定义语言
    MySQL_Sql_打怪升级_进阶篇_进阶10: DML数据操纵语言
    MySQL_Sql_打怪升级_进阶篇_进阶9:联合查询
    MySQL_Sql_打怪升级_进阶篇_ 进阶8:分页查询
    MySQL_Sql_打怪升级_进阶篇_进阶7:子查询
    MySQL_Sql_打怪升级_进阶篇_进阶6:连接查询
    Ubuntu出现E: Failed to fetch
  • 原文地址:https://www.cnblogs.com/wwwzzg168/p/4111328.html
Copyright © 2011-2022 走看看