首页 新闻 会员 周边

EF执行SQL语句的问题。

2
悬赏园豆:10 [已解决问题] 解决于 2012-05-28 15:05

在数据库里,写了个函数,用于返回数据库的日期时间:

CREATE FUNCTION [dbo].[GetDBServerDate]() 
RETURNS DateTime
AS
BEGIN
    return getdate();
END

然后在EF里该怎么使用?

我写了个简单的控制台程序,使用的是EF4.1(DbContext,发现只是ObjectContext的简单封装),代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (sdmpEntities sdmp = new sdmpEntities())
                {
                    foreach (var item in sdmp.Database.SqlQuery(typeof(DateTime), "GetDBServerDate"))
                    {
                    }
                }
            }
            catch
            {
            }
        }
    }

执行后,抛出异常:

The data reader has more than one field. Multiple fields are not valid for EDM primitive types.
问题补充:

我把数据结果修改为List<Object>,结果返回的数据集合是0个。

另外,写了个存储过程:

CREATE PROCEDURE [dbo].[sp_GetServerDateTime]
    @result datetime output
AS
BEGIN
    set @result = getdate()
    return 100
END

使用以下代码执行:

SqlParameter param = new SqlParameter("@result", System.Data.SqlDbType.DateTime2);

param.Direction = System.Data.ParameterDirection.Output;

var result = sdmp.Database.ExecuteSqlCommand("sp_GetServerDateTime", param);

报告以下错误:

过程或函数 'sp_GetServerDateTime' 需要参数 '@result',但未提供该参数。

使用以下代码调用能正确得到结果,但是返回却是-1。

 

                    int result;
                    SqlParameter param = new SqlParameter("@result", System.Data.SqlDbType.DateTime2);
                    param.Direction = System.Data.ParameterDirection.Output;
                    sdmp.Database.Connection.Open();
                    var cmd = (sdmp.Database.Connection as SqlConnection).CreateCommand();
                    cmd.CommandText = "sp_GetServerDateTime";
                    cmd.CommandType = System.Data.CommandType.StoredProcedure;
                    cmd.Parameters.Add(param);
                    result = cmd.ExecuteNonQuery();
                    sdmp.Database.Connection.Close();

反编译了执行过程,发现Database.ExecuteSqlCommand不支持存储过程。。。

无之无的主页 无之无 | 大侠五级 | 园豆:5095
提问于:2012-05-28 10:30
< >
分享
最佳答案
2
sdmp.Database.SqlQuery<DateTime>("exec sp_GetServerDateTime", param);
收获园豆:10
dudu | 高人七级 |园豆:31003 | 2012-05-28 13:52

如果想用DbCommand,参考:http://stackoverflow.com/a/1579220 

dudu | 园豆:31003 (高人七级) | 2012-05-28 13:54

多谢都都!!!居然把exec忘记了。

无之无 | 园豆:5095 (大侠五级) | 2012-05-28 15:04
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册