【发布时间】:2016-02-25 16:21:53
【问题描述】:
当我在 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();
-- 更新--
存储过程需要一个日期时间,虽然我可以使用字符串在本地运行它(它会将其转换为日期时间),但它不会通过 ExecuteSqlCommand 运行,除非我将参数作为 DateTimes 传递。当然,如果我传递一个 datetime 参数,它应该知道哪些是天、月和年?
ALTER PROCEDURE [dbo].[sproc]
(
@Date_From AS DATETIME,
@Date_To AS DATETIME
)
-- 更新--
通过 SQL Profiler 检查时正在执行以下操作
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 时出错。
用户/安全/数据库设置?
【问题讨论】:
-
您能否让分析器在数据库上运行并查看 EF 正在传递什么查询?
-
@Jay 它似乎正在转换为 nvarchar? (我认为)
@Date_From=N'29/02/2016',@Date_To=N'01/02/2016' -
@Jay 如果我在 sql 管理上运行它,它会运行
exec [dbo].[sproc] '01-02-2016', '29-02-2016' -
存储过程是否需要一个日期时间值?尝试将其作为日期时间值而不是字符串传递
-
“不是它应该做的”是什么意思?您正在另一个线程上运行它,这就是为什么您看不到它在搅拌的原因。委托返回 void,因此没有输出。你是说它应该在数据库中产生没有发生的副作用吗?如果你把它从线程中取出怎么办(无论如何这很糟糕,使用
ExecuteSqlCommandAsync())。
标签: c# sql-server entity-framework stored-procedures