2016-11-29 3 views
1

間の日付をしながら、私は2つの日付の間の日付を取得しようとしていますが、私はエラー 選択クエリがエラー二つの日付

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インジェクションになりやすい
  • 脆性(日時の書式、たとえば、依存 - あなたはに落ちたギャップ)スロー
  • :RDBMSは、クエリにそれはそれ
  • 実行されるたびに解析するために持っているので、パフォーマンスの低下があります
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クエリを使用するべきではありません。それらは攻撃されやすく、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を使用する必要があります。コードを書き留めて、フィールドが確実に解析されるようにすることができます。 Like:

DateTime startDate; 
    DateTime endDate; 

    if (DateTime.TryParse(Convert.ToDateTime(metroLabel8.Text), out startDate) && DateTime.TryParse(Convert.ToDateTime(metroLabel9.Text), out endDate)) 
    { 
     // Your data code. 
    } 
関連する問題