在两个日期之间取日期时出错

时间:2016-11-29 11:21:29

标签: c# sql visual-studio

我想在两个日期之间获取日期,但我收到错误 选择查询是

DateTime startdate = Convert.ToDateTime(metroLabel8.Text);
DateTime enddate = Convert.ToDateTime(metroLabel9.Text);
SqlCommand cmd = new SqlCommand("Select [LedId],[LedName] from [Ledger] where Date>='"+startdate+"' and Date<='"+enddate+"'", con);

错误是 enter image description here

3 个答案:

答案 0 :(得分:2)

请不要硬编码,而是使用参数化查询

   DateTime startdate = Convert.ToDateTime(metroLabel8.Text);
   DateTime enddate = Convert.ToDateTime(metroLabel9.Text);
   ...
   // Make sql readable
   string sql = 
     @"Select [LedId],
              [LedName] 
         from [Ledger] 
        where Date >= @prmStartDate and Date <= @prmEndDate";

   // wrap IDisposable (SqlCommand) into using
   using (SqlCommand cmd = new SqlCommand(sql, con)) {
     cmd.Parameters.Add("@prmStartDate", SqlDbType.DateTime).Value = startDate; 
     cmd.Parameters.Add("@prmEndDate", SqlDbType.DateTime).Value = endDate;

     ... 
   }

硬编码查询

  • 容易进行Sql注入
  • 很脆弱(取决于日期时间格式 - 你陷入的差距)
  • 慢:由于RDBMS每次执行时都必须解析查询,因此性能会下降

答案 1 :(得分:0)

处理转换的最佳方法是让提供商为您处理:

DateTime startdate = Convert.ToDateTime(metroLabel8.Text);
DateTime enddate = Convert.ToDateTime(metroLabel9.Text);
SqlCommand cmd = new SqlCommand("Select [LedId],[LedName] from [Ledger] where Date >= @startDate and Date <= @endDate", con);


SqlParameter startParameter = cmd.Parameters.Add("@startDate ",
                System.Data.SqlDbType.DateTime);
SqlParameter endParameter = cmd.Parameters.Add("@endDate",
                System.Data.SqlDbType.DateTime);

startParameter.Value = startdate;
endParameter.Value = enddate;

cmd.Parameters.Add(startParameter);
cmd.Parameters.Add(endParameter);

在构建SQL查询时不要连接字符串,这很容易引入SQL,并且在代码中被视为安全问题。

答案 2 :(得分:0)

如果没有看到您的输入,我建议您在C#中使用parameterized SQL或创建存储过程以接受DATETIME参数。您不应该使用硬编码的SQL查询 - 简而言之:它们容易受到攻击而不会在SQL中进行优化。

执行此操作的一种非常简单的方法是使用Dapper.NET object mapper

在SQL中,你可以这样做:

    CREATE PROCEDURE return_led_for_dates
        @startdate      DATETIME,
        @enddate        DATETIME
    AS
    BEGIN
      SELECT
          [LedId],
          [LedName]
      FROM 
          [Ledger] 
      WHERE
          Date BETWEEN @Startdate AND @Enddate
   END

使用Dapper,你的C#可能是:

  DateTime startdate = Convert.ToDateTime(metroLabel8.Text);
  DateTime enddate = Convert.ToDateTime(metroLabel9.Text);
  var LED = this.Connection.Query<LED>(
            "return_led_for_dates",
            new { 
               StartDate = startdate,
               EndDate = enddate 
             },
            commandType: CommandType.StoredProcedure);

你也需要一个LED课程:

    public class LED
    {
         int LedId {get; set;},
         string LedName {get; set;}
    }

最后,假设您的文字字段转换没有问题,您应该使用DateTime.TryParse。然后,您可以对代码进行防弹,并确保对字段进行相应的解析。像:

    DateTime startDate;
    DateTime endDate;

    if (DateTime.TryParse(Convert.ToDateTime(metroLabel8.Text), out startDate) && DateTime.TryParse(Convert.ToDateTime(metroLabel9.Text), out endDate))
    {
       // Your data code.
    }