LSB71 Ответов: 4

C# windows form SQL dateadd et like


Hello,



Простите мне мой английский, который я не понимаю ... Спасибо переводчику, спасибо.
Я не могу решить поиск sql
Мой текущий код работает хорошо и говорит мне, чего я хочу.

string RechMstpe18 = "Armoire";
   string RechEmail19 = "NON";
   string date1 = DateTime.Now.ToShortDateString(); 

sql = "Select * from Tble_MES_121 WHERE (Statut LIKE '" + RechMstpe18 + "%')" +
                " AND (Email LIKE '" + RechEmail19 + "%') AND (Date_vente IS NULL)";


Мне нужно добавить код ниже, чтобы улучшить свой поиск ... но это не работает.

AND (DATEadd(dd, -7, CONVERT(Date_fin_vente)) Like '" + date1 + "%')


Кто может помочь мне решить эту проблему ?


благодарить,

Что я уже пробовал:

connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\resources\BDD_Suivi_vente.accdb;Persist Security Info=False";

sql = "Select * from Tble_MES_bds_121 WHERE (Statut LIKE '" + RechMstpe18 + "%')" +
                " AND (Email LIKE '" + RechEmail19 + "%') AND (Date_MES IS NULL) AND (DATEadd(dd, -7, CONVERT(Date_fin_MSTPE)) Like '" + date1 + "%')";

4 Ответов

Рейтинг:
34

Herman<T>.Instance

Если поле даты равно нулю, оно не может быть заполненной датой. Таким образом, заполненные даты исключаются в вашем предложении WHERE
Возможно:

AND (Date_MES IS NULL OR Date_MES BETWEEN (DATEadd(dd, -7, CAST( date1 As DAteTime) AND CAST( date1 As DAteTime))

как часть вашего запроса


LSB71

Привет дигиманус,
Спасибо Вам за вашу помощь,
Я не могу найти решение.
Сначала я хотел бы облегчить понимание смысла.
Например :
(Статут как ? + '%') И (например, электронная почта ? + '%') И (Date_MES равно NULL или Date_MES между (date1 = Date_fin_MSTPE))";
Для простоты date1 = Date_fin_MSTPE
Но я получаю ошибку
Как это сделать ?

Огромное спасибо!

Рейтинг:
2

Patrice T

sql = "Select * from Tble_MES_121 WHERE (Statut LIKE '" + RechMstpe18 + "%')" + " AND (Email LIKE '" + RechEmail19 + "%') AND (Date_vente IS NULL)";

Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


Рейтинг:
1

LSB71

Привет,
спасибо за ВАШ интерес к моему коду.
Вот выдержка из измененного хода.

 string connectionString = null;
 OleDbConnection cnn;
 string sql = null;
 OleDbDataReader reader;

 string RechMstpe18 = "MSTPE";
 string RechEmail19 = "NON";

 string date1 = DateTime.Now.ToShortDateString();   // DAte J

//   MessageBox.Show("" + date1);

 connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\resources\BDD.accdb;Persist Security Info=False";
 sql = "Select * from Tble_MES_bds_121 WHERE " +
         "(Statut LIKE ? + '%')" + // Is there the word MSTPE
         " AND (Email LIKE ? + '%')" + // Is there the word NO for email
         " AND (Date_MES IS NULL)"; // The date DATE_MES is fast

     //  it's these three conditions are gathered so I can send a message by email ..
     //  BUT! I have to send an email 7 days before the end of the date(DATE_fin _MSTPE)

     cnn = new OleDbConnection(connectionString);
     cnn.Open();
     OleDbCommand cmd = new OleDbCommand(sql, cnn);

     cmd.Parameters.AddWithValue("@Statut", RechMstpe18);
     cmd.Parameters.AddWithValue("@Email", RechEmail19);
     cmd.Parameters.AddWithValue("@MSTPE", date1);

     reader = cmd.ExecuteReader();

     while (reader.Read())

     { //  HERE my code }

     reader.Close();
     cmd.Dispose();
     cnn.Close();

Вполне возможно, что одновременно будет отправлено несколько электронных писем.
Для каждой проверенной строки, когда сегодняшняя дата составляет 7 дней с даты окончания (Date_fin_MSTPE).
Спасибо


LSB71

Могу ли я прикрепить фотографию в поддержку своего вопроса ?

CHill60

Нет

Рейтинг:
0

MadMyche

У меня нет ответа для тебя, мой друг. доступ MS он немного заржавел, и финики там не были моей сильной стороной.
Примеры использования дат в качестве критериев в запросах доступа - Access[^]

Однако я обязан указать, что вы используете код, который восприимчив к SQL-инъекциям. Вы никогда не должны собрать воедино SQL-оператор объединения строк.
Правильный способ добавить переменные в этот запрос-использовать заполнители внутри вашего запроса, а затем добавить Parameters в команду Оле. OLE ограничивает заполнители вопросительным знаком (?), и добавляемые значения должны быть в точном порядке, чтобы заполнить подготовленную инструкцию.

Примерно так должен выглядеть ваш запрос

connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\resources\BDD_Suivi_vente.accdb;Persist Security Info=False";

sql = "Select * from Tble_MES_bds_121 WHERE (Statut LIKE ? + '%') AND (Email LIKE ? + '%') AND (Date_MES IS NULL) AND (DATEadd(dd, -7, CONVERT(Date_fin_MSTPE)) Like ? '%')";

OleDbCommand cmd = new OleDbCommand(sql, connection);
cmd.Parameters.AddWithValue("@Statut", RechMstpe18);
cmd.Parameters.AddWithValue("@Email", RechEmail19);
cmd.Parameters.AddWithValue("@MSTPE", date1);


LSB71

Большое вам спасибо, я принимаю к сведению ваши замечания.