【发布时间】:2018-04-20 08:37:15
【问题描述】:
使用 Entity Framework,我正在运行一个存储过程,但是我得到了这个错误:
将数据类型 nvarchar 转换为日期时间时出错
我从前端2017-11-07T00:00:00 获取值,并将其转换为DateTime 对象preAuthorize.DepositDate。然后我像这样调用存储过程:
var StartingDate = new SqlParameter("@StartingDate", preAuthorize.DepositDate);
dbContextScope.DbContexts.Get<BAEntities>().Database.ExecuteSqlCommand(
"My_Procedure @StartingDate, ...",
StartingDate,
...
);
我查看了 SQL 分析器,发现语句:
exec sp_executesql N'My_Procedure @StartingDate, ...', N'@StartingDate datetime, ...', @StartingDate='2017-11-07 00:00:00' ...
我在 SQL 中运行了它,它产生了同样的错误。奇怪的是,如果我删除StartingDate,我仍然会收到错误消息。这个存储过程已经存在多年了,所以我相信它与我调用存储过程的方式有关,而不是存储过程逻辑。
如果我把我的价值观直接插入
EXEC Web_Schedule_AddNewSchedule
@StartingDate = '2017-11-07',
...
然后这运行正常并插入数据,所以上面的sp_executesql语句有问题。
编辑:我将呼叫更改为
dbContextScope.DbContexts.Get<BAEntities>().Database.ExecuteSqlCommand(
"My_Procedure @StartingDate = @StartingDate, ...",
StartingDate,
...
);
在我设置的字符串中@StartingDate = @StartingDate, 它只有在我这样做之后才有效,但是我在网上看到的所有示例都没有这个。有人知道为什么吗?
【问题讨论】:
-
我在 SQL 中运行它并产生相同的错误,您是否在 SQL Server
SELECT CONVERT(DATETIME, '2017-11-07T00:00:00')中运行它并得到错误?我不这么认为。也许您正在传递另一个值而不是2017-11-07T00:00:00。 -
我的直觉是您的日期时间格式与预期的不同。
-
@Sami
sp_executesql代码得到 @StartingDate='2017-11-07 00:00:00' 所以这个值被很好地传递了。 -
我建议将
EXEC添加到您的 SP 调用中,即"EXEC My_Procedure @StartingDate, ..."
标签: c# sql-server entity-framework datetime stored-procedures