存储过程未通过实体框架

时间:2016-02-25 16:21:54

标签: c# sql-server entity-framework stored-procedures

当我在SQL Management Studio中运行以下存储过程时,它会按预期运行,大约需要5分钟才能完成。

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

然而,当使用Entity Framework运行时,它似乎需要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();

- 更新 -

存储过程需要一个日期时间,虽然我可以使用字符串在本地运行它(它会将其转换为datetime),但它不会通过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 Manager中手动运行,则会收到以下错误:

  

将数据类型varchar转换为datetime时出错。

用户/安全/数据库设置?

4 个答案:

答案 0 :(得分:0)

可能是var ts = document.getElementById('travelstart').value; var fs = document.getElementById('travelfinish').value; var startTime, endTime, timeArr; // split the hours and minutes timeArr = ts.split(':'); // Hours is in timeArr[0]; minutes in timeArr[1]; startTime = (timeArr[0] * 60) + +timeArr[1]; // do the same for end time: timeArr = fs.split(':'); endTime = (timeArr[0] * 60) + +timeArr[1]; // Now you can compare them return startTime >= endTime; 生成日期的问题,not going to format the date就像ToShortDateString()一样。它将根据其运行的文化生成一个日期,因此将从上面的链接输出这样的内容:

2016-02-01

使用// Displaying short date for en-US culture: // 6/1/2009 (Short Date String) 时,SQL Server可能无法正确格式化此值('2016-02-01'),它可能会错误地显示日期和月份,这可以解释您的意外结果。

可以在SQL Server Management Studio中运行的快速测试:

.ToShortDateString()

是否会产生:SELECT CAST('01/02/2016' AS DATE) 2016-01-02

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

2016-02-01

您可以检查参数int result = context.Database.ExecuteSqlCommand("exec [dbo].[sproc] @Date_From, @Date_To", d1, d2); d1中的值,以确保格式符合您的预期。

答案 1 :(得分: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参数。解决这个问题,我认为你应该做得很好。

此外,这是闰年,您是否可以将一些奇怪的日期逻辑逻辑考虑在内?

答案 2 :(得分:0)

当日期时间格式化为ISO8601时,似乎只执行存储过程。这是通过使用" s"调用ToString来实现的。作为论点

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

<强>结果

  

2016-02-01T12:00:00

答案 3 :(得分:0)

我有一个类似的问题,我得到了例外,

  

将数据类型 nvarchar 转换为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..."