2011-12-02 48 views
1

處理我在SQLSERVER客戶表包含一個rowversion場,我遞增它每次我更新記錄, 我只是檢查與更新錯誤使用C#

if([email protected]) where [email protected] 

執行更新。

else RAISERROR('Update cannot be executed. There is a row version conflict.', 16, 1) 

所以現在必須從我的C#代碼傳出一個出參數並返回錯誤值。還有 - 爲剛剛執行的語句獲取錯誤代碼。

SELECT @[email protected]@ERROR 

那麼,我應該如何返回從SQLSERVER更新查詢值到我的C#代碼,以便我可以顯示消息。由於您使用的

SqlParameter P = new SqlParameter("Name of your column", SqlDbType.Int); 
P.Direction = ParameterDirection.Output; 

//call your sproc 
int result = (int)P.Value; 

編輯

回答

0

如果你還沒有,你應該有一個存儲過程中的數據庫代碼。存儲過程如下所示:

CREATE PROCEDURE s_my_procedure 
    @RowVersion int , 
    @CustomerID int , 
    ... additional fields here 
    @ErrorCode  INT OUTPUT 
AS 
    IF EXISTS(SELECT 1 
       FROM Customer 
      WHERE RowVersion = @RowVersion 
       AND CustomerID = @CustomerID) 
    BEGIN 
     UPDATE Customer 
     SET ... 
     WHERE RowVersion = @RowVersion 
     AND CustomerID = @CustomerID 

     SET @ErrorCode = 0 
    END 
    ELSE 
    BEGIN 
     SET @ErrorCode = 1234 -- Something meaningful to your app 
    END 

您應該儘可能避免引發錯誤。

然後,假設你有一個命令執行存儲過程:

cmd.ExecuteNonQuery(); 

int ErrorCode = 0; 

// Note that if you are not sure about your sp, you should test this for dbnull.value first 
ErrorCode = Convert.ToInt32(cmd.Parameters["@ErrorCode"].Value); 
+0

謝謝這麼多! – user1078389

+0

Thankyou我已經解決了它,工作正常。 – user1078389

+0

這是個好消息!請記住,如果答案得到解決或幫助您解決問題,您應該點擊答案旁邊的複選標記和向上箭頭,讓未來的問題訪問者知道它對您有幫助。 –

3

如果你調用通過ado.NET您的存儲過程,那麼你傳遞給存儲過程中的SqlParameter將設立這樣的Linq-to-SQL,將此sproc添加到方法部分中應該爲此sproc創建ac#方法簽名,其中out參數爲您添加

+0

@Inuyasha - 感謝你的回覆 –

+0

感謝, – user1078389

+0

我通過DBML db.usp_UpdateCustomer(客戶ID,名字叫我的存儲過程, MiddleName,LastName,Title,Active,SeeNote,UserId,RowVersion);所以在這種情況下,我應該如何返回。 – user1078389