/// <summary> /// 更新数据。 /// </summary> /// <param name="TableName">表名称。</param> /// <param name="data">包含要插入的数据的字典(字典的键必与数据库目标表的字段一致)。</param> /// <returns></returns> protected int Update(string TableName, Dictionary <string, object> data) { List <IDescription> expressions = new List <IDescription>(); foreach (KeyValuePair <string, object> item in data) { expressions.Add(td.Field(item.Key) == item.Value); } DbCommandBuilder Command = new DbCommandBuilder(); if (Conditions != null) { Command.Update(fm.Table(TableName)).Set(expressions.ToArray()).Where(Conditions.ToArray()); } else { Command.Update(fm.Table(TableName)).Set(expressions.ToArray()); } if (Trans == null) { return(Engine.DBA.ExecuteNoneQuery(Command)); } else { return(Trans.DBA.ExecuteNoneQuery(Command)); } }
/// <summary> /// 判断并构建指定行被指示的提交命令。 /// </summary> /// <param name="Row">被提交的行。</param> /// <param name="rowSubmission">对该行的处理指示。</param> /// <returns></returns> private DbCommandBuilder DataRowSubmissionCommand(DataRow Row, DataRowSubmission rowSubmission) { if (rowSubmission == null) { return(null); } // 开始构建命令。 DbCommandBuilder Command = new DbCommandBuilder(); switch (rowSubmission.Submission) { case QuickDataChangerSubmission.Delete: if (rowSubmission.Conditions != null && rowSubmission.Conditions.Count > 0) { Command.Delete(Row.Table.TableName).Where(rowSubmission.Conditions.ToArray()); } break; case QuickDataChangerSubmission.Update: if (rowSubmission.Conditions != null && rowSubmission.Conditions.Count > 0) { List <IDescription> expressions = new List <IDescription>(); foreach (DataColumn c in Row.Table.Columns) { if (!NotInsertFieldsContains(rowSubmission, c.ColumnName)) { expressions.Add(td.Field(c.ColumnName) == Row[c.ColumnName]); } } Command.Update(Row.Table.TableName).Set(expressions.ToArray()).Where(rowSubmission.Conditions.ToArray()); } break; case QuickDataChangerSubmission.Insert: List <FieldDescription> Fields = new List <FieldDescription>(); List <object> Values = new List <object>(); foreach (DataColumn c in Row.Table.Columns) { if (!NotInsertFieldsContains(rowSubmission, c.ColumnName)) { Fields.Add(td.Field(c.ColumnName)); Values.Add(Row[c.ColumnName]); } } Command.Insert(fm.Table(Row.Table.TableName), Fields.ToArray()).Values(Values.ToArray()); break; default: break; } return(Command); }
/// <summary> /// 更新数据表中的记录. /// </summary> /// <typeparam name="TEntity">数据表对应的实体类型.</typeparam> /// <param name="entity">实体对象.</param> /// <param name="func">用于创建更新条件.</param> /// <exception cref="ArgumentNullException">当必备的参数为空时引发此异常.</exception> /// <exception cref="Exception">当执行更新时产生错误时引发此异常.</exception> /// <returns>返回受影响的记录数.</returns> protected int Update <TEntity>(TEntity entity, Func <TEntityAgent, object[]> func) where TEntity : DataEntity, new() { if (entity == null) { throw new ArgumentNullException(nameof(entity)); } if (func == null) { throw new Exception("未指定更新条件时,整个数据表中的所有数据都将被更新为一样的,此操作已被禁止."); } // 过滤掉自增长字段. string[] withOutFields = GetWithOutFields(entity.GetType()); EntityTableAttribute tableAttribute = GetTableAttribute(); object[] conditions = null; if (func != null) // 获得外部 lambda 表达式返回的条件. { TEntityAgent agent = new TEntityAgent(); agent.TableContext = this; conditions = func(agent); } int result = 0; if (BatchProccesser == null) //非同连接分批处理模式. { QuickDataChanger DC = new QuickDataChanger(Writer); if (conditions != null) { DC.Conditions.AddRange(conditions); } result = DC.SaveToDataBase(tableAttribute.TableName, entity.ToDictionary(withOutFields), true); if (result == -1) // 若更新失败时向外界抛出异常. { throw new Exception(Writer.DBA.Error.Message); } } else //在同一个连接的分批处理模式. { List <IDescription> exp = new List <IDescription>(); Dictionary <string, object> data = entity.ToDictionary(withOutFields); foreach (KeyValuePair <string, object> item in data) { exp.Add(td.Field(item.Key) == item.Value); } DbCommandBuilder cb = new DbCommandBuilder(); cb.Update(tableAttribute.TableName).Set(exp.ToArray()).Where(conditions); result = BatchProccesser.Commander.ExecuteNonQuery(cb); } return(result); }