Выберите записи по диапазону дат в таблице доступа из C# приложения - PullRequest
0 голосов
/ 11 января 2020

Я разрабатываю простое приложение C# для извлечения определенных записей из одной таблицы и вставки в другую таблицу в MS Access. Также эта задача должна выполняться ежедневно с использованием планировщика задач Windows.

Выбор записей должен быть выполнен в диапазоне дат для получения «Созданных сегодня записей».

Мое приложение работает от [DateTime.Today.AddDays (-100) до DateTime.Today.AddDays (0)], но оно не будет работать для DateTime.Today.AddDays (0) до DateTime.Today.AddDays. (1)

Я сделал это ниже.

 OleDbConnection con = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\Users\\Tom\\Dropbox\\P2002\\p2002.mdb;Persist Security Info=True");
        OleDbCommand cmd = con.CreateCommand();
        con.Open();  
        Console.WriteLine("Connected...");
        cmd.CommandText = "Insert into New1 ([B ID], [Dat], [Sum]) SELECT BID, Dat, Summe FROM Bestellung Where [Datum] BETWEEN #" + DateTime.Today.AddDays(0) + "# AND #" + DateTime.Today.AddDays(1) + "#" ;
        Console.WriteLine(DateTime.Today.AddDays(0));
        Console.WriteLine(DateTime.Today.AddDays(1));
        cmd.ExecuteNonQuery();
        Console.WriteLine("Record Submitted");
        con.Close();

1 Ответ

0 голосов
/ 11 января 2020

Возможно, ваша проблема вызвана автоматическим преобразованием c из значений даты и времени (Today и Today.AddDays (1)) в строку при объединении этих значений.

Когда вы запрашиваете MS Access для полей даты со строковыми константами, он хочет, чтобы строки были отформатированы способом «MM / dd / yyyy», и поэтому вы должны возвращать строку, отформатированную в этом режиме, когда вы используете ее для представлять ваши значения даты. Вот так:

... Where [Datum] BETWEEN #" + DateTime.Today.ToString("MM/dd/yyyy") ...

(обратите внимание, что я удалил Today.AddDays (0), потому что это не имеет смысла)

, но есть другой способ намного более безопасный, потому что он избегает любых возможных Sql Атака с использованием инъекций и более гибкая, поскольку она не заставляет вас объединять строки и использовать параметры форматирования. Этот метод называется «Параметризованный запрос»

Вот как переписать ваш код для использования параметров.

using(OleDbConnection con = new OleDbConnection(.....))
{
    OleDbCommand cmd = con.CreateCommand();
    con.Open();  
    Console.WriteLine("Connected...");
    cmd.CommandText = @"Insert into New1 ([B ID], [Dat], [Sum]) 
         SELECT BID, Dat, Summe 
         FROM Bestellung 
         Where [Datum] BETWEEN @d1 AND @d2";
    Console.WriteLine(DateTime.Today.AddDays(0));
    Console.WriteLine(DateTime.Today.AddDays(1));
    cmd.Parameters.Add("@d1", OleDbType.Date).Value = DateTime.Today;
    cmd.Parameters.Add("@d2", OleDbType.Date).Value = DateTime.Today.AddDays(1);
    cmd.ExecuteNonQuery();
    Console.WriteLine("Record Submitted");
}
...