【发布时间】:2017-04-19 10:54:57
【问题描述】:
在我的 C# 应用程序中,我正在使用 Dapper 调用存储过程:
return conn.Query<MyList>("check_data", new { dataToCheck }, commandType: CommandType.StoredProcedure);
dataToCheck 是 DataTable,因为 check_data 接受 TVP。此表类型有 2 列(from_date varchar(20)、to_date varchar(20)),基于以下类。
public class DataToCheckType
{
public DateTime? from_date {get; set;}
public DateTime? to_date {get; set;}
}
Dapper 然后将以下内容发送到 SQL Server:
declare @p1 dbo.CheckDataType
insert into @p1 values('2017-04-19 00:00:00','2017-04-19 00:00:00')
exec check_data @dataToCheck=@p1
SP 本身很简单。它调用一个构建 SQL 语句的函数,然后执行该语句:
DECLARE @sql nvarchar(max) = dbo.GetSql(@dataToCheck);
DECLARE @results TABLE (Id int);
INSERT INTO @results EXECUTE(@sql);
GetSql 函数开始如下:
DECLARE @fromDate datetime;
DECLARE @toDate datetime;
SELECT
@fromDate = CONVERT(datetime, from_date, 120),
@toDate = CONVERT(datetime, to_date, 120),
FROM
@dataToCheck;
它会继续按预期构建 SQL 语句。从T-SQL 运行SP 时,一切正常。
但是,当从代码运行相同时,我收到以下错误:
check_data : 241 从字符串转换日期和/或时间时转换失败
为什么 SP 在 T-SQL 中可以工作,但在从代码中调用它时却不行?日期有什么问题?
【问题讨论】:
-
当你声明一个变量时包括类型。我无法从您的代码中分辨出什么是 Varchar,什么是 DataTime。
-
这条线,
exec check_data @dataToCheck=@p1,看起来很可疑。具体来说,等号。 -
@DanBracuk 这就是生成的内容,它在 TSQL 中工作。 SP 的 dataToCheck 参数设置为 p1 变量。
-
您的表是否与 SQL 中的 TableValueType 具有相同数据类型的相同列?看了stackoverflow.com/questions/16042499/…??
-
为什么你的表是
(from_date varchar(20), to_date varchar(20))而不是(from_date date, to_date date)?日期格式取决于文化和DATEFORMAT选项。
标签: c# sql sql-server dapper