выходная команда SQL выглядит следующим образом:
UPDATE newbusiness_dataset SET action_date='20/02/2016' WHERE id='100001'
Путь ваша функция обновления, вероятно, неправильно. Клещи не являются универсальными разделителями переменных SQL. Они используются для указания текста: поэтому ваш метод преобразует Date
в строку и, возможно, тот же для идентификатора, который обычно является числовым. Кроме того, этот код:
Dim deferdate As Date = Format(nb_deferdatepicker.Value, "yyyy-MM-dd")
Использование Option Strict On
это не будет компилироваться. Format
- это функция, возвращающая строку, но код присваивает результат DateTime
var. Просто нет оснований пытаться форматировать значение DateTimePicker
, поскольку оно уже является датой, а объекты поставщика данных MySQL NET знают, как передать дату NET в db.
Учитывая полученный SQL, я также подозреваю, что вы используете конкатенацию для склеивания битов строки вместе для запроса. Это очень опасный и может привести к атакам SQL injection. Он также потерпит неудачу при именах, таких как Charles D'Artagnan
или Pete's Plumbing
.
SQL-параметры предотвращают это, позволяют передавать типизированные данные поставщику данных и в результате легко читать и поддерживать SQL. Общий подход будет выглядеть так:
Dim rows As Int32
Dim SQL = "UPDATE Table_Name SET colA = @p1, colB = @p2, colC = @p3 WHERE Id = @p4"
Using dbcon As New MySqlConnection(connStr)
Using cmd As New MySqlCommand(SQL, dbcon)
cmd.Parameters.Add("@p1", MySqlDbType.String).Value = myFrm.TextBox1.Text
cmd.Parameters.Add("@p2", MySqlDbType.Int32).Value = intVar
cmd.Parameters.Add("@p3", MySqlDbType.DateTime).Value = DateTime.Now
' the where:
cmd.Parameters.Add("@p4", MySqlDbType.Int32).Value = intVarA
dbcon.Open()
rows = cmd.ExecuteNonQuery()
End Using
End Using
- Применение метода блоков выбрасывайте вещи, которые должны быть переданными свободных ресурсов
- Новое соединение и объект команды создаются, используются и утилизированы , Часто помощники любят повторно использовать их, но особенно с объектом DBCommand нет ничего повторного использования.
- С
ExecuteNonQuery
сообщит, сколько строк затронуто, rows
отражает этот результат.
Магия, такой, как она есть, находится здесь:
cmd.Parameters.Add("@p3", MySqlDbType.Date).Value = datetimeVar
Использование параметров можно передать фактическую DateTime
переменную вместо текста. Вы можете использовать myDateTimePicker.Value
, потому что значение : a DateTime
.
- Для
Date
колонки, используя MySqlDbType.Date
параметр будет проходить только часть даты в базу данных.
MySqlDbType.DateTime
сохранит любую часть DateTime
, установленную БД для принятия.
То же самое верно с использованием MySqlDbType.Int32
для идентификатора: вместо преобразования в строку вы можете передать правильный тип данных.
- это action_date 'datetime' в базе данных? – Hemal
Его 'Дата', а не 'DateTime', так как я не беспокоюсь о времени вообще, просто дата. Я также попытался изменить его на Datetime, чтобы узнать, не изменилось ли оно, но все же оно не обновляет запись. – John
Измените его на 'yyyy-mm-dd' – Hemal