C#.NET 权限管理系统组件 - 大数据只获取更新部分数据列的标准例子
2023-02-18 15:37:30 时间
程序的运行效果如下:
1:获取时,只获取需要的列,不需要的列不获取,主要原因是:因为数据量大获取所有的列传输的数据量大,有些敏感数据未必需要都传输在网络上,其次是更新数据时的版本问题尽量避免,你也在改他也在改,隐藏的数据列也更新了,并不是很好甚至可能引起一些没必要的错误。
#region public DataTable GetAddressDataTableByPage(BaseUserInfo userInfo, string organizeId, string searchValue, out int recordCount, int pageIndex = 0, int pageSize = 100, string sort = null) /// <summary> /// 获取内部通讯录 /// </summary> /// <param name="userInfo">用户</param> /// <param name="organizeId">组织机构主键</param> /// <param name="search">查询内容</param> /// <param name="pageSize">分页的条数</param> /// <param name="pageIndex">当前页数</param> /// <returns>数据表</returns> public DataTable GetAddressDataTableByPage(BaseUserInfo userInfo, string organizeId, string searchValue, out int recordCount, int pageIndex = 0, int pageSize = 100, string sort = null) { // 写入调试信息 #if (DEBUG) int milliStart = BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod()); #endif // 加强安全验证防止未授权匿名调用 #if (!DEBUG) LogOnService.UserIsLogOn(userInfo); #endif DataTable dataTable = new DataTable(BaseStaffEntity.TableName); using (IDbHelper dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType)) { try { dbHelper.Open(UserCenterDbConnection); // 这里是不获取所有的列,只获取自己需要的列的标准方法 BaseStaffManager staffManager = new BaseStaffManager(dbHelper, userInfo); staffManager.SelectField = "Id, RealName, DepartmentName, DutyName, OfficePhone, Mobile, ShortNumber, Email, OICQ, Description"; dataTable = staffManager.GetAddressDataTableByPage(organizeId, searchValue, out recordCount, pageSize, pageIndex, sort); dataTable.TableName = BaseStaffEntity.TableName; BaseLogManager.Instance.Add(dbHelper, userInfo, this.serviceName, AppMessage.StaffService_GetAddressPageDT, MethodBase.GetCurrentMethod()); } catch (Exception ex) { BaseExceptionManager.LogException(dbHelper, userInfo, ex); throw; } finally { dbHelper.Close(); } } // 写入调试信息 #if (DEBUG) BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart); #endif return dataTable; } #endregion
2:更新时,只更新数据有变化的记录,没有变化的记录不进行更新。
#region private void BatchSave() 批量保存 /// <summary> /// 批量保存 /// </summary> private void BatchSave() { // 去掉未修改的数据,提高运行速度 for (int i = this.DTStaff.Rows.Count - 1; i >= 0; i--) { if (this.DTStaff.Rows[i].RowState == DataRowState.Unchanged) { this.DTStaff.Rows.RemoveAt(i); } } DotNetService.Instance.StaffService.BatchUpdateAddress(this.UserInfo, this.DTStaff); this.Search(); if (BaseSystemInfo.ShowInformation) { // 批量保存,进行提示 MessageBox.Show(AppMessage.MSG0012, AppMessage.MSG0000, MessageBoxButtons.OK, MessageBoxIcon.Information); } } #endregion
/// <summary> /// 批量更新通讯地址 /// </summary> /// <param name="userInfo">用户</param> /// <param name="dtStaff">数据表</param> /// <returns>影响行数</returns> public int BatchUpdateAddress(BaseUserInfo userInfo, DataTable dtStaff) { // 写入调试信息 #if (DEBUG) int milliStart = BaseBusinessLogic.StartDebug(userInfo, MethodBase.GetCurrentMethod()); #endif // 加强安全验证防止未授权匿名调用 #if (!DEBUG) LogOnService.UserIsLogOn(userInfo); #endif int returnValue = 0; using (IDbHelper dbHelper = DbHelperFactory.GetHelper(BaseSystemInfo.UserCenterDbType)) { try { dbHelper.Open(UserCenterDbConnection); // 这里是只更新部分字段的例子 foreach (DataRow dr in dtStaff.Rows) { SQLBuilder sqlBuilder = new SQLBuilder(dbHelper); sqlBuilder.BeginUpdate(BaseStaffEntity.TableName); // 这里是界面上显示的字段,需要更新的字段 sqlBuilder.SetValue(BaseStaffEntity.FieldOfficePhone, dr[BaseStaffEntity.FieldOfficePhone].ToString()); sqlBuilder.SetValue(BaseStaffEntity.FieldMobile, dr[BaseStaffEntity.FieldMobile].ToString()); sqlBuilder.SetValue(BaseStaffEntity.FieldShortNumber, dr[BaseStaffEntity.FieldShortNumber].ToString()); sqlBuilder.SetValue(BaseStaffEntity.FieldEmail, dr[BaseStaffEntity.FieldEmail].ToString()); sqlBuilder.SetValue(BaseStaffEntity.FieldOICQ, dr[BaseStaffEntity.FieldOICQ].ToString()); sqlBuilder.SetValue(BaseStaffEntity.FieldDescription, dr[BaseStaffEntity.FieldDescription].ToString()); sqlBuilder.SetWhere(BaseStaffEntity.FieldId, dr[BaseStaffEntity.FieldId].ToString()); returnValue += sqlBuilder.EndUpdate(); } BaseLogManager.Instance.Add(dbHelper, userInfo, this.serviceName, AppMessage.StaffService_BatchUpdateAddress, MethodBase.GetCurrentMethod()); } catch (Exception ex) { BaseExceptionManager.LogException(dbHelper, userInfo, ex); throw; } finally { dbHelper.Close(); } } // 写入调试信息 #if (DEBUG) BaseBusinessLogic.EndDebug(MethodBase.GetCurrentMethod(), milliStart); #endif return returnValue; }
希望能对需要的人起点儿参考作用。
相关文章
- Redis-技术专区-帮从底层彻底吃透RDB技术原理
- Mybatis-技术专区-如何清晰的解决出现「多对一模型」和「一对多模型」的问题
- 🏆【JVM技术专区】「难点-核心-遗漏」TLAB内存分配+锁的碰撞(技术串烧)!
- 🏆【Alibaba微服务技术系列】「Dubbo3.0技术专题」回顾Dubbo2.x的技术原理和功能实现及源码分析(温故而知新)
- 【微服务技术专题】Netflix动态化配置服务-微服务配置组件变色龙Archaius
- 🏆【JVM技术专区】「虚拟机专题」JDK/JVM的新储君—GraalVM和Quarkus
- Alibaba-技术专区-RocketMQ 延迟消息实现原理和源码分析
- 【SpringBoot技术专题】「JWT技术专区」SpringSecurity整合JWT授权和认证实现
- Alibaba-技术专区-Dubbo3总体技术体系介绍及技术指南(目录)
- Alibaba-技术专区-Dubbo3总体技术体系介绍及技术指南(序章)
- SpringBoot-技术专区-用正确的姿势如何用外置tomcat配置及运行(Tomcat优化分析)
- 【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(下)
- 【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(中)
- 【SpringCloud技术专题】「原生态Fegin」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(上)
- 🏆(不要错过!)【CI/CD技术专题】「Jenkins实战系列」(4)jenkins+pipeline构建自动化部署
- 🏆(不要错过!)【CI/CD技术专题】「Jenkins实战系列」(3)Jenkinsfile+DockerFile实现自动部署
- 【Maven实战技巧】「插件使用专题」Maven-Assembly插件实现自定义打包
- [书单]
- MySQL-技术专题-innodb存储引擎
- 浅谈NIO和Epoll的实现原理