2009-11-03 25 views
1

我正在編寫一個C#應用程序,它將更新SQL Server數據庫中的字段。我正在測試的當前算法只是從「狀態」字段中提取數據,將每個值存儲在ArrayList中,將其大寫,然後將其寫回數據庫。我有一個邏輯問題。SQL UPDATE循環非順序鍵

我將所有的值拉入ArrayList並將它們大寫。這工作正常。我現在有一個數組,例如有100個值(即,myArray[0]-myArray[99])。然後我使用FOR循環寫入值回數據庫:

for (int i = 0; i <= (myArray.Count - 1); i++) 
{ 
    SqlCommand myCommand = 
     new SqlCommand("UPDATE myList SET State = '" + recordArray[i].ToString() + 
        "' WHERE uniqueID = '" + (i + 1) + "'", dbConnection); 
    myCommand.ExecuteNonQuery(); 
} 

我在上面的例子中使用「UNIQUEID」根據主鍵來放置這些值。但是,問題在於主鍵只是接近順序的;序列中有一些缺失的數字。因此,即使我有我需要的值的數量,並且它們在數組中按照正確的順序被推回到數據庫,但是一旦我在序列中遇到延遲,其餘數據就會被放置在錯誤的領域。我知道這是我的邏輯失誤,但我對如何確保每個單獨的價值被正確放置感到迷茫。

在此先感謝您的幫助。

回答

8

所以,很多事情錯在這裏...

  1. 永遠永遠永遠不要使用動態SQL這樣的。如果你的一個「國家」有一個撇號呢?
  2. 除非這是.Net 1.0或1.1,否則不應該使用ArrayList。改爲使用System.Collections.Generic.List<string>
  3. 不要創建99個SqlCommand對象。創建 SqlCommand對象,並通過循環更新每次迭代的參數值。
  4. 使用using語句創建您的SqlCommand(更重要的是,SqlConnection)對象,以確保在引發異常時能夠及時發佈非託管資源。
  5. 最重要的是,當你意識到你可以在一個sql語句中更新多條記錄,並且該sql有一個很好的「UPPER」函數時,所有這些都變得沒有意義。

由於它看起來像你可以使用正確的方式來建立這種查詢的例子,我會假設#5是某種程度上不是一個選項,你真的需要拉這個數據下載到應用程序,然後通過記錄更新它的記錄(提示:你不)。這裏是你應該如何構建代碼:

using (SqlConnection cn1 = new SqlConnection("connection string here")) //inbound data 
using (SqlCommand cmd1 = new SqlCommand("SELECT uniqueid, State FROM myList", cn1)) 
using (SqlConnection cn2 = new SqlConnection("connection string here")) 
using (SqlCommand cmd2 = new SqlCommand("UPDATE myList SET State= @State WHERE uniqueID= @ID", cn2)) 
{ 
    SqlParameter StateParam = cmd2.Parameters.Add("@State", SqlDbType.VarChar, 50); 
    SqlParameter IDParam = cmd2.Parameters.Add("@ID", SqlDbType.Int); 

    cn1.Open(); 
    cn2.Open(); 

    using (SqlDataReader rdr = cmd1.ExecuteReader()) 
    { 
     while (rdr.Read()) 
     { 
      StateParam.Value = rdr["State"].ToString().ToUpper(); 
      IDParam.Value = rdr["uniqueID"]; 
      cmd2.ExecuteNonReader(); 
     } 
    } 
} 

請注意,這只是爲了演示using塊和參數化查詢。你應該不是使用此代碼。相反,請仔細看看我的觀點#5。這可以也應該全部在單個sql UPDATE語句中完成。

+0

+1 yup,你是對的 - 這段代碼非常糟糕 - 希望我可以多次提醒你的答案! –

+0

非常感謝您的幫助。我確實在尋找正確的方法來做到這一點,因爲我知道我正在採用「哈克」路線,而且這種方法非常完美。 –

+0

我有UPDATE命令現在工作。很明顯,問題是我不熟悉UPDATE語法。然而,您關於SQL處理的其他評論讓我更深入瞭解最佳實踐。再次感謝。 –

0

您需要獲取相同行的主鍵值並跟蹤數據,以便您可以在最後更新正確的行。

+0

謝謝!我認爲這是其中的一部分,Joel的解決方案包括在內。 –

5

除非您純粹將其作爲練習,否則您確實可以直接執行更新?

UPDATE myList SET State = Upper(State) 
+0

這是一個練習,但它的目的是學習如何通過C#正確的方式與SQL Server交互。感謝您指出了這一點! –