2016-12-07 42 views
1

所以,我的問題非常複雜,很難解釋。 我有一個數據表(SQL)名爲「成員」列「Lengh」。 所以我想,每次我開始程序來檢查是否有Lengh低於當前日期時間和機會列「狀態」過期。它工作正常,如果我只有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

您可以使用純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

你爲什麼不在一個查詢中做?喜歡的東西:

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

我試過了,它給了我轉換錯誤或類似的東西..而@now意味着什麼? – Striller

+0

順便說一句,它的工作原理,thx很多.. @現在意味着它會使用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

考慮您的長度列是日期時間類型的,你可以用下面的查詢來更新一個列去

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