2017-11-18 1 views
0

Ich verwende eine gespeicherte Prozedur mit Dapper, um Daten aus einer Tabelle abzurufen. Die gespeicherte Prozedur funktioniert einwandfrei, wenn sie in SQL Server ausgeführt wird, und gibt die erforderlichen Informationen zurück.Falsches Datum bei Verwendung der gespeicherten SQL Server-Prozedur mit Dapper

Aber wenn ich Dapper verwenden, um die gespeicherte Prozedur auszuführen und eine Date abzurufen, wird Date als 01/01/0001 zurückgegeben.

Hier ist meine gespeicherten Prozedur, die perfekt in SQL Server funktioniert:

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 

Die Ergebnisse in SQL Server:

My Stored procedure Results in SQL Server

Die Methode, die die Ergebnisse Dapper zu bekommen verwendet:

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

Die Ergebnisse in meiner Anwendung:

The results in my Application

+0

verwendet Was ist der Datentyp der Datumsspalte in der Tabelle in SQL Server? – CodingYoshi

Antwort

0

Sie können das Problem wahrscheinlich in Stücke zerlegen. Stellen Sie zuerst sicher, dass Dapper die richtige Ergebnismenge zurückgibt. Sie könnten

connection.Query<Object> 

oder

connection.Query<dynamic> 

und überprüfen Sie das Ergebnis zu sehen, ob es den richtigen Datetime-Wert in sich hat, in der Debug-Modus. Wenn dies der Fall ist, ist das Problem nicht, die Ergebnisse aus der Datenbank abzurufen, sondern es kann sie nicht Ihrer POCO/Klasse zuordnen.

Wenn das Ergebnis-Dataset nicht den richtigen Wert Performance Date hat, dann ist das Problem mit der sql-Generation, die Dapper macht, und Sie könnten die Spalte umbenennen, um ohne Leerzeichen zu sein, oder diese Avenue verfolgen. Viel Glück!

0

Sie haben wahrscheinlich eine Eigenschaft namens 'PerformanceDate' in RankingsModel Klasse, die nicht mit 'Performance Date' zurückgegeben von DB-Aufruf zugeordnet wird.

Bitte aktualisieren Sie die SQL, um 'PerformanceDate' zurückzugeben oder gleichen Namen für beide.

Die andere Option Column Mapping

Verwandte Themen