Ошибка при попытке получить даты с учетом условия из базы данных Access в WPF - PullRequest
1 голос
/ 08 октября 2019

Я разрабатываю приложение WPF, которое сохраняет пользовательские регистры и даты в базе данных Access. У меня не было проблем с вставкой дат, но теперь я хочу получить с помощью DataReader некоторые даты с определенным условием (например, все даты за текущий месяц). Когда я пытаюсь прочитать его через приложение, DataReader не возвращает строк. Но когда я пытаюсь выполнить тот же запрос в DBeaver, он возвращает данные.

Эта проблема чтения возникает только тогда, когда я пытаюсь прочитать даты с определенным условием, как я уже говорил ранее, поскольку, если я пытаюсь прочитать все даты, проблем нет.

Я попытался использовать параметризованную команду, а также напрямую вставить условие с помощью String.Format().

У меня есть эта функция (которая пытается вычислить, сколько дней вмесяц остается, если мы не считаем дни, сохраненные в БД):

public static int CalculateDaysLeftInMonth()
{
    int days = 0;
    List<DateTime> dates = new List<DateTime>();

    try
    {
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();

       OleDbCommand dbCommandQuery = new OleDbCommand {
            CommandText = "SELECT * FROM DatesTable WHERE Date LIKE @Condition"
        }

        dbCommandQuery.Parameters.AddWithValue("@Condition", String.Format("{0:yyyy-MM}-%", DateTime.Now));

        OleDbDataReader dbReader = dbCommandQuery.ExecuteReader();

        if (!dbReader.HasRows)
            return -1;

        while (dbReader.Read())
        {
            dates.Add(new FechaFestivo(dbReader.GetDateTime(0).Date));
        }

        dbConnection.Close();

        DateTime startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1),
                 endDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 
                           DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));

        for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
        {
            if (!dates.Any(ff => ff.Date == date.Date))
            {
                days++;
            }
        }
    }
    catch (OleDbException ex)
    {
        dbConnection.Close();
        return -1;
    }

    return days;
}

Это параметризованная версия. Я также пытался использовать:

dbCommandQuery.CommandText = String.Format("SELECT * FROM DatesTable WHERE Date " +
"LIKE '{0:yyyy-MM}-%'", DateTime.Now);

Я ожидаю получить список таких дат, поэтому я могу перебирать их:

list of dates on DBeaver

(CalendarioLaboral будет DatesTable и FechaFestivo будет Dates)

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 08 октября 2019

Like '2019-10-%' означает день в октябре 2019 года, поэтому он эквивалентен date between 2019-10-01 AND 2019-10-31. Попробуйте как:

SELECT * FROM DatesTable WHERE Date between '2019-10-01' AND' 2019-10-31'
0 голосов
/ 08 октября 2019

Код, который работал для меня в конце, следующий:

public static int CalculateDaysLeftInMonth()
{
    int days = 0;
    List<DateTime> dates = new List<DateTime>();

    try
    {
        if (dbConnection.State != ConnectionState.Open)
            dbConnection.Open();

       OleDbCommand dbCommand = new OleDbCommand {
           CommandText = String.Format("SELECT * FROM {0} WHERE (DATEPART('yyyy', FechaFestivo) = @Year " +
                                       "AND DATEPART ('m', FechaFestivo) = @Month)", TablaCalendario)
       }

       dbCommandQuery.Parameters.AddWithValue("@Year", DateTime.Now.Year);
       dbCommandQuery.Parameters.AddWithValue("@Month", DateTime.Now.Month);

        OleDbDataReader dbReader = dbCommandQuery.ExecuteReader();

        if (!dbReader.HasRows)
            return -1;

        while (dbReader.Read())
        {
            dates.Add(new FechaFestivo(dbReader.GetDateTime(0).Date));
        }

        dbConnection.Close();

        DateTime startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1),
                 endDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 
                           DateTime.DaysInMonth(DateTime.Now.Year, DateTime.Now.Month));

        for (DateTime date = startDate; date <= endDate; date = date.AddDays(1))
        {
            if (!dates.Any(ff => ff.Date == date.Date))
            {
                days++;
            }
        }
    }
    catch (OleDbException ex)
    {
        dbConnection.Close();
        return -1;
    }

    return days;
}

Использование функции DatePart, как сказано @Holger и @ June7 в комментариях. Спасибо!

...