Преобразование даты в текстовых полях в дату в SQL Server

Я работаю в ASP.NET в качестве внешнего интерфейса и SQL Server 2012 в качестве внутреннего интерфейса. В ASP.NET пользователь вводит дату в 3 текстовых поля в формате ДД / ММ / ГГГГ.

Теперь я объединил эти значения текстового поля в строку. В SQL Server я хочу сохранить эту дату в столбце DOB с типом данных DATE.

Ниже представлена ​​объединенная строка в ASP.net

string strDOB = txtYY.Text + "/" + txtMM.Text + "/" + txtDD.Text;

Как мне теперь сохранить этот strDOB в SQL Server?

Почему бы не использовать средство выбора даты в приложении вместо того, чтобы полагаться на то, что пользователь введет действительную строку даты. Если они введут строку '07/01/2018', как узнать, 07 января это или 1 июня? И нет, ответ не «потому что пользователь всегда будет вводить в формате дд / ММ / гггг». Пользователи - непостоянные и непредсказуемые существа, и никогда / редко можно доверять их постоянству.

Larnu 10.08.2018 10:00

Если предпочтение отдается ответу Дэмиена, вы можете отметить его как таковой. Часть вопросов и ответов A - это источник жизненной силы SO.

InteXX 10.08.2018 22:07
Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
95
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуй это:

UPDATE [Table] SET [Column] = '' + strDOB + ''

Однако будьте осторожны ... это не было продезинфицировано для защиты от внедрения SQL. Я только продемонстрировал прямой ответ на ваш вопрос, не более того.

Рекомендуется никогда не объединять непроверенные вводимые пользователем данные и сохранять результат в столбце. Методы предотвращения этого выходят за рамки данного раздела вопросов и ответов, но их легко обнаружить с минимальным объемом поиска.

--РЕДАКТИРОВАТЬ--

Я полагаюсь на ответ Дэмиена по этому поводу. Я согласен с его предложениями по синтаксису.

Если вы знаете, что это плохая практика и уязвимость для SQL-инъекций (на самом деле это недопустимо), то не следует добавлять это в качестве ответа, не так ли?

Schadensbegrenzer 10.08.2018 10:15

Но это «Пусть SQL Server выполнит преобразование по умолчанию из строки в дату, и надеяться его интерпретация совпадает с вашей». Не идеально.

Damien_The_Unbeliever 10.08.2018 10:15

@Schadensbegrenzer ~ Потому что это выходит за рамки вопросов и ответов.

InteXX 10.08.2018 10:23
если вы собираетесь передать в SQL Server строку, которая на самом деле должна быть date, вы должны как минимум использовать явныйCONVERT, указав параметр стиль, который, как вы знаете, соответствует передаваемой строке.
Damien_The_Unbeliever 10.08.2018 10:28

@Schadensbegrenzer ~ Я не знаю, проголосовали ли вы против, но если это так, я ценю сопроводительный комментарий. Как вы, возможно, заметили в другом месте, я веду кампанию против тех, кто отказывается голосовать. Я не против того, чтобы проголосовать против, так как я против БЕСШУМНОГО отрицательного голоса.

InteXX 10.08.2018 10:29

@Damien_The_Unbeliever ~ Понятно, спасибо. Я пока точно не знаю, как это сделать, поэтому перед редактированием мне придется провести небольшое исследование. Также: я не знаю, проголосовали ли вы против, но если да, то я ценю сопроводительный комментарий. Как вы, возможно, заметили в другом месте, я веду кампанию против тех, кто отказывается голосовать. Я не против того, чтобы проголосовать против, так как я против БЕСШУМНОГО отрицательного голоса.

InteXX 10.08.2018 10:30

@InteXX Да, я проголосовал против. И я никоим образом не хотел подвергать сомнению вашу квалификацию. Я также согласен с тем, что это может выходить за рамки вопросов и ответов, однако Stack Overflow также является ресурсом для примеров кода, и люди приходят сюда из Google и других мест. Так что я надеюсь, что отрицательный голос воспринимается как утверждение «пожалуйста, не делайте этого».

Schadensbegrenzer 10.08.2018 11:24
Ответ принят как подходящий

Прекратите использовать струны. Помимо рекомендаций в комментариях по использованию специального элемента управления для выбора, следующий лучший совет - разобрать эти строки на целые числа (кратко), затем построить объект DateTime из этого, а затем не позволяйте преобразовать его обратно в строку. Когда люди допускают дополнительное преобразование строки / даты, возникают проблемы с форматированием представлять. Итак, получите значение:

var year = Int32.Parse(txtYY.Text);
var month = Int32.Parse(txtMM.Text);
var day = Int32.Parse(txtDD.Text);

var dob = new DateTime(year,month,day);

А затем передайте его в SQL Server:

var cmd = new SqlCommand(...);
cmd.Parameters.Add("@DOB",SqlDbType.Date).Value = dob;

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

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