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

本文关键字:执行 框架 实体 存储过程 | 更新日期: 2023-09-27 18:36:23

当我在 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服务器管理器中手动运行它,则会收到以下错误:

将数据类型 varchar 转换为日期时间时出错。

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

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

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

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

SQL Server 在使用 .ToShortDateString() 时可能无法正确格式化此值 ( '2016-02-01' ),它可能会以错误的方式获取日期和月份,这可能会解释您的意外结果。

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

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);

您可以检查参数中的值 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... - 您的dateFromdateTo已经是日期时间,正如 SP 所要求的那样。 您当前正在将string传递到datetime参数中。 解决这个问题,我想你应该很好。

另外,这是一个闰年,你能不能有一些奇怪的日期数学逻辑没有考虑到这一点?

存储过程似乎仅在日期时间格式化为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

我遇到了类似的问题,我遇到了异常,

将数据类型 nvarchar 转换为日期时间时出错。

我不得不将 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..."