在数据库里,写了个函数,用于返回数据库的日期时间:
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不支持存储过程。。。
sdmp.Database.SqlQuery<DateTime>("exec sp_GetServerDateTime", param);
如果想用DbCommand,参考:http://stackoverflow.com/a/1579220
多谢都都!!!居然把exec忘记了。