【问题标题】:Wrong date when using SQL Server stored procedure with Dapper将 SQL Server 存储过程与 Dapper 一起使用时的日期错误
【发布时间】:2017-11-18 05:25:19
【问题描述】:

我正在使用带有 Dapper 的存储过程从表中检索数据。存储过程在 SQL Server 中执行时可以正常工作并返回所需的信息。

但是当我使用 Dapper 运行存储过程并检索 Date 时,Date 将返回为 01/01/0001

这是我在 SQL Server 中完美运行的存储过程:

ALTER PROCEDURE [dbo].[spRankings_GetByEventAndGender]
   @Event varchar(50),
   @Gender varchar(10)
AS
BEGIN
    DECLARE @event_factor INT = CASE
                                   WHEN @Event IN ('Javelin', 'Discus', 'Shot Put', 'Hammer', 'Long Jump', 'High Jump', 'Triple Jump', 'Pole Vault')
                                      THEN -1 /* reverse ranking = highest value is best */
                                      ELSE 1  /* normal ranking = lowest value is best */
                                END;

    SELECT 
        CASE
           WHEN a.mark = ABS(b.mark)
              THEN CAST(b.rank AS VARCHAR)
              ELSE ''
        END AS [Rank],
        /*
         ,a.athleteid
         ,a.teamid
         ,a.eventid
        */
        CASE
           WHEN @event_factor = -1
              THEN LTRIM(STR(a.mark, 10, 2))
              ELSE FORMAT(DATEADD(SECOND, FLOOR(a.mark), 0),case when a.mark<60 then '' else 'm:' end+'ss')
                 +substring(ltrim((str(cast(a.mark as decimal(12,5))%1,10,2))),2,10)
          end as Mark
         ,a.wind as Wind
         ,d.eventname as [Event]
         ,c.firstname+' '+c.lastname as Athlete
         --,Convert(varchar(10),c.BirthDate,103) as [Birth Date]
         ,c.BirthDate as [BirthDate]

         ,e.teamname as [Team]
         ,a.venue as Venue
         --, Convert(varchar(10),a.PerformanceDate,103) as [Performance Date]
         ,a.PerformanceDate as [Performance Date]
     from dbo.Performances as a
          inner join (select a.PersonId
                            ,a.eventid
                            ,min(a.mark*@event_factor) as mark
                            ,rank() over(partition by a.eventid order by min(a.mark*@event_factor)) as [rank]
                            ,avg(a.mark) as avg_mark
                        from dbo.Performances as a
                             inner join dbo.Persons as b
                                     on b.PersonId=a.PersonId
                             inner join dbo.[Events] as c
                                     on c.eventid=a.eventid
                             inner join dbo.Meets as d
                                    on d.MeetId = a.MeetId
                       where b.gender=@Gender
                         and c.eventname=@Event
                       group by a.PersonId
                               ,a.eventid
                     ) as b
                  on b.eventid=a.eventid
                 and b.PersonId=a.PersonId
          inner join dbo.Persons as c
                  on c.PersonId=a.PersonId
          inner join dbo.events as d
                  on d.eventid=a.eventid
          inner join dbo.teams as e
                  on e.teamid=a.teamid
            inner join dbo.Meets as m
                on m.MeetId = a.MeetId

    order by a.eventid
            ,a.mark*@event_factor
            ,b.[rank]
/*
            ,b.avg_mark
            ,a.athleteid
*/
end

SQL Server 中的结果:

使用Dapper获取结果的方法:

public List<RankingsModel> GetRankingsByEventAndGender(string eventName, string gender) {
    using (IDbConnection connection = new System.Data.SqlClient.SqlConnection(Helper.GetConString("GARanks"))) {
        var output = connection.Query<RankingsModel>($"dbo.spRankings_GetByEventAndGender @Event, @Gender", new { Event=eventName, Gender=gender}).ToList();
        return output;
    }
}

我的应用程序中的结果:

【问题讨论】:

  • sql server中表中日期列的数据类型是什么?

标签: c# sql-server dapper


【解决方案1】:

您正在应用程序中获取默认值。请在下面找到可以提供帮助的链接:

Date is 01/01/0001 and not the date that is in the database?

DateTime shows the date as 01/01/0001

HTH

谢谢。

【讨论】:

  • 感谢您的帮助。问题是 Performance Date 导致了错误的日期,所以当我将 Performance Date 更改为 PerformanceDate 时它起作用了
【解决方案2】:

您可能可以将问题分解为多个部分。首先确保 Dapper 返回正确的结果集。你可以

connection.Query<Object>

connection.Query<dynamic>

并在调试模式下检查结果以查看其中是否包含正确的 DateTime 值。如果是这样,那么问题不在于从数据库中检索结果,而是无法将其映射到您的 POCO/类。

如果结果数据集没有正确的 Performance Date 值,那么问题出在 Dapper 正在执行的 sql 生成中,您可以考虑将列重命名为不带空格,或采用该途径。 祝你好运!

【讨论】:

    【解决方案3】:

    您可能在 RankingsModel 类中有一个名为 'PerformanceDate' 的属性,它没有与从 DB 调用返回的 'Performance Date' 进行映射。

    请更新 SQL 以返回 'PerformanceDate' 或为两者使用相同的名称。

    另一个选项是使用Column Mapping

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多