2017-06-30 47 views
-2

我在WinForms中創建了一個c#應用程序,其中多個用戶將按照物理形式從sql中選擇記錄並進行編輯。
我想鎖定一個用戶正在使用的記錄。我已經嘗試了多個選項,但仍然有相同的記錄在兩個或三個用戶機器中可見。C#SQL排序規則在SQL中爲多用戶選擇

我的C#代碼檢索,更新,選擇和顯示記錄。

using (SqlConnection conn = new SqlConnection(connectString)) 
{ 
    using (SqlCommand cmd=new SqlCommand("get_First_Unscan_Record_withUpdate",conn)) 
    { 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.AddWithValue("@usrName", username_Form); 
     conn.Open(); 
     record_number = cmd.ExecuteScalar().ToString(); 
    } 
} 


SqlParameter[] SQlparams = 
{ 
    new SqlParameter("@srno",SqlDbType.NVarChar,50) {Value=record_number.ToString()} 
}; 

SqlDataReader dr = DM.GetDataReader("get_Record_with_Srno", SQlparams); 

我的SQL存儲過程

Declare @srno int 

update KYC_Index 
set [transform_int] = 'Y', 
     [transform_int_by] = 'Danish',  
     [transform_int_time] = GETDATE(), 
     @srno = srno 
where srno = (select C.srno 
       from (select top 1 srno, 
            index_Filename 
         FROM [KYC].[dbo].[KYC_Index] B 
         where B.[transform_int] = 'N' 
         and B.transform_status = 'N' 
         order by B.index_Filename, B.srno 
        ) C 
      ) 

select @srno 

我應該怎麼辦?

+0

你只是想鎖定它,而其在某人的屏幕上,或者只是當你更新時。 – BugFinder

+0

@BugFinder我想鎖定它,而其在某人的屏幕上 –

+0

然後你的應用程序的行爲,因爲它應該 - 鎖是爲了防止更新同時,如果你需要阻止人們在相同的記錄上查看編輯屏幕 - 那麼你需要做到這一點 – BugFinder

回答

0

我不會試圖鎖定正在查看的記錄。

這樣做的一個顯而易見的方法是添加另一列,比如像IsViewing那樣的一列,當用戶打開一條記錄時,將其設置爲1,將其標記爲鎖定。

當他們更新或離開記錄時,將其設置爲0,將其標記爲已解鎖。

但考慮2級的用戶,A & B.

A打開記錄。 B同時打開相同的記錄。

用戶A的應用程序檢查記錄&發現它已解鎖。 用戶B的應用程序也檢查&發現它已解鎖。

用戶A的應用程序將IsViewing標誌設置爲1.用戶B的應用程序也一樣。現在你回到了你開始的地方。

還要考慮記錄被鎖定的情況,並且應用程序異常終止,例如通過任務管理器或網絡丟失,而不解鎖記錄。

現在你必須考慮如何處理這些記錄。

一個簡單的解決方案是添加一個時間戳列。

當你讀一條記錄時,你有它的時間戳。 當用戶嘗試更新時,將您應用程序中的時間戳與當前時間戳進行比較。如果它們不同,則知道記錄已經更改&可以提示用戶如何合併更改。 您還可以定期檢查記錄打開時的時間戳&如果已經進行了編輯,則通知用戶。

+0

我做了類似的事情。檢查我的SQL過程。我正在更新我的字段[transform_int] ='Y',它是一個char字段,並且還有一個where子句[transform_int] ='N'。儘管如此,隨着應用程序被超過20個用戶訪問,我正在收集整理的案例。 –