【问题标题】:Insert and select date from SQL Server database从 SQL Server 数据库中插入和选择日期
【发布时间】:2011-07-16 16:00:26
【问题描述】:

尝试从 SQL Server 中选择数据或使用 C# windows 应用程序插入数据时出现以下异常。我在 select 查询的 where 子句中用单引号传递日期,例如 '16/03/2011' 异常消息如下所示:

将 char 数据类型转换为 日期时间数据类型导致 超出范围的日期时间值。

是否有任何完美的解决方案可以从与操作系统无关的 sqlserver 数据库中插入和选择日期。即适用于意大利语和英语操作系统。

【问题讨论】:

  • 我会始终使用 ISO-8601 格式 (YYYYMMDD) - 无论您的语言和区域设置如何,它都能正常工作!所以尝试20110316 而不是16/03/2011

标签: c# asp.net windows database sql-server-2000


【解决方案1】:

如果您不能使用存储过程或参数化查询,您可能希望将日期格式化为 yyyy-mm-dd 格式。前任。 '2011-03-16'

T-SQL 示例

INSERT INTO MyTable (SomeDate) VALUES ('2011-03-16') 

SELECT * FROM MyTable WHERE SomeDate <= '2011-03-16'

另外,请记住日期的时间部分。如果时间不重要,请确保不要存储它,因为它可能会影响您的 SELECT 查询。

【讨论】:

  • 感谢您的提示,作为开发人员,我应该拥有 RTFM。
  • 贾斯汀是正确的,如果你不能使用参数化查询,这就是这样做的方法。但是,SqlDataAdapter 从 .NET 1.1 开始就已经存在,所以你不应该有理由不使用它!
【解决方案2】:

使用存储过程或参数化查询。这些将让您传入一个 C# 日期时间对象,并且会自动为您处理转换。

我建议从 SQLDataAdapter 类开始。一个简单的例子是:

using (SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM MyTable WHERE myDate = @myDate", someSqlConnection)
{
    da.SelectCommand.Paramaters.Add("@myDate", new DateTime());
    DataTable dt = new DataTable();
    da.Fill(dt);
}

但是,请注意,实现目标的方法有很多种。根据您的问题,我想您正在创建 SQL 字符串并针对您的数据库执行它们。出于多种原因(包括您所描述的原因),这被认为是一种不良做法。阅读有关 ORM 的信息,例如 Entity Framework 或 NHibernate。

【讨论】:

  • 我同意你的做法。至少,应该使用参数化查询。至少这有助于防止 SQL 注入。
猜你喜欢
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多