2012-11-27 21 views
3

在Silverlight應用程序中,我使用存儲過程來更新我的數據庫的表。在使用存儲過程修改數據庫之後更新上下文

ALTER PROCEDURE [dbo].[SP_ADD_MIS_MISSION] 
(
    @IdMission as int, 
    @IdVersion as smallint, 
    @LibMission as varchar (50) 
) 
AS 
BEGIN 
DECLARE @IDNEWVERSION as int = 1, 
     @IDNEWMISSION as int = @IdMission, 
     @supp as bit = 1 
BEGIN 
     IF @IdMission != 0 AND @IdMission is not NULL 
     BEGIN 
      SELECT @IDNEWVERSION = MAX(IDVERSION)+1 FROM MIS_Mission where [email protected] 

      Update MIS_Mission SET Suppression = @supp WHERE [email protected] AND MIS_Mission.IdVersion=(@IDNEWVERSION-1) 
     END 
     ELSE 
     BEGIN 
      SET @IDNEWVERSION = 1 
      select @IDNEWMISSION = MAX(MIS_Mission.IdMission)+1 from MIS_Mission 

      if @IDNEWMISSION is NULL SET @IDNEWMISSION=1 
     END 

     Insert MIS_Mission (IdMission, 
          IdVersion, 
          LibMission, 
          Suppression 
          ) 

        values (@IDNEWMISSION, 
          @IDNEWVERSION, 
          @LibMission, 
          @Suppression 
          ) 
     SELECT @IDNEWMISSION 
END 

我在WCF RIA服務中添加該代碼,啓動存儲過程:

public void SetMission(MIS_Mission mis) 
{ 
    _entity.ADD_MIS_MISSION(mis.IdMission,mis.IdVersion,mis.LibMission); 
} 

而且我在我的Silverlight應用程序添加該代碼蒙山值在我的DataGrid進入更新我的數據庫:

private void UpdateMission_Click(object sender, RoutedEventArgs e) 
{ 

    foreach(MIS_Mission mis in dG_Mission.ItemsSource) 
    { 
     var operation = _Context.SetMission(mis); 

     operation.Completed += (se, ev) => 
     { 
     }; 
    } 
} 

但是當我完成更新我的數據庫,我的背景沒有updat蒙山IdVersion的新價值,和我的DataGrid中顯示我的任務的舊版本。

如何更新我的上下文而無需重新加載我的數據網格?

+0

呢'_Context.SetMission(MIS);'觸發事件?如果是,你需要在調用之前分配'operation.Completed + =(se,ev)=>'。如果不是,則需要觸發附加後會觸發'operation.Completed'的事件 – Nogard

+0

謝謝您的回覆。我的'operation.Completed + ='似乎是這樣工作的。當我嘗試時,我沒有問題。 –

+0

您是否在更新數據庫時檢索數據?如果沒有,您的應用程序可能不知道您已更新任何內容。如果您不想重新查詢數據庫,則需要在每次更新數據庫後將基礎數據存儲在'List <>'或任何其他結構中並重新綁定'datagrid'。另一種方法是使用'DataBinding'和'INotifyPropertyChanged'實現 - 使用這種方法,你的用戶界面'datagrid'將自動從底層結構更新。 – Nogard

回答

0

我發現這個網站上的解決方案:http://weblogs.asp.net/fredriknormen/archive/2009/11/24/refresh-the-cached-entityset-after-a-submitchanges-wcf-ria-services.aspx

我的解決辦法是這樣的:對我來說,但數據網格的刷新

private void UpdateMission_Click(object sender, RoutedEventArgs e) 
{ 
    int countenr = itemsSource.Count; 

    foreach(MIS_Mission mis in dG_Mission.ItemsSource) 
    { 
     var operation = _Context.SetMission(mis); 

     operation.Completed += (se, ev) => 
     { 
      countenr--; 
      if (countenr == 0) 
      { 
       _Context.Load<MIS_Mission>(
        _Context.ListMissionQuery(), 
        LoadBehavior.RefreshCurrent, 
        loadOperation => 
        { 
         if (loadOperation.HasError) 
         { 
          MessageBox.Show(loadOperation.Error.Message); 
          loadOperation.MarkErrorAsHandled(); 
         } 
         else 
         { 
          List<MIS_Mission> itemsource = dG_Mission.ItemsSource as List<MIS_Mission>; 
          var results = itemsource.Where(entity => !loadOperation.Entities.Contains(entity)).ToList(); 

          results.ForEach(entity => itemsource.Remove(entity)); 

          results = loadOperation.Entities.Where(entity => !itemsource.Contains(entity)).ToList(); 

          results.ForEach(entity => itemsource.Add(entity)); 

         } 
        } 
        ,null 
       ); 
      } 
     }; 
    } 
} 

這個解決方案,做工精細是有點慢。

感謝您的幫助 再見

相關問題