繁体   English   中英

存储过程无法通过实体框架正确执行

[英]Stored procedure not executing correctly through entity framework

当我在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();

- 更新 -

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

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管理器中手动运行此命令,则会出现以下错误:

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

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

ToShortDateString()产生的日期可能有问题,因为它不会2016-02-01那样格式化日期 它将根据运行的文化来产生一个日期,因此将从上面的链接中输出如下内容:

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

当使用.ToShortDateString() ,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);

您可以检查参数d1d2的值,以确保格式符合您的期望。

从您的陈述:

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... SP要求,您的dateFromdateTo已经是日期时间。 您当前正在将string传递给datetime参数。 解决这个问题,我认为您应该很好。

另外,这是a年,您是否可以将一些奇怪的日期数学逻辑不考虑在内?

仅当日期时间格式化为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

我遇到了一个类似的问题,我正在获得例外,

将数据类型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..."

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM