C# 从代码运行存储过程时,将varchar转换为datetime时出错
在我的C#应用程序中,我正在使用Dapper调用一个存储过程:C# 从代码运行存储过程时,将varchar转换为datetime时出错,c#,sql,sql-server,dapper,C#,Sql,Sql Server,Dapper,在我的C#应用程序中,我正在使用Dapper调用一个存储过程: return conn.Query<MyList>("check_data", new { dataToCheck }, commandType: CommandType.StoredProcedure); Dapper然后将以下内容发送到SQL Server: declare @p1 dbo.CheckDataType insert into @p1 values('2017-04-19 00:00:00','201
return conn.Query<MyList>("check_data", new { dataToCheck }, commandType: CommandType.StoredProcedure);
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
时,一切正常
但是,当从相同的代码运行时,我得到以下错误:
检查数据:从字符串转换日期和/或时间时,241转换失败
为什么SP在T-SQL中工作,但在从代码调用它时不工作?日期有什么问题?当您声明变量包含类型时,通过将表类型中的列从
varchar(20)
更改为date解决了该问题。我无法从你的代码中分辨什么是Varchar,什么是DataTime。这一行,exec check\u data@dataToCheck=@p1
,看起来可疑。具体来说,等号是生成的,它在TSQL中工作。SP的dataToCheck参数设置为p1变量。表中的列是否与SQL中的TableValueType具有相同的数据类型?查看??为什么您的表是(从\u date varchar(20)到\u date varchar(20))
而不是(从\u date date,到\u date date)
?日期格式取决于区域性和DATEFORMAT
选项。
DECLARE @fromDate datetime;
DECLARE @toDate datetime;
SELECT
@fromDate = CONVERT(datetime, from_date, 120),
@toDate = CONVERT(datetime, to_date, 120),
FROM
@dataToCheck;