使用Entity Framework存储过程的日期参数

5

我正在调用一个接受日期参数的SQL Server DB存储过程,其中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')

我得到了正确的结果。请帮忙..我快疯了。
3个回答

4
你的日期也包括时间。要实现这一点,请按照以下步骤操作:
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 的方法在实体框架对象上,您可以直接调用并传递参数。

0
问题:您提供的格式不是数据库所期望的格式。
解决方案:最好将字符串转换为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);

该问题的原帖已经尝试使用DateTime数值类型,但由于存储过程接受字符串参数而不是日期参数,因此失败了。 - Panagiotis Kanavos

0

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

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

如果想要获取DateTime值的日期部分,请调用.Date属性。你的代码实际上会失败,因为你使用了本地化格式(仅限美国),而不是明确的yyyy-MM-dd格式。 - Panagiotis Kanavos
@PanagiotisKanavos 您可以将格式从 MM/dd/YYYY 更改为您需要的任何格式... 为什么要让问题变得更加复杂呢?... 哈哈 - cyan
日期没有格式,它们是二进制值。实际上,不考虑语言环境的多次转换使事情变得更加复杂。 - Panagiotis Kanavos
电脑相关的几乎所有东西都是二进制值……我提到的日期格式可以在这个参考链接中找到:https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx,你说“你使用本地化格式(仅限美国),而不是明确的yyyy-MM-dd。” 我觉得您在利用自己的声誉指数欺负别人……这不是分享和学习环境中健康的方式。谢谢您 - cyan
你误解了我的写作意思。日期类型没有格式,就像小数或整数一样。因此,没有理由使用字符串格式化将它们转换为截取时间部分。但是当解析字符串为DateTime或调用Convert.ToDateTime时,当前系统区域设置用于解析日期。格式为“yyyy-MM-dd”的日期是无歧义的,即在所有语言环境中解析相同。然而,以美国格式“MM/dd/YYYY”格式化的日期仅对美国区域设置正确解析。在其他任何语言环境中,您将得到错误的日期或异常。 - Panagiotis Kanavos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接