SQL Compact DateTime Weirdness - PullRequest
       3

SQL Compact DateTime Weirdness

0 голосов
/ 25 августа 2010

У меня странная проблема, связанная с Microsoft SQL Compact Edition.В приложении Windows.Forms я пытаюсь изменить базу данных, созданную этим же приложением (.Net 2.0).База данных отправляется на Windows Mobile Phone позже, но это не важно.Важно то, что на обычных региональных настройках моего компьютера (английский (США)) вставка значений DateTime в базу данных происходит без проблем.Однако, когда я переключаю язык на голландский (Нидерланды), я получаю следующую ошибку:

"Произошла ошибка в части формата даты. [Выражение (если известно) =]"

Я отследил его до того, как DateTime выглядит в NL.Однако я не использую DateTime.ToString ().Я добавляю его в операторы вставки / обновления SQL просто как "column =" + DateTime.Это прекрасно работает в «en-US», но когда я переключаюсь на голландский, он взрывается.

Я исправил это, создав метод расширения для типа данных DateTime, например:

/// <summary>
/// Transforms a DateTime from various cultures into what SQL compact expects to get.
/// </summary>
/// <param name="original">DateTime to process.</param>
/// <returns>A SQL-friendly string.</returns>
public static string _ToSQLDateTimeString (this DateTime? original)
{ //No provided Date? Bye.
  if (original == null) return null;
  IFormatProvider usDate = new CultureInfo("en-US");
  return ((DateTime)original).ToString(usDate);
}

Но я бы хотел, чтобы кто-нибудь подтвердил / улучшил мое решение.Может я что то пропустил?

Ответы [ 2 ]

4 голосов
/ 25 августа 2010

Но "column = " + DateTime неявно вызывает ToString() на DateTime.

Вы должны использовать System.Data.SqlClient.SqlCommand и добавить даты (и все другие параметры) с command.Parameters.Add(...).

Это исправит все проблемы локализации с датами, числами с плавающей точкой и т. Д. И защитит ваше приложение от атак SQL-инъекций.

0 голосов
/ 25 августа 2010

Если вы хотите вставить строку DATETIME в базу данных, лучше всего использовать формат 2010-08-25T07: 26: 05 - однако лучше было бы создать объект команды с параметрами правильных типов.а затем установите параметр DATETIME для объекта DateTime, а не для его строкового форматирования.

SQL Server не будет преобразовывать произвольные форматы строки даты - он будет использовать формат, определяемый тем языком, в котором он работает (по умолчанию используется US).

...