首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

WCF N 層架構中 DataGridView 數據提交保存完整方案

     編輯:程式設計綜合問答

架構背景

MSDN「演練:創建 N 層數據應用程序」示例中,客戶端使用 DataGridView 展示數據,但未演示修改後如何保存回數據庫。

核心流程

  1. 客戶端:DataGridView 綁定 BindingSource,數據源為實體集合(如 List<Entity> 或 DataTable)
  2. 用戶編輯後,調用 bindingSource.EndEdit() 提交 UI 修改
  3. 獲取變更集合:DataTable.GetChanges() 或實體狀態跟蹤
  4. 通過 WCF 服務發送變更到服務端
  5. 服務端:使用 ADO.NET SqlDataAdapter.Update() 或 EF SaveChanges() 持久化

方案一:ADO.NET DataSet/DataTable 模式

// 客戶端
public void SaveChanges() {
    bindingSource.EndEdit(); // 關鍵:提交 UI 編輯
    DataTable changes = dataTable.GetChanges(); // 獲取增刪改行
    if (changes != null) {
        wcfClient.UpdateData(changes); // 調用服務
        dataTable.AcceptChanges(); // 本地確認
    }
}

// 服務端
public void UpdateData(DataTable changes) {
    using (SqlConnection conn = new SqlConnection(connStr)) {
        SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Table", conn);
        SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
        adapter.Update(changes); // 自動生成 INSERT/UPDATE/DELETE
    }
}

參考:ADO.NET 批量更新教程

方案二:Entity Framework 實體跟蹤模式

// 客戶端(自跟蹤實體或 DTO)
public void SaveChanges() {
    var changedEntities = context.Entities.Local
        .Where(e => context.Entry(e).State != EntityState.Unchanged)
        .ToList();
    wcfClient.SaveEntities(changedEntities);
}

// 服務端
public void SaveEntities(List<EntityDto> dtos) {
    using (var ctx = new MyDbContext()) {
        foreach (var dto in dtos) {
            var entity = ctx.Entities.Find(dto.Id);
            if (entity == null) {
                if (dto.IsNew) ctx.Entities.Add(MapToEntity(dto));
            } else {
                if (dto.IsDeleted) ctx.Entities.Remove(entity);
                else MapToEntity(dto, entity); // 更新屬性
            }
        }
        ctx.SaveChanges();
    }
}

參考:EF N 層應用模式

關鍵最佳實踐

  • 使用 BindingSource 管理編輯狀態
  • 傳輸變更集而非全量數據
  • 服務端採用樂觀並發(RowVersion/Timestamp)
  • 異步調用避免 UI 凍結:await wcfClient.UpdateDataAsync(changes)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved