2016-04-19 3 views
0

時間(DateTime.Now.Add(-60))のクエリをASP.NETのグリッドビューで返します。 WHERE句は、私に難しさの終わりを与えていない。SelectCommandでC#DateTimeをT-SQL時刻に変換します。

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

私の問題は正しく変換するためにpastTimeを取得しているため、新しいデータのみが返されます。 [TimeOfTransaction]は、time(7)のデータ型です。

C#のDateTimeをSQL ServerのTimeに解析するにはどうすればよいですか?ここで

+3

パラメータ化クエリではなく文字列連結を使用してください。それだけであなたの問題を修正することはありませんが、SQLインジェクション(文字列型を使用する場合)だけでなく、SQL Serverのクエリキャッシュプランを向上させる可能性がパフォーマンスの向上を防ぐために防止します。 Microsoftの記事[How to:パラメータ化されたクエリの実行方法](https://msdn.microsoft.com/en-us/library/bb738521(v=vs.100).aspx) – Igor

+1

を参照してください。代わりに、正しい型のパラメータを渡します。したがって、文字列に手を加える必要はありません。 'ds_DB.SelectCommand'とは何ですか?パラメータ化が可能ですか?そうでない場合は、どうしてですか? –

+0

さて、私はパラメータ化について検討します。 ds_DB.SelectCommandは、データベースのバインドされたデータソースに対するコマンドです。 – Waffles

答えて

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); 
    } 
} 
+2

[AddWithValue()を既に使用していますか?](http://blogs.msmvps.com/jcoehoorn/blog/2014/05/12/can-we-stop-using-addwithvalue-already/)をチェックしてください。 '.AddWithValue()'の使用を中止すると、予期せぬ驚くべき結果につながる可能性があります。また、データベースの**データ型**が 'TIME(7) 'の場合、' SqlDbType.Time '(SqlDbType.DateTime'ではなく) –

+0

パラメータ化を理解する上での問題は、asp.netのgridviewコントロールにバインドされているデータソースを使用していることです。開いているSQL接続をデータコントロールにバインドする方法を理解できません。 – Waffles

+0

@marc_sこれらの詳細をありがとう。それは役に立つ情報のビットです。それを反映するように更新されました。 –

関連する問題