2016-11-29 2 views
1

Я пытаюсь получить дату между двумя датами, но я получаю ошибку запрос выбораОшибки при приеме даты между двумя датами

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

+0

Показать значения в текстовом поле, которое производит эту ошибку! Также используйте параметры команды – mybirthname

+5

Используйте параметризованный SQL - это может быть все, что вам нужно. Никогда не ставьте значения непосредственно в SQL, как это. –

+0

Я не уверен, но взгляните на этот вопрос. Надеюсь, это поможет - http://stackoverflow.com/questions/5125076/sql-query-to-select-dates-between-two-dates – RandomStranger

ответ

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 инъекций
  • Хрупкое (зависит от, скажем, DATETIME форматирование - разрыв вы попали в)
  • Slow: есть снижение производительности, так как СУБД должна разобрать запрос каждый раз, когда он выполняет его
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-инъекциям и считается проблемой безопасности в вашем коде.

0

Не видя ваших входов, я предлагаю вам использовать parameterized SQL в вашем C# или создать хранимую процедуру для принятия параметров DATETIME. Вы не должны использовать жестко запрограммированные SQL-запросы - короче: они подвержены атаке и не optmized в 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. 
    } 
Смежные вопросы