2014-05-01 93 views
1

我已經用不同的解釋發佈了類似的問題。當另一條記錄爲空時,表中的記錄不會更新

我在尋找解決以下問題:

我有一個從我的代碼調用的存儲過程。

我需要更新我的表中的記錄,並將其設置爲1或0.它是一個bit數據類型。

我的存儲過程接受3個參數:區域,isActive和編號:

這是我的存儲過程:

ALTER PROCEDURE [dbo].[SPU_UpdateEmai] 

@region char(2), 
@isoNum varchar(10), 
@isActive bit 

AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE MyTable 
    SET isActive = @isActive, updatedate = GETDATE()  
    WHERE region = @region AND isonumber = @isoNum 

END 

當@isoNumber不是空的,那麼我可以更新我的isActive域,如果@isoNumber是空的,沒有任何反應。

當簡單地執行更新:

UPDATE ActivateEmailSendToIso 
    SET isActive = 0, updatedate = GETDATE()  
    WHERE region = '04' AND isonumber is null 

一切都很好。但是在運行代碼時,更新不會發生。這是代碼:

using (SqlCommand cmd = new SqlCommand("SP_UpdateEmail", conn)) 
    { 
     conn.Open(); 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@region", actData.Region); 
     //cmd.Parameters.AddWithValue("@isoNum", actData.IsoNumber); 
     cmd.Parameters.AddWithValue("@isoNum", (actData.Equals(String.Empty)) ? (object)DBNull.Value : actData.IsoNumber); 
     cmd.Parameters.AddWithValue("@isActive", actData.IsActive); 
     cmd.ExecuteNonQuery(); 
     isRecordSaved = true; 
    } 

一切似乎都很好。

什麼可能是錯的?

謝謝

+0

就個人而言,更新'updateDate'型柱應該用做觸發器 - 它可以防止你忘記在某個地方做到這一點。發生這種情況是因爲SQL不認爲「null」等於**任何**,包括另一個「null」。比較結果(除了IS NULL)是_also_ null,因爲db無法告訴答案應該是什麼。 [看到這個問題的更多信息](http://stackoverflow.com/questions/9581745/sql-is-null-and-null)。從本質上講,這是一個重複的問題,雖然是一個非常好的問題。 –

+0

對不起,另一個問題,但我應該如何更新我的存儲過程?你能否請你用正確的答案更新我的問題? –

回答

0

如果你還想要更新記錄時@isoNum爲空,那麼你的程序改成這樣:

ALTER PROCEDURE [dbo].[SPU_UpdateEmai] 

@region char(2), 
@isoNum varchar(10), 
@isActive bit 

AS 
BEGIN 
    SET NOCOUNT ON; 

    UPDATE MyTable 
    SET isActive = @isActive, updatedate = GETDATE()  
    WHERE region = @region 
    AND (isonumber = @isoNum or @isoNum IS NULL AND isonumber IS NULL) 

END 
相關問題