2016-02-25 138 views
1

当我在SQL Management Studio中运行以下存储过程时,它按预期运行,大约需要5分钟才能完成。通过实体框架无法正确执行存储过程

exec [dbo].[sproc] '2016-02-01', '2016-02-29' 

但是,使用实体框架运行时,它似乎需要1秒,并没有真正做它应该做的,即使我传递相同的参数

难道这是一个配置问题?

我传递的连接字符串名称为DbContext构造函数和上面是在一个线程因超时运行

new Thread(new ThreadStart (delegate() 
{ 
    using (var context = new MyDbContext()) 
    { 
     var d1 = new SqlParameter("Date_From", dateFrom); 
     var d2 = new SqlParameter("Date_To", dateTo); 
     int result = context.Database.ExecuteSqlCommand("exec [dbo].[sproc] @Date_From, @Date_To", d1, d2); 
    } 
})).Start(); 

- 更新 -

存储过程需要一个日期时间,虽然我可以在本地使用字符串运行它(它会将其转换为日期时间),但它不会通过ExecuteSqlCommand运行,除非我将参数作为DateTimes传递。当然,如果我传递一个日期时间参数,它应该知道哪些是几天,几个月和几年?

ALTER PROCEDURE [dbo].[sproc] 
(
    @Date_From AS DATETIME, 
    @Date_To AS DATETIME 
) 

- 更新 -

正在执行通过SQL事件探查器

exec sp_executesql N'exec [dbo].[sproc] @Date_From, @Date_To',N'@Date_From datetime,@Date_To datetime',@Date_From='2016-02-01 00:00:00',@Date_To='2016-02-29 00:00:00' 

检查时,如果我运行这个手动SQL Server管理下,我得到以下错误:

Error converting data type varchar to datetime.

User/Security/DB S ettings?

+2

你能够得到在数据库上运行的分析器并查看哪些查询被EF传递? – Jay

+0

@Jay它似乎是铸造到一个nvarchar? (我认为)@ @ Date_From = N'29/02/2016',@ Date_To = N'01/02/2016'' – iswinky

+0

@Jay如果我在sql管理上运行它,它会运行'exec [dbo]。[sproc] '01 -02-2016','29 -02-2016'' – iswinky

回答

0

当日期时间格式化为ISO8601时,存储过程似乎只能执行。这是通过调用toString以 “S” 实现作为参数

var d1 = new SqlParameter("Date_From", dateFrom.ToString("s")); 
var d2 = new SqlParameter("Date_To", dateTo.ToString("s")); 

结果

2016-02-01T12:00:00

0

可能是ToShortDateString()产生的日期问题,因为它的not going to format the date2016-02-01。它会产生基于,它的下运行的文化的日期,所以会输出像这样从上面的链接:使用.ToShortDateString()

//  Displaying short date for en-US culture: 
//  6/1/2009 (Short Date String) 

SQL Server可能无法格式化这个值('2016-02-01')正确,它可能会一天和一个月的错误方式,这可以解释你意想不到的结果。

简单的测试,你可以在SQL Server Management Studio中运行:

SELECT CAST('01/02/2016' AS DATE) 

它会产生:2016-01-022016-02-01

您还可以在此行断点调试应用程序:

int result = context.Database.ExecuteSqlCommand("exec [dbo].[sproc] @Date_From, @Date_To", d1, d2); 

您可以检查值在paramters d1d2,以保证格式如您所愿。

+0

我得到'2016-02-01' – iswinky

+0

@iswinky我建议调试应用程序发布在我的回答中,检查发送给SQL的格式是“01/02/2016”还是“02/01/2016”。 – Tanner

+0

'@ Date_From = N'29/02/2016',@ Date_To = N'01/02/2016''是sql分析器和调试器中显示的内容 – iswinky

0

从您的语句:

new Thread(new ThreadStart (delegate() 
{ 
    using (var context = new MyDbContext()) 
    { 
     var d1 = new SqlParameter("Date_From", dateFrom.ToShortDateString()); 
     var d2 = new SqlParameter("Date_To", dateTo.ToShortDateString()); 
     int result = context.Database.ExecuteSqlCommand("exec [dbo].[sproc] @Date_From, @Date_To", d1, d2); 
    } 
})).Start(); 

ALTER PROCEDURE [dbo].[sproc] 
(
    @Date_From AS DATETIME, 
    @Date_To AS DATETIME 
) 

你不应该做dateFrom.ToShortDateString());dateTo... - 你dateFromdateTo已日期时间,作为SP需要。您目前正在将string传递给datetime参数。解决这个问题,你应该好,我会想。

此外,这是一个闰年,你可以有一些奇怪的日期mathing逻辑没有考虑到这一点?

+0

我试过传递日期时间值,它仍然无法正常工作 – iswinky

0

我有一个类似的问题在那里我得到异常,

Error converting data type nvarchar to datetime.

我必须将sql字符串更改为

int result = context.Database.ExecuteSqlCommand("exec [dbo].[sproc] @Date_From = @Date_From, @Date_To = @Date_To", d1, d2); 

由于某些原因,当添加@Parameters我需要将它们设置为SqlParameter名称。所以@Date_From, @Date_To = @Date_To..."