даты ведут себя по-разному на разных БД? - PullRequest
4 голосов
/ 21 февраля 2011

У меня есть веб-страница asp.net с указателем даты jQuery.

Я нахожусь в Великобритании, поэтому, когда я ввожу 28/02/2010, я ожидаю, что она разрешится до 28th Feb 2010.

Это работает, как и ожидалось, в моей локальной dev-среде - но не в нашей QA или в prod-подобных средах - или в одной из других машин dev.В этих случаях он, похоже, пытается разрешить его в американском формате даты - и не проходит проверку, так как он выходит за пределы диапазона.

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

Я использую SQL Server 2005, моя сортировка Latin1_General_CI_AS, мои коллеги используют сортировку SQL_Latin1_General_CP1_CI_AS, а китайская.

Учитывая, что мы неУ вас есть контроль над установкой Prod SQL Server (только наша база данных), каков наилучший способ сделать эту работу стандартным способом?Изменить настройки БД или код, который его использует?

Заранее спасибо!- L

[РЕДАКТИРОВАТЬ, чтобы добавить информацию о коде]

Это мой код просмотра для вызова средства выбора даты:

 <%=Html.TextBox("DateOfBirth", Model.DateOfBirth.ToShortDateString(), new { @class = "datepicker" })%>

Вот js для средства выбора даты:

DatePickerSettings = {
    setup: function () {
        $(".datepicker").datepicker({
            dateFormat: 'dd/mm/yy',
            changeMonth: true,
            changeYear: true
        });
    }
};

И вот как я указываю дату в модели:

[Required]
[DisplayName("Date of Birth")]
public virtual DateTime DateOfBirth { get; set; }

Дата отображается правильно в контроллере и хранилище ... пока не достигнет БД.

Спасибо:)

Ответы [ 7 ]

2 голосов
/ 21 февраля 2011

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

Не отправлять даты в виде необработанного текста в запросах SQL.

Используйте параметризованный запрос, поэтому вам не нужно беспокоиться о форматировании значения ввсе.Тогда вам просто нужно убедиться, что вы можете получить правильный формат даты между браузером и ASP.NET.

Помимо всего прочего, если вы включаете пользовательские данные непосредственно в запросы SQL, вы 'Как правило, вы будете открыты для атак с использованием SQL-инъекций. Всегда использовать параметризованные запросы (если ваше веб-приложение не является действительно инструментом тестирования "run this SQL" ...)

Если вы уже используете параметризованные запросы,тогда проблема, вероятно, будет между браузером и ASP.NET, а часть базы данных не имеет значения.Разделите и победите проблему: преследуйте данные, проходя через разные уровни (браузер, jQuery, ASP.NET и т. Д.), Пока не обнаружите, где они ошиблись.Даже не думай об исправлении, пока не узнаешь, где оно пошло не так.

1 голос
/ 21 февраля 2011

Знает ли ваша страница культура? Вы можете определить информацию о Cutlure пользовательского интерфейса для различных браузеров (локалей) и иметь постоянную ASP.NET Culture.

Значение культуры определяет результаты функций, зависящих от культуры, таких как дата, число, форматирование валюты и т. Д. Значение UICulture определяет, какие ресурсы загружены для страницы

Проверьте эту ссылку MSDN: Как установить культуру и культуру пользовательского интерфейса для глобализации веб-страниц ASP.NET

http://msdn.microsoft.com/en-us/library/bz9tc508(v=VS.85).aspx

0 голосов
/ 21 февраля 2011

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

0 голосов
/ 21 февраля 2011

Измените свой код, чтобы использовать формат ггггммдд.Насколько я знаю, это работает во всех БД

0 голосов
/ 21 февраля 2011

Вам также необходимо проверить свой слой ASP.Net и посмотреть, на чем он работает.

Проверьте конфигурацию машины и убедитесь, что она настроена для работы в одну дату / время / регион.*

0 голосов
/ 21 февраля 2011

Мне нужно было бы увидеть код, который точно знает даты, чтобы узнать наверняка, но вероятным подозрением являются настройки региона и языка на компьютерах, где выполняется код.Убедитесь, что он настроен для вашего региона.

enter image description here

Однако, если вы не можете изменить настройки на серверах, вам, вероятно, следует явно использовать CAST или CONVERT в SQL Server, чтобывынудите его проанализировать в конкретном регионе так, как вы ожидаете, что данные будут введены.

0 голосов
/ 21 февраля 2011

Используйте CONVERT, чтобы изменить формат даты на стандарт, приемлемый для всех сред.

CAST и CONVERT

...