Member 11698375 Ответов: 3

Почему экономия неправильным дата в sqldatabase


я сохраняю дату в пользовательском fromat dd/MM/yyyy из datetimepicker propertis. но он сохраняет ММ/ДД/гггг в базе данных.когда я хочу увидеть отчет, он работает, когда я ввожу день как месяц и месяц как день.как я могу решить эту проблему?Пожалуйста помочь

Что я уже пробовал:

менял дату customformat много раз в datetimepicker propertis.но это не сработало

F-ES Sitecore

Даты представляют собой момент времени, они не имеют формата, пока вы не преобразуете их в строку, поэтому ваша база данных не сохраняет их в определенном формате, поскольку она не сохраняет их как строки. То, что происходит, - это то, что вы просите дату просто преобразовать себя в строку, не говоря о формате, который вы хотите, поэтому она должна использовать *некоторый* формат, поэтому она, вероятно, смотрит на системные настройки и использует там формат по умолчанию.

Поэтому, чтобы "исправить" это, вам нужно отследить все, что преобразует дату в строку и изменяет этот процесс таким образом, чтобы он использовал нужный вам формат.

3 Ответов

Рейтинг:
1

OriginalGriff

Просто: вы делаете это совершенно неправильно. Никогда не объединяйте строки для построения команды SQL. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

Это не та проблема, которую вы видели, и этот конкретный код не является уязвимым, но это симптом той же причины, и это означает, что вам срочно нужно исправить это через все ваше приложение. Когда вы это сделаете, проблема, которую вы заметили, также исчезнет, потому что вы больше не передаете SQL строковую дату, а фактическое исходное значение DateTime из DateTimePicker, что означает, что SQL Server не должен "угадывать", какой формат даты вы могли бы передать. Пройти элементе управления datetimepicker.Значение свойства непосредственно в качестве параметра и нет необходимости в преобразовании, и нет возможности неправильной интерпретации.


Member 11698375

он сохраняет неправильные значения данных, и месяц я не могу понять, почему? но когда я сохраняю дату как 2018/03/15, она сохраняется как 2018/15/03.

OriginalGriff

Нет, это не так. Посмотри на свой код и прочитай, что я сказал. Если вы все еще не понимаете, опубликуйте фрагмент кода, который вставляет его, и фрагмент кода, который извлекает его.

Рейтинг:
1

Member 11698375

теперь я получил ответ. речь идет о системном языке.мой системный язык-это не английский язык США.
это Великобритания english.so это стало причиной сохранения неправильного формата даты в sqlserver


Dave Kreskowiak

Ты все еще не понимаешь. ПРИ СОХРАНЕНИИ ДАТЫ В БАЗЕ ДАННЫХ ОТСУТСТВУЕТ ФОРМАТ ДАТЫ. Дата-время, отображаемое при просмотре отчета, - это дата-время из базы данных, преобразуемая в строку в соответствии с культурой ваших настроек Windows. Вы можете сделать то же самое на машинах в стране на планете и получить разные форматы дат!

Рейтинг:
1

Patrice T

Причина, по которой был создан тип datetime, заключается в том, что формат даты отличается от 1 части земли к другой. Обратите внимание, что ни ДД/ММ/гггг, ни ММ/ДД/гггг не позволяют сравнить 2 даты, чтобы узнать, какая из них 1 раньше, и арифметика дат очень быстро становится непригодной.

Я настоятельно рекомендую вам как можно больше конвертировать ваши даты в тип datetime. Это облегчит вашу жизнь.