2016-12-07 1 views
1

私の問題は非常に複雑で説明が難しいです。 私は、データテーブル(SQL)に "メンバー"という名前の列 "Lengh"を持っています。 だから、私は、現在の日付よりも低いLenghがあるかどうかをチェックするプログラムを起動するたびに、 "Status"列が失効するようにしたいと思います。テーブルに1行だけあれば正常に動作しますが、それ以上の行があれば1行しか変更されません。 「Lengh」が現在の日付時刻よりも低い行をすべて変更するにはどうすればよいですか?SQL Datatable DateTimeアップデート

InitializeComponent(); 
     SqlDataAdapter dt = new SqlDataAdapter("Select Lengh From Members",con); 
     DataTable adt = new DataTable(); 
     dt.Fill(adt); 
     DateTime now = DateTime.Now; 
     DateTime chip = (DateTime)adt.Rows[0][0]; 
     if (now>chip) 
     { 
      SqlDataAdapter dt2 = new SqlDataAdapter("Select [Reconizing ID] From Members Where [Lengh]='" + chip + "'", con); 
      DataTable adt2 = new DataTable(); 
      dt2.Fill(adt2); 
      string kd = "Update Members Set Status='" + "Expired" + "' Where [Reconizing ID]='" + adt2.Rows[0][0] + "'"; 
      SqlCommand cmd = new SqlCommand(kd,con); 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
      con.Close(); 
     } 

無限ループを行うと、プログラムが起動する前にクラッシュします。

+0

長下に行きますか?非常に奇妙な状態のようです。 – jarlh

+0

「Lengh」と書かれています...タイプミスや外国語の場合は確かではありません。 –

+0

ポスターには:ループを使用する必要があります。おそらく両方のテーブル 'adt'と' adt2'は複数の行を持っていますが、最初の行( 'adt.Rows [0]')とそれから最初の列( 'adt.Rows [0] [0]') )。 'adt2'と同じです。 –

答えて

0

これにはpure SQLソリューションを使用できます。 すべてのケースを一度に更新するSQL文は、次のようになります。

UPDATE MEMBERS SET STATUS = 'Expired' WHERE LENGH < ? 

は、このSQL文には、次のように入力として(電源)現在の時刻now = DateTime.Nowをバインドする必要があります。シングル実行では、テーブル内のすべての行が更新され、長さは現在の時間よりも短くなります。

場合は、アプリケーションから現在の日付時刻を供給したくない場合は、クエリが

UPDATE MEMBERS SET STATUS = 'Expired' WHERE LENGH < sysdate 

のうち、より単純なことができ、もちろんこれはLENGHは、データベース内の日付型の列であることを前提としています。

注1:多数の行(数百万)が必要な場合は、クエリのパフォーマンスを向上させるために、Lengh列にインデックスを作成することを検討してください。

注2:アプリケーションとデータベースの中には、複数のタイムゾーンで動作するものや、アプリケーションサーバーとデータベースサーバーに時間差があるものがあります。私の意見では、アプリケーションコードから日時を渡すことは良いコーディング方法です。

+0

ありがとう、私はそれをすることが許されていることを知らなかった..私はそれが私にエラーを与えるだろうと思った。 – Striller

1

なぜ1つのクエリでそれをしないのですか?ような何か:

string query="UPDATE Members SET Status='Expired' WHERE @now>Lengh"; 
SqlCommand cmd= new SqlCommand(query,con); 
cmd.Parameters.AddWithValue("@now",DateTime.Now); 
con.Open(); 
cmd.ExecuteNonQuery(); 
con.Close(); 
+0

私は試してみましたが、これは私にConvertionのエラーなどを与えます。そして、@nowの意味は何ですか? – Striller

+0

Btw、それは動作します、thx alot .. @nowは今、DateTimeを使用することを意味しますか? – Striller

+0

それが投げる正確なエラーを教えてください。 '@ now 'が何を意味するのかを知るためには、[this](http://www.dreamincode.net/forums/topic/268104-the-right-way-to-query-a-database-parameterizing-your-sql)を参照してください。 '@ now'はパラメータで、' cmd.Parameters.AddWithValue( "@ now"、DateTime.Now);で必要な値に置き換えられます。 – Pikoh

0

のDateTimeタイプであることをご列を考慮すると、1つの列を更新するために、次のクエリを使用することができ、現在の日付より

UPDATE Members SET Status ='Expired' WHERE Length < GETDATE()