Как преобразовать дату SQL Server в C # DateTime - PullRequest
0 голосов
/ 19 декабря 2018

Я вызываю хранимую процедуру (используя SQL Server 2012) в своем приложении C # и преобразую результаты в объект ac #.Объект имеет свойство datetime, и хранимая процедура возвращает дату в виде одного из своих столбцов.Свойство объекта datetime всегда имеет значение 01/01/0001 00:00:00 при анализе результата запроса.

Вот мой код для использования хранимой процедуры, объект, используемый для анализа результатов, и сама фактическая хранимая процедура

public IEnumerable<InvoicingReportDto> GetInvoivingReportPerUser(DateTime startdate, DateTime enddate)
{
    string sproc = "[Updater].[InvoicingReportPerUser] @STARTDATE, @ENDDATE";

    var result = dbContext.Database.SqlQuery<InvoicingReportDto>
        (
            sproc,
            new SqlParameter("@STARTDATE", startdate.Date),
            new SqlParameter("@ENDDATE", enddate.Date)
        );

    return result.ToList();
}

public class InvoicingReportDto
{
    public DateTime LastUpdate { get; set; }
    public string UpdatedBy { get; set; }
    // other properties omitted
}

Хранимая процедура SQL Server:

CREATE PROCEDURE [Updater].[InvoicingReportPerUser]
    @STARTDATE DATETIME,
    @ENDATE DATETIME
AS
BEGIN
    SELECT 
        CAST(LastUpdate as DATE) AS LastUpdateDate,
        UpdatedBy,
        SUM(CASE WHEN CompanyStatusID = 1 THEN 1 ELSE 0 END) AS [NoStatus],
        SUM(CASE WHEN CompanyStatusID = 2 THEN 1 ELSE 0 END) AS Complete,
        SUM(CASE WHEN CompanyStatusID = 3 THEN 1 ELSE 0 END) AS [CeasedTrading],
        SUM(CASE WHEN CompanyStatusID = 4 THEN 1 ELSE 0 END) AS [NoInterested],
        SUM(CASE WHEN CompanyStatusID = 5 THEN 1 ELSE 0 END) AS [Wrongnumber],
        SUM(CASE WHEN CompanyStatusID = 6 THEN 1 ELSE 0 END) AS [FirstCall],
        SUM(CASE WHEN CompanyStatusID = 7 THEN 1 ELSE 0 END) AS [SecondCall],
        SUM(CASE WHEN CompanyStatusID = 8 THEN 1 ELSE 0 END) AS [ThirdCall],
        SUM(CASE WHEN CompanyStatusID = 9 THEN 1 ELSE 0 END) AS [Research],
        SUM(CASE WHEN CompanyStatusID = 10 THEN 1 ELSE 0 END) AS [EmailRequired],
        SUM(CASE WHEN CompanyStatusID = 11 THEN 1 ELSE 0 END) AS [Liquidation],
        SUM(CASE WHEN CompanyStatusID = 12 THEN 1 ELSE 0 END) AS [Receivership],
        SUM(CASE WHEN CompanyStatusID = 13 THEN 1 ELSE 0 END) AS [NotListed]
    FROM 
        Table
    JOIN 
        Updater.CompanyStatus CS ON CS.ID = CompanyStatusID
    WHERE 
        LastUpdate BETWEEN CAST(@STARTDATE AS DATE) AND CAST(@ENDATE AS DATE)
    GROUP BY 
        CAST(LastUpdate as DATE), UpdatedBy
    ORDER BY 
        CAST(LastUpdate as DATE)
END

Я ожидаю, что у моего объекта Dto будет установлено свойство LastUpdate, отражающее дату, возвращаемую хранимой процедурой, но это всегда 01/01/0001

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

IMO, нет необходимости создавать процедуру, чтобы просто выполнить ваш запрос.Вы можете определить свой запрос в некоторой строковой переменной в коде, чтобы у вас все было центрировано в вашем коде и использовать его вместе с SqlConnection, SqlCommand и SqlDatareader:

using(SqlConnection conn = new SqlConnection(/* args */))
{
    using(SqlCommand com = new SqlCommand())
    {
        com.Connection = conn;
        com.CommandText = /*your query goes here */ ;
        conn.Open();
        using(SqlDataReader reader = com.ExecuteReader())
        {
            // read your result here and manipulate them
        }
    }
}
0 голосов
/ 19 декабря 2018

Согласно документации имена атрибутов вашей сущности должны совпадать с именами столбцов.Ваши не отображаются (LastUpdate против LastUpdateDate).Вам нужно либо изменить название вашей собственности:

public class InvoicingReportDto
{
    public DateTime LastUpdateDate { get; set; }
    public string UpdatedBy { get; set; }
    // other properties omitted
}

, либо изменить псевдоним столбца

CAST(LastUpdate as DATE) as LastUpdate,

0 голосов
/ 19 декабря 2018

Ваш код выглядит правильно, за исключением того, что вы не запустили хранимую процедуру.Вы должны написать EXEC для запуска вашей хранимой процедуры:

string sproc = "EXEC [Updater].[InvoicingReportPerUser] @STARTDATE, @ENDDATE";

и дважды проверить, что возвращает следующий код в SQL Server Management Studio:

DECLARE @STARTDATE date = '2018-12-19', @ENDDATE date = '2018-12-11'
exec [Updater].[InvoicingReportPerUser] @STARTDATE, @ENDDATE

Кроме того, измените свое свойствоLastUpdate из InvoicingReportDto до:

public DateTime LastUpdateDate { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...