使用实体框架存储过程的日期参数

问题描述 投票:4回答:3

我正在接受Date参数的sql server db上调用存储过程,其中d1,d2是c#DateTime类型。我正在使用实体框架来这样做:

context.Database.ExecuteSqlCommand("myprocedure @p1 @p2",dt1.Date,dt2.Date)

它没有返回结果,所以我尝试了:

var p0 = new SqlParameter("p0",dt1);
p0.SqlDbType = SqlDbType.Date;
var p1= new SqlParameter("p1", dt2);
p1.SqlDbType = SqlDbType.Date;
context.Database.ExecuteSqlCommand("myprocedure @p1 @p2",p0,p1)

但是,如果我只是这样做:

context.Database.ExecuteSqlCommand("myprocedure @p1, @p2", '1/20/2014', '1/30/2014')

我得到正确的结果。请帮助..在这里让我烦恼。

c# sql entity-framework datetime
3个回答
2
投票

您的日期也包括时间。要做到这一点:

context.Database.ExecuteSqlCommand("myprocedure @p1, @p2", '1/20/2014', '1/30/2014')

您需要执行此操作:

context.Database.ExecuteSqlCommand("myprocedure @p1 @p2",dt1.Date.ToShortDateString() , dt2.Date.ToShortDateString())

这是因为我认为您的SP接受的是字符串,而不是DateTime类型。

请注意,日期字符串的格式取决于区域性。您可能想使用.ToString()方法手动指定MM / dd / YYYY格式等,以确保SP获得正确的格式化日期。


而且,您似乎没有正确使用实体框架。实体框架对象上应该有一个名为MyProcedure的方法,您可以直接调用该方法并传递参数。


-1
投票

问题:您提供的格式与数据库所期望的不完全相同。

Solution:始终最好将字符串转换为DateTime类型并发送。

替换为:

context.Database.ExecuteSqlCommand("myprocedure @p1, @p2", '1/20/2014', '1/30/2014')

使用此:

DateTime dt1=DateTime.ParseExact("1/20/2014","M/d/yyyy",CultureInfo.InvariantCulture);
DateTime dt1=DateTime.ParseExact("1/30/2014","M/d/yyyy",CultureInfo.InvariantCulture);
context.Database.ExecuteSqlCommand("myprocedure @p1, @p2", dt1,dt2);

-1
投票

在将值发送到参数之前,先尝试转换dt1dt2

     dt1= Convert.ToDateTime(DateTime.Now.ToString("MM/dd/YYYY");
     dt2= Convert.ToDateTime(DateTime.Now.ToString("MM/dd/YYYY");
© www.soinside.com 2019 - 2024. All rights reserved.