SQL Compact DateTime古怪

时间:2010-08-25 06:14:57

标签: sql sql-server-ce

我有一个关于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 个答案:

答案 0 :(得分:4)

"column = " + DateTime隐式调用ToString()上的DateTime

您应该使用System.Data.SqlClient.SqlCommand并使用command.Parameters.Add(...)添加日期(以及所有其他参数)。

这将修复日期,浮动等所有本地化问题。并保护您的应用程序免受SQL注入攻击。

答案 1 :(得分:0)

如果你想将DATETIME推送到数据库中一个字符串,你最好使用2010-08-25T07:26:05格式 - 但是,更好的方法是使用正确类型的参数创建一个命令对象然后将DATETIME参数设置为DateTime对象,而不是将其字符串化。

SQL Server不会转换abritrary日期字符串格式 - 它将使用由其运行的任何语言环境(默认为US)指定的格式。