【问题标题】:Date parameter using Entity Framework stored procedure使用实体框架存储过程的日期参数
【发布时间】:2014-02-19 17:26:36
【问题描述】:

我在接受日期参数的 SQL 服务器数据库上调用存储过程,其中 d1d2 是 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


    【解决方案1】:

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

    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的方法,可以直接调用并传递参数。

    【讨论】:

      【解决方案2】:

      问题:您提供的格式不是 DB 所期望的。

      解决方案:最好将字符串转换为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);
      

      【讨论】:

      • OP 已经尝试使用 DateTime 值。这失败了,因为存储过程接受字符串参数而不是日期参数
      【解决方案3】:

      先尝试转换dt1dt2,然后再将值发送到参数:

           dt1= Convert.ToDateTime(DateTime.Now.ToString("MM/dd/YYYY");
           dt2= Convert.ToDateTime(DateTime.Now.ToString("MM/dd/YYYY");
      

      【讨论】:

      • 如果要获取 DateTime 值的日期部分,请调用 .Date 属性。您的代码实际上会失败,因为您使用的是本地化格式(仅限美国),而不是明确的 yyyy-MM-dd
      • @PanagiotisKanavos 您可以将格式从 MM/dd/YYYY 更改为您需要的任何格式...为什么您让问题更复杂?...大声笑
      • 日期没有格式。它们是二进制值。实际上,不考虑语言环境的多次转换使事情变得更加复杂。
      • 几乎所有东西都是计算机中的二进制值....我提到的日期格式可以在这个参考msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx中找到明确的 yyyy-MM-dd.-" 。我觉得你在用你的名誉点来辱骂别人……这在分享和学习环境中不是一种健康的方式。谢谢你,先生
      • 你误解了我写的内容。日期类型没有格式,就像小数或整数一样。因此,没有理由使用字符串格式将它们转换为截断时间部分。在将字符串解析为 DateTime 或调用 Convert.ToDateTime 时,将使用当前系统区域设置来解析日期。格式为yyyy-MM-dd 的日期是明确的,即它们在所有语言环境中解析相同。美国格式 MM/dd/YYYY 的日期虽然仅针对美国区域设置正确解析。在所有其他语言环境中,您都会得到错误的日期或异常。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-14
      相关资源
      最近更新 更多