Я создаю приложение с использованием C# и MySQL. Таблица MySQL (tbl_sales) имеет четыре поля (sale_item, sale_qty, added_n and last_updated_on). Тип данных поля last updated_on - DateTime. Я хочу отображать записи в DataGridView в соответствии со следующим SQL. SELECT * FROM tbl_sales WHERE last_updated_on > = " + dateTimePicker1.Text;
У меня следующая ошибка You have and error in your SQL syntax; check the manual that corrosponds to yout MySQL server version for the right syntax to use near " at line 1
Я использовал следующий код C#
private void button1_Click(object sender, EventArgs e)
{
string query;
try
{
conLocal.Open();
query = "SELECT * FROM tbl_sales WHERE last_updated_on > = " + textBox1.Text; // Convert.ToString(dateTimePicker1.Text);
cmdLocal = new MySqlCommand();
cmdLocal.Connection = conLocal;
cmdLocal.CommandText = query;
da = new MySqlDataAdapter();
da.SelectCommand = cmdLocal;
dt = new DataTable();
da.Fill(dt);
dataGridView1.DataSource = dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
da.Dispose();
conLocal.Close();
}
}



Возможный дубликат Каковы хорошие способы предотвратить SQL-инъекцию?





Вероятно, у вас должно быть текстовое значение даты и времени в одинарных кавычках. что-то вроде. Оператор синтаксического анализа вызовет исключение при недопустимых датах, поэтому обрабатывайте его соответствующим образом.
var lastUpdatedValue = DateTime.Parse(textBox1.Text);
var query = $"SELECT * FROM tbl_sales WHERE last_updated_on >='{lastUpdatedValue}'"
И последнее, но не менее важное: рекомендуемый подход - использовать параметризованные запросы вместо строк.
Я использовал приведенное выше предложение, он работает, но не отображает записи. Данные таблицы MySQL ссылка на сайт Без условия WHERE ссылка на сайт С условием WHERE ссылка на сайт
причина в том, что вы запрашиваете записи >= last_updated -> проверьте дату -> вы запрашиваете записи, обновленные после 15 мая, в то время как у вас есть записи, обновленные 13 мая или ранее. Таким образом, вам нужно либо изменить запрос на <=, либо указать соответствующую дату, например, 12 мая.
Как сказал Четан Ранпария, вы можете настроить параметр с типом данных MySqlDbType.DateTime для передачи значения даты в запрос следующим образом:
query = "SELECT * FROM tbl_sales WHERE last_updated_on >= @last_updated";
// conLocal is a MySqlConnection
using (var cmdLocal = new MySqlCommand(query, conLocal))
{
cmdLocal.Parameters.Add("@last_updated", MySqlDbType.DateTime).Value = DateTime.Parse(dateTimePicker1.Text);
// execute query & bind to DataGridView here
}
Если переданное строковое значение из средства выбора даты имеет предварительно заданное форматирование (например, yyyy-MM-dd HH:mm:ss), используйте DateTime.ParseExact при назначении значения параметра:
cmdLocal.Parameters.Add("@last_updated", MySqlDbType.DateTime).Value = DateTime.ParseExact(dateTimePicker1.Text, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
Я думаю, это немного для вставки кода, но мой выбирает запрос
Во-первых, вы должны использовать параметризованные запросы, чтобы избежать таких ошибок. Используйте параметризованный запрос и преобразуйте текст из datetimepicker в datetime и установите значение параметра с его помощью.