【开发心得】筑梦上海:项目风云录(16)
目录
代码反面案例
李青与诺基亚的兴衰
并行项目下的利益纠葛与团队协作
未完待续。。。
今天分享的是一个反面案例,也算是一个避坑指南了。
代码反面案例
今天分享的代码是一个反面案例,当时由于项目人员变动频繁,经常是新人看不太懂旧的代码,但是进度又来不及,所以临时想了一个办法,即借新还旧。
具体的操作方法是:旧文件不动,利用类的多态属性,重新写一个新的文件,比如旧文件名是demo.cs,那么新人过来就加一个新的文件名:demoEx.cs。但是不推荐这样的方式,会造成后期维护起来极其的困难!
所以在后来的最终版本中,项目经常出现类似上面命名规则的两个文件。今天的例子是个极端,出现了三个文件,由于demo.cs文件是空的,就不再展示了,具体代码如下:
demoEx.cs文件(代码较多,已做删减处理。。。)
public class CauseTroubleOperatorEx:Traffic.Common.TrafficOperatorEx{#region Update方法//对DATASET设置表间关系public static void SetDataRelation(System.Data.DataSet currentDS){ currentDS=(Traffic.Mechanism.CauseTroubleRules.dsMaterialsAudit)currentDS;DataRelation drl=currentDS.Relations.Add("MaterialsAppraise",currentDS.Tables["MaterialsAuditPrice"].Columns["Id"],currentDS.Tables["AppraiseProject"].Columns["MaterialsAuditPriceID"],true);DataRelation drl2=currentDS.Relations.Add("MaterialsRepairManPower",currentDS.Tables["MaterialsAuditPrice"].Columns["Id"],currentDS.Tables["RepairManPowerCost"].Columns["MaterialsAuditPriceID"],true);currentDS.EnforceConstraints=true;return;}public Reports Update(System.Data.DataSet dataSet){Reports reports=new Reports();for(int i=0;i<dataSet.Tables.Count;i++){if (dataSet.Tables[i].Rows.Count>0){this.Update(dataSet.Tables[i]);}}reports.ReturnObject=dataSet;reports.ReturnBool =true;return reports;}public Reports Update(System.Data.DataTable dataTable){int iRecordsAffected=0;Reports reports=new Reports();System.Data.OleDb.OleDbDataAdapter dataAdapter=new System.Data.OleDb.OleDbDataAdapter();;System.Data.OleDb.OleDbConnection cn= new System.Data.OleDb.OleDbConnection();System.Data.OleDb.OleDbCommandBuilder oCommandBuilder=new System.Data.OleDb.OleDbCommandBuilder();System.Data.OleDb.OleDbCommand oleInsertCommand1=new System.Data.OleDb.OleDbCommand();System.Data.OleDb.OleDbCommand oleInsertCommand2=new System.Data.OleDb.OleDbCommand();//创建适配器对象和连接对象。try{if (dataTable==null){reports.ReturnBool=true;reports.ModuleName="Update";reports.ReturnInt=0;return reports;}//cn.ConnectionString = @"Provider=SQLOLEDB.1;Password=infopro;Persist Security Info=True;User ID=sa;Initial Catalog=BusDev;Data Source=192.168.10.5;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=XHG;Use Encryption for Data=False;Tag with column collation when possible=False";cn=base.getConnection();System.Type oDataTableType=dataTable.GetType();//设置适配器对象的四种命令。switch(oDataTableType.Name){case "AppraiseProjectDataTable"://设置事件处理器。dataAdapter.RowUpdating += new OleDbRowUpdatingEventHandler( OnRowUpdatingOfAppraiseProjectDataTable );dataAdapter.RowUpdated += new OleDbRowUpdatedEventHandler( OnRowUpdatedOfAppraiseProjectDataTable );dataAdapter.SelectCommand=dsMaterialsAudit.AppraiseProjectDataTable.GetSelectCommand("");dataAdapter.SelectCommand.Connection=cn;oCommandBuilder.DataAdapter=dataAdapter;dataAdapter.InsertCommand=oCommandBuilder.GetInsertCommand();dataAdapter.InsertCommand.Connection=cn;dataAdapter.UpdateCommand=oCommandBuilder.GetUpdateCommand();dataAdapter.UpdateCommand.Connection=cn;dataAdapter.DeleteCommand=oCommandBuilder.GetDeleteCommand();dataAdapter.DeleteCommand.Connection=cn;break;case "MaterialsAuditParameterDataTable"://设置事件处理器。dataAdapter.RowUpdating += new OleDbRowUpdatingEventHandler( OnRowUpdating );dataAdapter.RowUpdated += new OleDbRowUpdatedEventHandler( OnRowUpdated );dataAdapter.SelectCommand=dsMaterialsAudit.MaterialsAuditParameterDataTable.GetSelectCommand("");dataAdapter.SelectCommand.Connection=cn;oCommandBuilder.DataAdapter=dataAdapter;dataAdapter.InsertCommand=oCommandBuilder.GetInsertCommand();dataAdapter.InsertCommand.Connection=cn;dataAdapter.UpdateCommand=oCommandBuilder.GetUpdateCommand();dataAdapter.UpdateCommand.Connection=cn;dataAdapter.DeleteCommand=oCommandBuilder.GetDeleteCommand();dataAdapter.DeleteCommand.Connection=cn;break;case "MaterialsAuditPriceDataTable"://设置事件处理器。dataAdapter.RowUpdating += new OleDbRowUpdatingEventHandler( OnRowUpdating );dataAdapter.RowUpdated += new OleDbRowUpdatedEventHandler( OnRowUpdated );dataAdapter.SelectCommand=dsMaterialsAudit.MaterialsAuditPriceDataTable.GetSelectCommand("");dataAdapter.SelectCommand.Connection=cn;oCommandBuilder.DataAdapter=dataAdapter;dataAdapter.InsertCommand=oCommandBuilder.GetInsertCommand();dataAdapter.InsertCommand.Connection=cn;dataAdapter.UpdateCommand=oCommandBuilder.GetUpdateCommand();dataAdapter.UpdateCommand.Connection=cn;dataAdapter.DeleteCommand=oCommandBuilder.GetDeleteCommand();dataAdapter.DeleteCommand.Connection=cn; break;case "RepairManPowerCostDataTable"://设置事件处理器。dataAdapter.RowUpdating += new OleDbRowUpdatingEventHandler( OnRowUpdatingOfRepairManPowerCostDataTable );dataAdapter.RowUpdated += new OleDbRowUpdatedEventHandler( OnRowUpdatedOfRepairManPowerCostDataTable );dataAdapter.SelectCommand=dsMaterialsAudit.RepairManPowerCostDataTable.GetSelectCommand("");dataAdapter.SelectCommand.Connection=cn;dataAdapter.SelectCommand.UpdatedRowSource=UpdateRowSource.Both;oCommandBuilder.DataAdapter=dataAdapter;dataAdapter.InsertCommand=oCommandBuilder.GetInsertCommand();dataAdapter.InsertCommand.Connection=cn;dataAdapter.UpdateCommand=oCommandBuilder.GetUpdateCommand();dataAdapter.UpdateCommand.Connection=cn;dataAdapter.DeleteCommand=oCommandBuilder.GetDeleteCommand();dataAdapter.DeleteCommand.Connection=cn;break;case "RepairManPowerParameterSettingDataTable"://设置事件处理器。dataAdapter.RowUpdating += new OleDbRowUpdatingEventHandler( OnRowUpdating );dataAdapter.RowUpdated += new OleDbRowUpdatedEventHandler( OnRowUpdated );dataAdapter.SelectCommand=dsMaterialsAudit.RepairManPowerParameterSettingDataTable.GetSelectCommand("");dataAdapter.SelectCommand.Connection=cn;oCommandBuilder.DataAdapter=dataAdapter;dataAdapter.InsertCommand=oCommandBuilder.GetInsertCommand();dataAdapter.InsertCommand.Connection=cn;dataAdapter.UpdateCommand=oCommandBuilder.GetUpdateCommand();dataAdapter.UpdateCommand.Connection=cn;dataAdapter.DeleteCommand=oCommandBuilder.GetDeleteCommand();dataAdapter.DeleteCommand.Connection=cn;break;default:break;}iRecordsAffected=dataAdapter.Update(dataTable);}catch(Exception err){Console.WriteLine(err.Message);}//返回更新后的DataTable给客户端,进行合并。reports.ReturnBool=true;reports.ModuleName="Update";reports.ReturnInt=iRecordsAffected;reports.ReturnObject=dataTable;return reports;}/// <summary>/// 新增、修改、删除的业务方法/// </summary>/// <param name="sender"></param>/// <param name="args"></param>protected void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args){//判断是否出错,如果出现错误,解释错误。if (args.RecordsAffected == 0 ){args.Row.RowError ="错误类型:"+args.Errors.GetType().Name+", 错误信息:"+args.Errors.Message;args.Status = UpdateStatus.SkipCurrentRow;//args.Status = UpdateStatus.ErrorsOccurred;return ;}//获取新增行的Idif (args.StatementType==StatementType.Insert){this.GetInsertRowId(args.Row);}switch( args.StatementType){case StatementType.Insert:break;case StatementType.Update:break;case StatementType.Delete:break;case StatementType.Select:break;}}protected static void OnRowUpdating(object sender, OleDbRowUpdatingEventArgs args){switch( args.StatementType){case StatementType.Insert:break;case StatementType.Update: break;case StatementType.Delete:break;case StatementType.Select:break;}}#endregion#region AppraiseProjectDataTable operator...../// <summary>/// 新增、修改、删除的业务方法/// </summary>/// <param name="sender"></param>/// <param name="args"></param>protected void OnRowUpdatedOfAppraiseProjectDataTable(object sender, OleDbRowUpdatedEventArgs args){//提交之后对相关表进行更新//判断是否出错,如果出现错误,解释错误。if (args.RecordsAffected == 0 ){args.Row.RowError ="错误类型:"+args.Errors.GetType().Name+", 错误信息:"+args.Errors.Message;args.Status = UpdateStatus.SkipCurrentRow;return ;}//获取新增行的Idif (args.StatementType==StatementType.Insert){this.GetInsertRowId(args.Row);}switch( args.StatementType){case StatementType.Select:break;default://首先获取相关表System.Data.DataSet ds=args.Row.Table.DataSet;System.Data.DataTable dt=ds.Tables["MaterialsAuditPrice"];//获取相关参数Traffic.Mechanism.CauseTroubleRules.CauseTrouble oOperator=new Traffic.Mechanism.CauseTroubleRules.CauseTrouble();//小五金的占材料费用比例(MaterialPricePercent)decimal materialsPricePercent=oOperator.GetMaterialsAuditParameter("MaterialPricePercent");System.Data.DataRow dr=args.Row;int materialsAuditPriceID=Convert.ToInt32(dr["MaterialsAuditPriceID"]);System.Data.DataRow mdr=dt.Rows.Find(materialsAuditPriceID);mdr["TotalMaterialsPrice"]=oOperator.ComputeTotalMaterialsPrice(materialsAuditPriceID);mdr["TotalHardwarePrice"]=oOperator.ComputeTotalHardWarePrice(materialsAuditPriceID);mdr["TotalPrice"]=oOperator.ComputeTotalPrice(materialsAuditPriceID);(new Traffic.Mechanism.CauseTroubleRules.CauseTroubleOperatorEx()).Update(dt);break;}}#endregion#region Search、LoadByID 对象操作/// <summary>/// 根据条件查找对象 ( 票库, 票库入库单, 票库调拨单 , 票库调入单, 票库调出单, 票库作废单)/// </summary>/// <param name="savetype">对象的类型</param>/// <param name="searchObject">搜索条件对象</param>/// <param name="currentPage">当前页号</param>/// <param name="pageSize">每页记录数</param>/// <param name="numResults">总记录数</param>/// <returns></returns>public Reports Search(System.Data.DataTable dataTable,string sSQL,Props searchObject,int currentPage, int pageSize,ref int numResults){int iRecordsAffected=0;Reports reports=new Reports();System.Data.OleDb.OleDbDataAdapter dataAdapter=new System.Data.OleDb.OleDbDataAdapter();;System.Data.OleDb.OleDbConnection cn= new System.Data.OleDb.OleDbConnection();//创建适配器对象和连接对象。cn=this.getConnection();System.Type oDataTableType=dataTable.GetType();string sWhere="";if (searchObject!=null){foreach (Prop p in searchObject) {string SearchValue=(string)p.PropValue;if (SearchValue==null|SearchValue.ToString().Trim()==String.Empty) continue;sWhere+=" And ";switch (p.Key.ToLower()){case "Id": sWhere+=p.Key+" "+p.OpWay+" "+p.PropValue;break;default:if (p.OpWay.ToString().Trim().ToLower()=="like"){sWhere+=p.Key+" like '%"+p.PropValue+"%' ";}else{ sWhere+=p.Key+" "+p.OpWay+" '"+p.PropValue+"' ";}break;}} }if (sWhere.Trim()!=""){sWhere=sWhere.Substring(4);sWhere=" Where "+ sWhere;}//设置适配器对象的Select命令。System.Data.OleDb.OleDbCommand oleSelectCommand=new System.Data.OleDb.OleDbCommand ();oleSelectCommand.CommandText=sSQL+sWhere;oleSelectCommand.Connection=cn;dataAdapter.SelectCommand=oleSelectCommand;//调用适配器的Fill命令。dataTable.Clear();iRecordsAffected=dataAdapter.Fill(dataTable.DataSet,(currentPage-1)*pageSize,numResults,dataTable.TableName); //装载后恢复计算关系。//返回更新后的DataTable给客户端,进行合并。reports.ReturnBool=true;reports.ModuleName="Search";reports.ReturnInt=iRecordsAffected;reports.ReturnObject=dataTable;return reports;}/// <summary>/// 根据条件查找对象 ( 票库, 票库入库单, 票库调拨单 , 票库调入单, 票库调出单, 票库作废单)/// </summary>/// <param name="savetype">对象的类型</param>/// <param name="searchObject">搜索条件对象</param>/// <param name="currentPage">当前页号</param>/// <param name="pageSize">每页记录数</param>/// <param name="numResults">总记录数</param>/// <returns></returns>public Reports Search(System.Data.DataTable dataTable,Props searchObject,int currentPage, int pageSize,ref int numResults){int iRecordsAffected=0;Reports reports=new Reports();System.Data.OleDb.OleDbDataAdapter dataAdapter=new System.Data.OleDb.OleDbDataAdapter();;System.Data.OleDb.OleDbConnection cn= new System.Data.OleDb.OleDbConnection();//创建适配器对象和连接对象。//cn.ConnectionString = @"Provider=SQLOLEDB.1;Password=infopro;Persist Security Info=True;User ID=sa;Initial Catalog=BusDev;Data Source=192.168.10.5;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=XHG;Use Encryption for Data=False;Tag with column collation when possible=False";cn=this.getConnection();System.Type oDataTableType=dataTable.GetType();string sWhere="";foreach (Prop p in searchObject) {string SearchValue=(string)p.PropValue;if (SearchValue==null|SearchValue.ToString().Trim()==String.Empty) continue;sWhere+=" And ";switch (p.Key.ToLower()){case "Id": sWhere+=p.Key+" "+p.OpWay+" "+p.PropValue;break;default:if (p.OpWay.ToString().Trim().ToLower()=="like"){sWhere+=p.Key+" like '%"+p.PropValue+"%' ";}else{ sWhere+=p.Key+" "+p.OpWay+" '"+p.PropValue+"' ";}break;}} if (sWhere.Trim()!=""){sWhere=sWhere.Substring(4);sWhere=" Where "+ sWhere;}//设置适配器对象的Select命令。switch(oDataTableType.Name){case "AppraiseProjectDataTable":dataAdapter.SelectCommand=dsMaterialsAudit.AppraiseProjectDataTable.GetSelectCommand(sWhere);dataAdapter.SelectCommand.Connection=cn;break;case "MaterialsAuditParameterDataTable":dataAdapter.SelectCommand=dsMaterialsAudit.MaterialsAuditParameterDataTable.GetSelectCommand(sWhere);dataAdapter.SelectCommand.Connection=cn;break;case "MaterialsAuditPriceDataTable":dataAdapter.SelectCommand=dsMaterialsAudit.MaterialsAuditPriceDataTable.GetSelectCommand(sWhere);dataAdapter.SelectCommand.Connection=cn;break;case "RepairManPowerCostDataTable":dataAdapter.SelectCommand=dsMaterialsAudit.RepairManPowerCostDataTable.GetSelectCommand(sWhere);dataAdapter.SelectCommand.Connection=cn;break;case "RepairManPowerParameterSettingDataTable":dataAdapter.SelectCommand=dsMaterialsAudit.RepairManPowerParameterSettingDataTable.GetSelectCommand(sWhere);dataAdapter.SelectCommand.Connection=cn;break;case "tbBusCompanyDataTable":dataAdapter.SelectCommand=dsBusCompany1.tbBusCompanyDataTable.GetSelectCommand(sWhere);dataAdapter.SelectCommand.Connection=cn;break;case "tbRouteDataTable":dataAdapter.SelectCommand=dsBusCompany1.tbRouteDataTable.GetSelectCommand(sWhere);dataAdapter.SelectCommand.Connection=cn;break;default:reports.ReturnBool =false;break;}//调用适配器的Fill命令。dataTable.Clear();iRecordsAffected=dataAdapter.Fill(dataTable.DataSet,(currentPage-1)*pageSize,numResults,dataTable.TableName); //返回更新后的DataTable给客户端,进行合并。reports.ReturnBool=true;reports.ModuleName="Search";reports.ReturnInt=iRecordsAffected;reports.ReturnObject=dataTable;return reports;}#endregion}
DemoNew.cs文件:
public class CauseTroubleOperatorNew:Traffic.Common.TrafficOperatorEx{#region GetSelectCommand方法private System.Data.OleDb.OleDbCommand GetSelectCommand(string sDataTableName ,string sWhere ){System.Data.OleDb.OleDbCommand oleDbCommand = new System.Data.OleDb.OleDbCommand(); switch(sDataTableName){case "TroubleMaterialCostDataTable":oleDbCommand.CommandText="SELECT * FROM TroubleMaterialCost";break;case "MaterialParameterDataTable":oleDbCommand.CommandText="SELECT * FROM MaterialParameter";break;case "MaterialAuditParameterDataTable":oleDbCommand.CommandText="SELECT * FROM MaterialAuditParameter";break;case "TotalAuditPriceDataTable":oleDbCommand.CommandText="SELECT * FROM TotalAuditPrice";break;case "ManPowerCostDataTable":oleDbCommand.CommandText="SELECT * FROM ManPowerCost";break;case "ManPowerParameterDataTable":oleDbCommand.CommandText="SELECT * FROM ManPowerParameter";break;case "ManHourDataTable":oleDbCommand.CommandText="SELECT * FROM ManHour";break;case "DamageLevelDataTable":oleDbCommand.CommandText="SELECT * FROM DamageLevel";break;case "wzMaterialDataTable":oleDbCommand.CommandText="SELECT * FROM wzMaterial";break;case "HFrequenceMaterialDataTable":oleDbCommand.CommandText="SELECT * FROM HFrequenceMaterial";break;case "wzMaterialOutBillDataTable":oleDbCommand.CommandText="SELECT * FROM wzMaterialOutBill";break;case "wzMaterialOutBillMXDataTable":oleDbCommand.CommandText="SELECT * FROM wzMaterialOutBillMX";break;default:break;}if (oleDbCommand.CommandText!=""){oleDbCommand.CommandText=oleDbCommand.CommandText+" "+sWhere; }if (sDataTableName=="HFrequenceMaterialDataTable"){oleDbCommand.CommandText=oleDbCommand.CommandText+" order by Frequence DESC";}return oleDbCommand;}#endregion#region Update方法public Reports Update(System.Data.DataTable dataTable){int iRecordsAffected=0;Reports reports=new Reports();System.Data.OleDb.OleDbDataAdapter dataAdapter=new System.Data.OleDb.OleDbDataAdapter();;System.Data.OleDb.OleDbConnection cn= new System.Data.OleDb.OleDbConnection();System.Data.OleDb.OleDbCommandBuilder oCommandBuilder=new System.Data.OleDb.OleDbCommandBuilder();//创建适配器对象和连接对象。try{if (dataTable==null){reports.ReturnBool=true;reports.ModuleName="Update";reports.ReturnInt=0;return reports;}cn=this.getConnection();System.Type oDataTableType=dataTable.GetType();//设置适配器对象的四种命令。dataAdapter.SelectCommand=this.GetSelectCommand(oDataTableType.Name,"");if (dataAdapter.SelectCommand !=null){//设置事件处理器。dataAdapter.RowUpdating += new OleDbRowUpdatingEventHandler( OnRowUpdating );dataAdapter.RowUpdated += new OleDbRowUpdatedEventHandler( OnRowUpdated );dataAdapter.SelectCommand.Connection=cn;oCommandBuilder.DataAdapter=dataAdapter;System.Data.OleDb.OleDbCommand oleInsertCommand1=oCommandBuilder.GetInsertCommand();System.Data.OleDb.OleDbCommand oleInsertCommand2=new System.Data.OleDb.OleDbCommand() ;oleInsertCommand2.UpdatedRowSource=UpdateRowSource.Both; oleInsertCommand2.CommandText=oleInsertCommand1.CommandText+"; SELECT * FROM "+dataTable.TableName+" WHERE (Id = @@IDENTITY)";foreach( System.Data.OleDb.OleDbParameter oleDbParameter in oleInsertCommand1.Parameters){oleInsertCommand2.Parameters.Add(oleDbParameter.ParameterName,oleDbParameter.OleDbType,oleDbParameter.Size,oleDbParameter.SourceColumn);}dataAdapter.InsertCommand=oleInsertCommand2;dataAdapter.InsertCommand.Connection=cn;dataAdapter.UpdateCommand=oCommandBuilder.GetUpdateCommand();dataAdapter.UpdateCommand.Connection=cn;dataAdapter.DeleteCommand=oCommandBuilder.GetDeleteCommand();dataAdapter.DeleteCommand.Connection=cn; //调用适配器的Update命令。iRecordsAffected=dataAdapter.Update(dataTable);}//这里写其他业务规则。}catch(Exception err){Console.WriteLine(err.Message);}//返回更新后的DataTable给客户端,进行合并。reports.ReturnBool=true;reports.ModuleName="Update";reports.ReturnInt=iRecordsAffected;reports.ReturnObject=dataTable;return reports;}/// <summary>/// 新增、修改、删除的业务方法/// </summary>/// <param name="sender"></param>/// <param name="args"></param>protected static void OnRowUpdated(object sender, OleDbRowUpdatedEventArgs args){//判断是否出错,如果出现错误,解释错误。if (args.RecordsAffected == 0 ){args.Row.RowError =CErrorHandler.TranslateError(args);args.Status = UpdateStatus.SkipCurrentRow;//args.Status = UpdateStatus.ErrorsOccurred;return ;}switch( args.StatementType){case StatementType.Insert:break;case StatementType.Update:break;case StatementType.Delete:break;case StatementType.Select:break;}}#endregion#region Search、LoadByID 对象操作/// <summary>/// 根据条件查找对象(公司)/// </summary>/// <param name="savetype">对象的类型</param>/// <param name="searchObject">搜索条件对象</param>/// <param name="currentPage">当前页号</param>/// <param name="pageSize">每页记录数</param>/// <param name="numResults">总记录数</param>/// <returns></returns>public Reports Search(System.Data.DataTable dataTable,Props searchObject,int currentPage, int pageSize,ref int numResults){int iRecordsAffected=0;Reports reports=new Reports();System.Data.OleDb.OleDbDataAdapter dataAdapter=new System.Data.OleDb.OleDbDataAdapter();;System.Data.OleDb.OleDbConnection cn= new System.Data.OleDb.OleDbConnection();//创建适配器对象和连接对象。cn=this.getConnection();System.Type oDataTableType=dataTable.GetType();string sWhere="";foreach (Prop p in searchObject) {string SearchValue=(string)p.PropValue;if (SearchValue==null|SearchValue.ToString().Trim()==String.Empty) continue;sWhere+=" And ";switch (p.Key.ToLower()){case "Id": sWhere+=p.Key+" "+p.OpWay+" "+p.PropValue;break;default:if (p.OpWay.ToString().Trim().ToLower()=="like"){sWhere+=p.Key+" like '%"+p.PropValue+"%' ";}else{ sWhere+=p.Key+" "+p.OpWay+" '"+p.PropValue+"' ";}break;}} if (sWhere.Trim()!=""){sWhere=sWhere.Substring(4);sWhere=" Where "+ sWhere;}//设置适配器对象的Select命令。dataAdapter.SelectCommand=this.GetSelectCommand(oDataTableType.Name,sWhere);dataAdapter.SelectCommand.Connection=cn;//调用适配器的Fill命令。dataTable.Clear();iRecordsAffected=dataAdapter.Fill(dataTable.DataSet,(currentPage-1)*pageSize,numResults,dataTable.TableName); //返回更新后的DataTable给客户端,进行合并。reports.ReturnBool=true;reports.ModuleName="Search";reports.ReturnInt=iRecordsAffected;reports.ReturnObject=dataTable;return reports;}#endregion}
李青与诺基亚的兴衰
李青的学历只有大专,但是很喜欢编程的工作。据他自己说,上学期间,就是喜欢打游戏,所以才耽误了考试,没有考上本科。
事实也的确如他所说,他的手机是当时带symbian系统的。有一次迟到,说symbian系统的闹钟坏了,当时也觉得奇怪。手机闹钟都能坏,这诺基亚估计也快差不多了。
果然,几年以后,当各种智能手机流行的时候,诺基亚成了历史。
刚过来的时候,李青还是很卖力的工作,毕竟年轻气盛,很想好好的干一番事业。他来了以后,就跟X经理打得火热,毕竟年纪上更加相近一些。有一次他跟X经理说,等他到我的年龄的时候,一定要比我混的好。
当时的我,并没有在意这些话的真假,也没有去想背后的含义。
并行项目下的利益纠葛与团队协作
上次提及,我们正并行推进两大项目:一是关乎车辆安全的信息系统(简称AQ系统),另一则是ZL系统。AQ系统已由我初步开发,框架大体成型;而ZL系统则尚处于需求与框架构建阶段。因此,我决定安排李青接手AQ系统的后续开发工作,而我则继续担任与客户沟通协调的重任。
客户方的负责人同样姓李,虽非IT出身,但在业务领域内却是行家里手,更是集团车辆安全部门的副总。一般而言,副总都是实干家,李副总自然也不例外。幸运的是,我们之间的沟通一直顺畅无阻,我也在逐步深入了解业务细节。
还记得之前文章中提及的利益问题吗?在AQ项目的管理过程中,我深刻感受到了利益的重要性。经过一系列操作,最终的目的就是为了确定事故费用,以便与保险公司、车队以及驾驶员进行结算。
当时,交强险刚刚推出,为了这个项目,我特意学习了交强险的相关知识。期间,我与李副总就一些问题展开了多次讨论,而大多数情况下,他的见解都是正确的。
起初,李青并未参与这些讨论,都是我确认需求后,再交给他进行代码实现。然而,随着李副总对项目进度的日益关注,为了加快进度,我开始带着李青一同参加沟通会议,这大大减少了信息传递的误差。
但这也引发了一个问题:我发现李青开始与李副总走得很近,甚至在业务讨论中,他的立场明显倾向于李副总。当时,我以为他只是为了加快进度,所以并未多想。然而,现在回想起来,我当时的判断或许过于草率了。
未完待续。。。
相关文章:
【开发心得】筑梦上海:项目风云录(16)
目录 代码反面案例 李青与诺基亚的兴衰 并行项目下的利益纠葛与团队协作 未完待续。。。 今天分享的是一个反面案例,也算是一个避坑指南了。 代码反面案例 今天分享的代码是一个反面案例,当时由于项目人员变动频繁,经常是新人看不太懂旧…...
Neovim插件深度解析:mcphub.nvim如何用MCP协议重构开发体验
在AI与工具链深度融合的今天,Neovim 作为现代开发者的生产力工具,正通过插件生态不断突破边界。mcphub.nvim 作为一款基于 MCP(Model Context Protocol) 协议的插件,重新定义了Neovim与智能工具的交互方式。它不仅简化了MCP服务器的集成与管理,更通过直观的UI和生态整合,…...
Qt UDP 通信的详细实现步骤和示例代码
在 Qt 中实现 UDP 通信主要使用 QUdpSocket 类。以下是 UDP 通信的详细实现步骤和示例代码: 一、UDP 通信基础 无连接协议:不需要建立持久连接数据报模式:以独立数据包(datagram)形式发送适用场景:实时性要…...
(二)Trae 配置C++ 编译
Trae配置c编译 零 CMake 编译C0.1 下载安装0.2 安装设置0.3 三种编译方式(见 下文 一 二 三)0.4 调试 (见 下文四) 一 使用MSVC方式编译1.1 安装编译环境1.2安装插件1.3 设置文件 二 使用GCC方式2.1 安装编译环境2.1.1下载:[MinGw](https://gcc-mcf.lhmouse.com/)2.1.2安装:(以…...
动态规划算法的欢乐密码(一):斐波那契数模型
专栏:算法的魔法世界 个人主页:手握风云 目录 一、动态规划 二、例题讲解 2.1. 第 N 个泰波那契数 2.2. 三步问题 2.3. 使用最小花费爬楼梯 2.4. 解码方法 一、动态规划 动态规划是一种将复杂问题分解为更小的子问题,并利用子问题的解来…...
【FreeRTOS进阶】优先级翻转现象详解及解决方案
【FreeRTOS进阶】优先级翻转现象详解及解决方案 接下来我们聊聊优先级翻转这个经典问题。这个问题在实时系统中经常出现,尤其是在任务较多的场景下,而且问题定位起来比较麻烦。 什么是优先级翻转? 优先级翻转的核心定义很简单:…...
解决 IntelliJ IDEA 项目启动时端口冲突问题
1.问题 Description: The Tomcat connector configured to listen on port 8082 failed to start. The port may already be in use or the connector may be misconfigured. Action: Verify the connectors configuration, identify and stop any process thats listening…...
笔试专题(十一)
文章目录 添加字符(暴力枚举)题解代码 城市群数量(dfs)题解代码 判断是不是平衡二叉树(递归)题解代码 最大子矩阵(二维前缀和)题解代码 小葱的01串 (固定区间大小的滑动窗…...
C++11新增语法:列表初始化
前言: 接下来我们将要讲解,相较于c98,c11中新增的语法以及如何使用~。我们首先来讲解:列表初始化。 下文预告:右值引用和移动语义 C98中传统的{} 在c98中的{},仅能初始化数组和结构体 #include<iostrea…...
Linux:基础IO---动静态库
文章目录 1. 动静态库前置知识1.1 动静态库知识回顾1.2 什么是动静态库 2. 动静态库2.1 站在库的制作者的角度2.2 站在库的使用者的角度2.3 动态库是怎么被加载的(原理) 序:上一篇文章我们从认识到理解,从理解到实现场景ÿ…...
从裸仓库到GitLab全解析
Git服务器搭建与使用指南:从裸仓库到GitLab全解析 前言 在团队协作开发中,版本控制系统是必不可少的工具。虽然GitHub提供了优秀的代码托管服务,但企业级项目往往需要更安全的私有化部署方案。本文将手把手教你两种主流的Git服务器搭建方式…...
OzGIS:地理信息分析与处理软件
大家好,今天为大家介绍的软件是OzGIS:一款地理信息分析与处理软件。下面,我们将从软件的主要功能、支持的系统、软件官网等方面对其进行简单的介绍。 OzGIS官网网址为:https://ozgis.sourceforge.io/。 OzGIS是一款开源软件&#…...
PHP异常处理__Throwable
在 PHP 里,Throwable 是一个极为关键的接口,自 PHP 7 起被引入。它为错误和异常处理构建了一个统一的框架。下面会详细介绍 Throwable 的相关内容。 1. 基本概念 Throwable 是 Exception 和 Error 的父接口。在 PHP 7 之前,异常(…...
PHP异常处理__Exception类
以下是对 PHP 中 Exception 类的详细解释: 一、Exception 类概述 Exception 是 PHP 中所有异常类的基类。它提供了一个通用的异常处理机制,用于处理程序执行过程中可能出现的错误情况。当程序中出现异常时,可以创建 Exception 的实例并将其…...
C++中动态多态类别浅析
非抽象类继承和虚函数 #include <iostream> using namespace std;class Base { public:virtual void func() { // 虚函数,支持动态绑定cout << "Base::func()" << endl;} };class Derived : public Base { public:void func() overrid…...
游戏引擎学习第234天:实现基数排序
回顾并为今天的内容设定背景 我们今天继续进行排序的相关,虽然基本已经完成了,但还是想收尾一下,让整个流程更完整。其实这次排序只是个借口,主要是想顺便聊一聊一些计算机科学的知识点,这些内容在我们项目中平时不会…...
系分架构论文《论高并发场景的架构设计和开发方法》
系统分析师论文范文系列 【摘要】 2022年8月,我司承接了某知名电商平台“秒杀系统架构优化”项目,我作为系统分析师主导了整体架构设计与技术选型工作。该平台在促销活动中面临瞬时流量超过50万QPS的挑战,原有架构存在数据库崩溃、服务响应延…...
最新得物小程序sign签名加密,请求参数解密,响应数据解密逆向分析
点击精选,出现https://app.dewu.com/api/v1/h5/index/fire/index 这个请求 直接搜索sign的话不容易定位 直接搜newAdvForH5就一个,进去再搜sign,打上断点 可以看到t.params就是没有sign的请求参数, 经过Object(a.default)该函数…...
jangow靶机笔记(Vulnhub)
环境准备: 靶机下载地址: https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova kali地址:192.168.144.128 靶机(jangow)地址:192.168.144.180 一.信息收集 1.主机探测 使用arp-scan进行主机探…...
Spring Boot + Caffeine:打造高性能缓存解决方案
1. 引言 1.1 缓存的重要性 缓存是提升系统性能的关键技术之一,通过将频繁访问的数据存储在内存中,减少对数据库或其他外部系统的访问次数,从而降低延迟并提高吞吐量。 缓存的基本概念:缓存是一种临时存储机制,用于快速访问常用数据。缓存在提升系统性能中的作用:减少数…...
C++入门小馆: 深入string类
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
命令行基础
学习目标 掌握VRP命令行的基础知识 利用VRP命令行进行基本的配置 VRP命令行的基础知识 一、VRP 命令行基本架构 1. 用户视图(User View) 进入方式:设备启动后默认进入,提示符为 <HUAWEI>。功能&#…...
10-DevOps-Jenkins参数化构建实现多版本发布
在之前的Jenkins配置中,固定写死了程序的版本号,实际情况是随着版本的不断迭代,版本号也是不断变化的,版本号由代码仓库(GitLab)设置。 当前Jenkins配置是固定写的1.0,本节我们要把它改成动态的…...
C++游戏服务器开发之⑦redis的使用
目录 1.当前进度 2.守护进程 3.进程监控 4.玩家姓名添加文件 5.文件删除玩家姓名 6.redis安装 7.redis存取命令 8.redis链表存取 9.redis程序结构 10.hiredisAPI使用 11.基于redis查找玩家姓名 12.MAKEFILE编写 13.游戏业务实现总结 1.当前进度 2.守护进程 3.进程监…...
二进制裁剪命令mips-linux-gnu-strip 命令的使用
-s 或者--strip-all:移除所有符号和调试信息 -g 或者--strip-debug:仅移除调试信息 -d 或者--strip-unneeded:移除不需要的符号 默认不传任何参数 也是移除所有符号和调试 应用:把文件系统所有二进制镜像使用一遍,缩小文件系统大小 79K Apr 19 15:47 fat.ko //使用前 mips-l…...
【Bluedroid】蓝牙存储模块配置管理:启动、读写、加密与保存流程解析
本文围绕蓝牙存储模块展开,主要解析了蓝牙存储模块(StorageModule)的初始化流程,重点围绕配置文件校验、读取、设备类型修复及加密处理展开。通过工厂重置检测、校验和验证、多源配置加载、设备类型推断修正等步骤,确保…...
SpringBoot启动后初始化的几种方式
目录 一、静态代码块 二、构造方法 三、PostConstruct 四、InitializingBean 接口 五、 Bean 注解中的 initMethod 六、 CommandLineRunner 接口 七、ApplicationRunner 接口 八、EventListener事件 九、SmartInitializingSingleton接口 十、ApplicationListener接口…...
asp.net core webapi+efcore
简洁的restfull风格 目前c#提供了多种风格的web编程,因为微软有自己的前端,所以集成了很多内容,不过基于现在编程前后端分离的模式,webapi是合适的。 webapi 目前网络上有很多介绍,不反复说这个了。在建立控制器时&…...
java怎么完善注册,如果邮箱中途更换,能否判断
解析在下面 附赠代码 private static class CodeInfo {String code;long timestamp;CodeInfo(String code, long timestamp) {this.code code;this.timestamp timestamp;}}// 存储验证码(邮箱 -> 验证码信息)(保证线程安全) 以免中途更改邮箱pri…...
实战设计模式之备忘录模式
概述 与解释器模式、迭代器模式一样,备忘录模式也是一种行为设计模式。备忘录模式允许我们保存一个对象的状态,并在稍后恢复到这个状态。该模式非常适合于需要回滚、撤销或历史记录等功能的应用场景。通过使用备忘录模式,开发者可以轻松添加诸…...
数据库表设计
一对一关系 共享主键 两个表的主键是相同的 唯一外键 从表中记录主表的id 一对多关系 从表(多的表)存储主表的id 多对多关系 设计一个中间表(关联表),它有两列分别记录两个主表(A 和 B)…...
Linux 桌面环境 LXQt 2.2 发布
Linux 桌面环境 LXQt 2.2 于 2025 年 4 月 17 日正式发布。这是该轻量级开源 Qt 桌面环境的最新稳定版本,带来了诸多改进,特别是在 Wayland 支持方面。以下是一些主要的更新内容: Wayland 支持增强: 提升了多屏支持,使…...
多人五子棋联机对战平台 测试报告
目录 项目介绍 测试用例设计 部分功能测试示例 自动化测试 测试范围 排除范围 自动化测试目录编辑 执行全部自动化测试用例 性能说明 总结 性能测试 结果分析 测试总结 项目介绍 该项目基于WebSocket实现实时通信,采用SSM框架构建在线五子棋多人联机…...
探索 .bat 文件:自动化任务的利器
在现代计算机操作中,批处理文件(.bat 文件)是一种简单而强大的工具,它可以帮助我们自动化重复性任务,工作效率提高。尽管随着编程语言和脚本工具的发展,.bat 文件的使用频率有所下降,但它依然是…...
240419 leetcode exercises
240419 leetcode exercises jarringslee 文章目录 240419 leetcode exercises[19. 删除链表的倒数第 N 个结点](https://leetcode.cn/problems/remove-nth-node-from-end-of-list/)🔁 经典方法:两次遍历暴力求解🔁 双指针法 :快慢…...
开源Midjourney替代方案:企业级AI绘画+PPT生成系统+AI源码
「AI取代设计师?」开源Midjourney替代方案:企业级AI绘画PPT生成系统 ——零代码私有化部署,5倍速出图100%版权合规 设计师行业的危机与机遇 1. 传统设计流程的致命短板 痛点 人工设计 AI系统 单张海报耗时 3小时(含反复修改…...
学习笔记十七——Rust 支持面向对象编程吗?
🧠 Rust 支持面向对象编程吗? Rust 是一门多范式语言,主要以 安全、并发、函数式、系统级编程为核心目标,但它同时也支持面向对象的一些关键特性,比如: 特性传统 OOP(如 Java/C)Ru…...
图灵奖得主LeCun:DeepSeek开源在产品层是一种竞争,但在基础方法层更像是一种合作;新一代AI将情感化
图片来源:This is World 来源 | Z Potential Z Highlights: 新型的AI系统是以深度学习为基础,能够理解物理世界并且拥有记忆、推理和规划能力的。一旦成功构建这样的系统,它们可能会有类似情感的反应,但这些情感是基…...
Flink框架十大应用场景
Flink框架适合应用的场景 1. 流式数据处理 Flink框架最常用的应用场景是流式数据处理。流式数据处理是指对实时数据进行处理,以便及时地做出决策。例如,一个电商网站需要对用户的行为进行实时分析,以便根据用户的兴趣和行为推荐商品。Flink框架可以帮助电商网站实时地处理数…...
C++镌刻数据密码的树之铭文:二叉搜索树
文章目录 1.二叉搜索树的概念2.二叉搜索树的实现2.1 二叉搜索树的结构2.2 二叉搜索树的节点寻找2.2.1 非递归2.2.2 递归 2.3 二叉搜索树的插入2.3.1 非递归2.3.2 递归 2.4 二叉搜索树的删除2.4.1 非递归2.4.2 递归 2.5 二叉搜索树的拷贝 3.二叉树的应用希望读者们多多三连支持小…...
CAN与CANFD协议说明
在 CAN(Controller Area Network,控制器局域网)协议里,仲裁域波特率和数据域比特率有着不同的含义和作用,下面为你详细介绍并举例说明。 概念解释 仲裁域波特率 含义:仲裁域是 CAN 数据帧中的一部分&…...
【C++ Qt】信号和槽(内配思维导图 图文并茂 通俗易懂)
每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: 本章是Qt中的第三章,也是我们理解Qt中必备的点 信号槽,它本质由信号和槽两个来实现,其中将细致的讲述如何自定义信号…...
【实战】在 Linux 上使用 Nginx 部署 Python Flask 应用
在 Linux 上使用 Nginx 部署 Python Flask 应用 步骤一:准备 Flask 应用 创建 Flask 应用 确保你有一个可以运行的 Flask 应用。例如,创建一个简单的 app.py 文件: from flask import Flask app Flask(__name__)app.route(/) def hello_wor…...
java ai 图像处理
Java AI 图像处理 图像处理是人工智能(AI)领域中非常重要的一个应用方向。通过使用Java编程语言和相应的库,我们可以实现各种图像处理任务,如图像识别、图像分类、图像分割等。本文将介绍一些常见的图像处理算法,并通过…...
【绘制图像轮廓】图像处理(OpenCV) -part7
15 绘制图像轮廓 15.1 什么是轮廓 轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。相对于边缘,轮廓是连续的,边缘不一定连续,如下图所示。轮廓是一个闭合的、封闭的形状。 轮廓的作用: 形状分析 目标识别 …...
Mesh模型孔洞修补算法总汇
关于Mesh 孔洞修补算法(Hole Filling in Meshes),这是计算几何和图形学中的一个重要话题,常用于重建、3D 扫描、建模等领域。下面我会系统总结主流和经典的孔洞修补方法,并按技术路线分类说明每种的原理、优缺点&#…...
ARINC818协议(六)
上图中,红色虚线上面为我们常用的simple mode简单模式,下面和上面的结合在一起,就形成了extended mode扩展模式。 ARINC818协议 container header容器头 ancillary data辅助数据 视频流 ADVB帧映射 FHCP传输协议 R_CTRL:路由控制routing ctr…...
RTMP握手流程
RTMP(Real-Time Messaging Protocol) 不支持除H.264/AAC之外的标准。 使用TCP,当到达网络拥塞、宽带上限时,传输质量受到影响。 URL格式: rtmp://host:port/app(名称)/stream(流IDÿ…...
【解决】torch引入过程中的ImportError: __nvJitLinkAddData_12_1, version libnvJitLink.so.12
大纲 本文记录在环境配置好后,在 import torch 过程中报了 异常 ImportError: /home/Coding/Envs/envs/only_test/lib/python3.10/site-packages/torch/lib/../../nvidia/cusparse/lib/libcusparse.so.12: undefined symbol: __nvJitLinkAddData_12_1, version lib…...
面试招聘:新能源汽车研发测试人员需求内部研讨会纪要(2025年4月19日草稿流出)
标题:XX汽车技术中心技术管理岗闭门会议纪要完整版:双非招聘策略、面试话术与风控方案(附待定事项) 【内部密级文件】 时间:2025年4月15日 14:00-17:30 地点:某主机厂研发中心会议室(305&#…...