Использование .net Datetime в sql запросе - PullRequest
4 голосов
/ 31 марта 2010

У меня есть объект DateTime, который я хочу сравнить с полем sql datetime в предложении where. Я сейчас использую:

"where (convert( dateTime, '" & datetimeVariable.ToString & "',103) <= DatetimeField)"

Но я считаю, что datetimeVariable.ToString вернет другое значение в зависимости от культуры, в которой работает система.

Как бы вы справились с этим, чтобы он не зависел от культуры?

РЕДАКТИРОВАТЬ: я не буду использовать paramatised sql в этом коде ...

РЕДАКТИРОВАТЬ: после комментария Пармезана к одному из ответов выглядит, что лучший метод может быть:

"where (convert( dateTime, '" & datetimeVariable.ToString( "s" ) & "',126) <= DatetimeField)"

Ответы [ 3 ]

7 голосов
/ 31 марта 2010

Не используйте конкатенацию строк, используйте параметризованный запрос. Передайте значение параметра типа DateTime. Это позволяет полностью избежать проблемы форматирования, повышает производительность для последующих запросов и позволяет обойти внутренние уязвимости (внедрение SQL), которые вы открываете для себя при формировании SQL таким образом.

"where @dateTime <= DateTimeField"

Затем установите параметр @dateTime. Если вам нужно больше, расскажите нам немного больше о своем коде - прямо ADO.NET, Enterprise Library, что-нибудь еще?

5 голосов
/ 31 марта 2010

Параметры. Всегда параметры:

where @someVar <= DatetimeField

и добавьте параметр с именем «@someVar» с этим значением.

Решает (среди прочих проблем) проблемы с i18n / кодированием, объединением / внедрением и повторным использованием плана запросов.

1 голос
/ 31 марта 2010

Если вы хотите, чтобы ToString () всегда выходил независимо от культуры, укажите конкретную культуру:

    Dim D = DateTime.Now.ToString(System.Globalization.CultureInfo.InvariantCulture)
    '-or-
    Dim D = DateTime.Now.ToString(New System.Globalization.CultureInfo("en-us"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...