【问题标题】:Converting C# DateTime to T-SQL Time in SelectCommand在 SelectCommand 中将 C# DateTime 转换为 T-SQL 时间
【发布时间】:2016-04-19 19:40:10
【问题描述】:

我正在尝试返回一个查询(在 ASP.NET 的网格视图中)WHERE Time >= DateTime.Now.Add(-60)。 WHERE 子句给我带来了无穷无尽的困难。

DateTime pastTime = DateTime.Now.Add(-60);    
ds_DB.SelectCommand = "SELECT * FROM [vPurchaseTotals] WHERE [TimeOfTransaction] >=  " + pastTime;

我的问题是让过去时间正确转换,所以它只返回较新的数据。 [TimeOfTransaction] 是表中的 time(7) 数据类型。

如何将 C# 的 DateTime 解析为 SQL Server 的 Time

【问题讨论】:

  • 使用参数化查询而不是字符串连接。这不仅可以解决您的问题,而且可以防止 sql 注入(使用字符串类型时)以及改进 sql 服务器查询缓存计划,从而可能提高性能。见微软文章How to: Execute a Parameterized Query
  • 你没有。而是传递一个正确类型的参数,因此不需要摆弄字符串。 ds_DB.SelectCommand 是什么——它允许参数化吗?如果没有,为什么不呢?
  • 好的,我会研究参数化。 ds_DB.SelectCommand 是针对我的数据库的绑定数据源的命令。

标签: c# asp.net sql-server datetime time


【解决方案1】:

在这里,试试这个:

using(SqlConnection conn = new SqlConnection(yourConnectionString))
{
    DateTime pastTime = DateTime.Now.Add(-60); 

    ds_DB.SelectCommand = @"SELECT * FROM [vPurchaseTotals]
                            WHERE [TimeOfTransaction] >= @PastTime";

    SqlCommand cm = conn.CreateCommand();
    cm.CommandText = ds_DB.SelectCommand;

    cm.Parameters.Add("@PastTime", SqlDbType.Time).Value = pastTime.TimeOfDay; //For comparison with TSQL TIME type

    try
    {
        conn.Open();
        // Do what you need to do here.
    }
    catch(SqlException e)
    {
        // Handle Exception
    }
    finally
    {
        conn.Close();
    }
}

为了将来参考,您应该始终参数化您的查询。它最终变得更安全、更清洁/更容易阅读和调整。

编辑:您使用的是SqlDataAdapter 类吗?那是 ds_DB 的一个实例吗?我个人会为您的查询使用一个字符串值,然后像这样实现SqlDataAdapter

try
{
     conn.Open();

     using(SqlDataAdapter da = new SqlDataAdapter(cm))
     {
          da.Fill(DataTable dt);
     }
}

【讨论】:

  • 您应该查看Can we stop using AddWithValue() already? 并停止使用.AddWithValue() - 它可能会导致意外和令人惊讶的结果...另外 - 如果数据库中的 datatype 是 @ 987654327@,我建议使用SqlDbType.Time(不是SqlDbType.DateTime)作为您的参数
  • 所以我在理解参数化方面遇到的问题是我正在使用绑定到 asp.net 中的 gridview 控件的数据源。我无法弄清楚如何将打开的 SQL 连接绑定到数据控件。
  • @marc_s 感谢您提供这些详细信息;这是一个有用的信息;更新以反映这一点。
猜你喜欢
  • 1970-01-01
  • 2016-11-29
  • 2011-02-24
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
  • 2020-06-13
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多