我有一个关于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);
}
但我希望有人可以确认/改进我的解决方案。也许我错过了什么?
答案 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)指定的格式。