2014-02-27 68 views
0

我是這個sql複製的新手。我們有4個用戶。我有一列中有一列有唯一鍵。數據類型是nvarchar。如果subscriberA插入一行'zxc'並且訂戶B插入一行'zxc'。其中一個插入失敗。我如何在應用程序中處理這個向用戶顯示用戶正確的消息。在c中處理sql複製問題#

比如我有兩個用戶:

1.SubA 
2.SubB 

我有一個表。

Table name : Names 

我在我的名字表中有City列(nvarchar),它是唯一鍵。

用戶'A'連接到SubA。 用戶'B'連接到SubB。

'A'將'JAKARTA'一行插入名字表@ 10:30 am。這將需要20分鐘來更新發布者。 'B'將'JAKARTA'一行插入名字表@ 10:35。

我對錶格有唯一約束,所以用戶A的輸入在發佈者@ 10:50中更新。 但用戶B的輸入陷入了衝突。

我希望城市列應該在所有潛艇中都是唯一的。 我該如何處理?我應該如何顯示用戶B的正確信息?我應該如何對所有用戶進行驗證?

我的應用程序是winforms。我正在使用城市的文本框。 我正在驗證按鈕點擊事件。理想的解決方案是,如果我能夠在點擊事件 中捕獲此信息並顯示消息,如「一個記錄已經存在與此name.try再次。」

private int Validation(string str) 
    { 
     SqlConnection conn = new SqlConnection("ConnectionString"); 
     conn.Open(); 
     SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM dbo.Names where city = @str", conn); 

     cmd.Parameters.Add("@City", SqlDbType.VarChar, 100); 
     cmd.Parameters["@City"].Value = str; 

     int count = (Int32) cmd .ExecuteScalar(); 
     conn.Close(); 
     return count; 
    } 

    private void button1_Click(object sender, System.EventArgs e) 
    { 
     try 
     { 
      if(Validation(testbox1.text) == 0) 
      { 
       SqlConnection conn = new SqlConnection("ConnectionString"); 
       string sql = "INSERT INTO dbo.Names (city) VALUES(@City)"; 
       SqlCommand cmd = new SqlCommand(sql, conn);      
       cmd.Parameters.Add("@City", SqlDbType.VarChar, 100); 
       cmd.Parameters["@Name"].Value = textbox1.text; 
       cmd.ExecuteNonQuery(); 
      } 
      else 
      { 
       //display message 
      } 
    } 
    catch(Exception ex) 
    { 

    } 
} 

讓我知道如果你需要更多的信息

+0

如果由於重複密鑰而失敗只是向用戶顯示密鑰 – Steve

+0

您也可以在[dba.se]找到更多幫助。 –

+0

@Steve我的應用程序只連接到訂閱者。 所以如果在訂戶級失敗,那麼我正在處理消息。 但它在發佈者更新失敗。我該如何處理? – user3361813

回答

2

這是一個應用/數據庫設計問題。在這種情況下,第一個將Names表的本地副本與發佈服務器進行同步的第一個用戶將獲勝,第二個用戶將獲得一個錯誤。最好的解決方案是完全避免衝突,並添加另一列作爲唯一鍵(訂戶ID?)的一部分,這將使記錄具有唯一性,或者完全刪除唯一約束,並在需要時讓服務器進程清除重複的城市名稱。