【问题标题】:Error converting varchar to datetime when running stored procedure from code从代码运行存储过程时将 varchar 转换为 datetime 时出错
【发布时间】:2017-04-19 10:54:57
【问题描述】:

在我的 C# 应用程序中,我正在使用 Dapper 调用存储过程:

return conn.Query<MyList>("check_data", new { dataToCheck }, commandType: CommandType.StoredProcedure);

dataToCheckDataTable,因为 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


【解决方案1】:

通过将表类型中的列从 varchar(20) 更改为 date 解决了问题。

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 2016-12-09
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多