Я пытаюсь вставить значения из средства выбора даты и времени в базу данных на С#, но получаю сообщение об ошибке

Я пытаюсь вставить значения из средства выбора даты и времени в базу данных, но получаю необработанное исключение

Ошибка преобразования при преобразовании даты и/или времени из строки символов

Это код, который я использовал:

private void bunifuFlatButton8_Click(object sender, EventArgs e)
{
    if (OrderID.Text == "" || CustomerID.Text == "" || CustName.Text == "" || AmountTB.Text = = "")
    {
        MessageBox.Show("Fill the data correctly");
    }
    else
    {
        SqlCommand cmd = new SqlCommand("insert into OrderTB values(" + OrderID.Text + "," + CustomerID.Text + ",'" + CustName.Text + "','" + OrderDate.Text + "'," + AmountTB.Text + ")", Con);
        Con.Open();

        cmd.ExecuteNonQuery();

        MessageBox.Show("Order successfully added");

        Con.Close();
        populate();
    } 
}

Любая помощь будет оценена.

У вас много проблем с этим небольшим фрагментом кода, но если OrderDate является средством выбора даты и времени, пользователь OrderDate.Value должен передать дату в базу данных. Затем посетите сайт документации Microsoft, чтобы узнать, как правильно использовать эти объекты поставщика базы данных.

Ňɏssa Pøngjǣrdenlarp 19.11.2022 05:44

Не используйте параметр для SQL, используйте правильный способ предоставления параметра stackoverflow.com/questions/6043389/…

Anirudha Gupta 19.11.2022 06:00

Изменение OrderDate.Text на OrderDate.Value решило мою проблему. Спасибо, что нашли время ответить на мой вопрос, и я обязательно узнаю больше об объектах поставщиков баз данных: D

xeyon 19.11.2022 06:01

@xeyon, почему ты удалил свой комментарий после подтверждения ответа?

lets do it 19.11.2022 06:40

Извините, я хотел прокомментировать ответ другого парня, но я также многому научился из вашего ответа, сэр, спасибо.

xeyon 19.11.2022 11:41
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
62
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать код ниже. Если вы хотите использовать try and catch, используйте его, чтобы получить ошибку, а вместо OrderDate.Text используйте OrderDate.Value, чтобы получить значение DateTime и преобразовать его в строку в нужном формате, как показано ниже.

private void bunifuFlatButton8_Click(object sender, EventArgs e)
{
    if (OrderID.Text == "" || CustomerID.Text == "" || CustName.Text == "" || AmountTB.Text = = "")
    {
        MessageBox.Show("Fill The data Correctly");
    }
    else
    {
        try
        {
            //Instead of OrderDate.Text use OrderDate.Value.ToString("yyyy-MM-dd HH:mm:ss.fff") then you will have correct format for SQL Insert
            using(SqlCommand cmd = new SqlCommand("insert into OrderTB values(" + OrderID.Text + "," + CustomerID.Text + ",'" + CustName.Text + "','" + OrderDate.Value.ToString("yyyy-MM-dd HH:mm:ss.fff") + "'," + AmountTB.Text + ")", Con))
            {
                Con.Open();
                cmd.ExecuteNonQuery();
                MessageBox.Show("Order Successfully Added");
                Con.Close();
                populate();
            }
        }
        catch(Exception ex)
        {
            MessageBox.Show("I got an error : " + ex.Message); // This will give you error message instead of stopping your program
        }
    } 
}

Нет, пожалуйста, не делай этого. 1. НИКОГДА не создавайте операторы SQL из конкатенации строк (остерегайтесь атак SQL-инъекций) и 2. не передавайте DateTime в базу данных как строку, а как DateTime.

Klaus Gütter 19.11.2022 07:00

Как @Ňɏssa Pøngjǣrdenlarp упомянул в комментарии, вы должны использовать значение в правильном формате, который должен быть DateTime.

У вас есть несколько проблем в вашем коде, позвольте мне выделить их ниже.

  1. вы должны использовать using с соединением, чтобы избавиться от них.
  2. Поместите свой код правильно в try-catch, а не так, как указано в код. Вы должны использовать параметризованные запросы, чтобы избежать SQL инъекция.
  3. Также обработайте случай null, если текст — null.
  4. вы также можете использовать возвращаемое значение ExecuteNonQuery.

Другие вопросы по теме