2016-02-19 2 views
1

У меня есть приложение datetimepicker в моем приложении, которое конечные пользователи будут использовать для выбора, когда элемент будет отложен.Получение даты от datetimepicker в mysql

Если пользователь выбирает дату и хиты подтверждение, дата должна быть отброшена в запись MySQL для этой записи, но я не могу показаться, чтобы получить VB для обновления значения DATE :(

Я думаю, его вероятно, форматирование вещь, но я не уверен, как лучше преодолеть это.

He're код под кнопкой «Подтвердить».

Private Sub ConfirmDefer_Click(sender As Object, e As EventArgs) Handles ConfirmDefer.Click 

    Dim deferdate As Date = Format(nb_deferdatepicker.Value, "yyyy-MM-dd") 
    updatesql("newbusiness_dataset", "action_date", deferdate, "id='" &  nb_prospectid.Text & "'") 

    nb_defer_schedule.Visible = False 
    nb_defer_schedule.Enabled = False 

    End Sub 

бит «UpdateSQL» является функцией я использую для упрощения обновления db. Его выход SQL co мм и является следующим:

UPDATE newbusiness_dataset SET action_date='20/02/2016' WHERE id='100001' 

Любая помощь оценена! Заранее спасибо

+1

- это action_date 'datetime' в базе данных? – Hemal

+0

Его 'Дата', а не 'DateTime', так как я не беспокоюсь о времени вообще, просто дата. Я также попытался изменить его на Datetime, чтобы узнать, не изменилось ли оно, но все же оно не обновляет запись. – John

+0

Измените его на 'yyyy-mm-dd' – Hemal

ответ

1

выходная команда 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 для идентификатора: вместо преобразования в строку вы можете передать правильный тип данных.

Смежные вопросы