2017-11-18 80 views
0

我正在使用存儲過程和Dapper從表中檢索數據。存儲過程在SQL Server中執行時工作正常,並返回所需的信息。與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 [email protected] 
         and [email protected] 
         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中的結果:

My Stored procedure Results in SQL Server

使用小巧精緻得到的結果的方法:

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; 
    } 
} 

我申請的結果:

The results in my Application

+0

什麼是在SQL Server表的日期列的數據類型? – CodingYoshi

回答

0

你可以把問題分解成幾部分。首先確保Dapper返回正確的結果集。你可以

connection.Query<Object> 

connection.Query<dynamic> 

和檢查結果,看它是否有它的正確日期時間值,在調試模式。如果確實如此,那麼問題不在於從數據庫中檢索結果,而是因爲它無法將其映射到您的POCO /類。

如果結果數據集沒有正確的值Performance Date,那麼問題在於Dapper正在執行的sql生成,並且您可以考慮將該列重命名爲無空格或追求該途徑。 祝你好運!

0

您可能在RankingsModel類中有一個名爲'PerformanceDate'的屬性,它不會與DB調用返回的'Performance Date'映射。

請更新SQL以返回'PerformanceDate'或爲兩者同名。

另一種選擇是使用Column Mapping