2011-10-25 130 views
1

我正在調用靜態函數來替換.accdb文件中的值;找到oldOA的值,然後用newOA替換它。SQL UPDATE語句不起作用

public static bool updateOA(string oldOA, string newOA) 
    { 
     ... 
     command.Parameters.AddWithValue("@oldOA", oldOA); 
     command.Parameters.AddWithValue("@newOA", newOA); 

     command.CommandText = "SELECT [OA_ID] FROM [Operating_Authority_Table] WHERE [OA_Name] = [@oldOA]"; 
     long value = long.Parse(command.ExecuteScalar().ToString()); 
     command.Parameters.AddWithValue("@OA_ID", value); 

     command.CommandText = "UPDATE [Operating_Authority_Table] SET [OA_Name] = [@newOA] WHERE [OA_ID] = " + value; 

     try 
     { 
      command.ExecuteNonQuery(); 
      message.show(1, "", "true"); 

      return true; 
     } 
     catch 
     { 
      message.show(1, "", "false"); 
      return false; 
     } 
    } 

起初我只是用:

command.CommandText = "UPDATE [OA_Table] SET [OA_Name] = [@newOA] WHERE [OA_Name] = [@oldOA]"; 

但有人告訴我,我應該得到的OA_ID,這是PK,並從那裏更新,有導致在上面的代碼,不過雖然功能仍然返回true,數據庫中還沒有更新的價值..

編輯

command.CommandText = "UPDATE [Operating_Authority_Table] SET [OA_Name] = @newOA WHERE [OA_Name] = @oldOA"; 

我已更新到此語句,雖然它仍然返回true,但值不會更新。我犯了什麼語法錯誤?

+1

如果妳提供值的放慢參數@OA_ID,你爲什麼在更新語句直接提供的價值? –

+0

,因爲我被告知我必須獲得我正在更改的記錄的PK,然後在更新聲明中使用PK以更改同一記錄。 – user776914

+1

我認爲這是無用的。你從名字中獲得PK,所以你不妨直接更新名字中的記錄。它會產生_exact_相同的結果。 – Otiel

回答

1
update Operating_Authority_Table set OA_Name = @newOA where OA_ID = (select OA_ID from Operating_Authority_Table where OA_Name = @oldOA) 

我的猜測是,這可以解決你的問題

+1

是的是的這是行之有效的!我想這是一個「子查詢」,所以我不能像我在問題中那樣將它分成兩部分? – user776914

+0

現在它已經工作,我的猜測是問題是你的參數OA_ID,你沒有正確提供它。我猜這可能也適用於你「UPDATE [Operating_Authority_Table] SET [OA_Name] = [@newOA] WHERE [OA_ID ] = @OA_ID「 –

0

當您從參數中刪除方括號時會發生什麼?

也許還包括你的value作爲參數?

UPDATE [Operating_Authority_Table] 
SET [OA_Name] = @newOA 
WHERE [OA_ID] = @myValue; 
command.Parameters.AddWithValue("@newOA", newOA); 
command.Parameters.AddWithValue("@myValue", value); 
+0

它仍然會返回相同的問題。但我通過其他部分的子查詢部分解決了它!日Thnx! – user776914