/// <summary> /// 检查指定的字段是否在不插入(或更新)的字段列表中。 /// </summary> /// <param name="rowSubmission">对该行的处理指示器。</param> /// <param name="Field">要检查的字段名称。</param> /// <returns>若指定的字段包含在不插入(或更新)的字段列表中时返回 true, 否则返回 false</returns> private bool NotInsertFieldsContains(DataRowSubmission rowSubmission, string Field) { if (rowSubmission.NotInsertFields == null) { return(false); } int index = Array.IndexOf <string>(rowSubmission.NotInsertFields, Field); return(index != -1); }
/// <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> /// 将一个 DataTable 中的改动批量保存回数据库(仅针对单表查询所得的数据集,并且在调用批量更新之前必须将数据库中的要更新的表名称设置为 DataTable 对像的 TableName 属性)。 /// </summary> /// <param name="Table">需要对其进行批量保存的数据集。</param> /// <param name="rowJudgment">用于判断数据行的操作处理的函数,在该函数中您需要判断给定的 DataTable 的某个字段在当前行的值。并通过该值来告诉程序应该如何处理此行。 /// <para>例如:在 DataTable 中设置一个名为“STATUS”的状态列表示更新状态。</para> /// <para> 0 表示未无改动,1 表示新增, 2 表示更新(任何一列的数据已被更改),3 表示删除(用户进行了删除时标记为此值,而不是直接从DataTable中删除)</para> /// <para>示例代码请参见更新日志中。</para> /// </param> /// <returns></returns> public int BatchSaveDataTable(DataTable Table, BatchSaveDataRowJudgment rowJudgment) { if (Table == null) { return(0); } if (Table.Rows.Count < 1) { return(0); } if (string.IsNullOrEmpty(Table.TableName)) { throw new Exception("在未指定 Table.TableName 的情况下不能使用批量更新。您必须将 Table 对象的 TableName 属性指定为数据库中的表名称时批量更新方能正常工作。"); } if (rowJudgment == null) { throw new Exception("不指定 rowJudgment 方法时批量更新方法无法工作。"); } int effect = 0; DataRowSubmission rowSubmission; for (int i = 0; i < Table.Rows.Count; ++i) { rowSubmission = rowJudgment(Table.Rows[i]); if (rowSubmission == null) { rowSubmission = new DataRowSubmission(QuickDataChangerSubmission.Ignore); } if (rowSubmission.Submission == QuickDataChangerSubmission.Ignore) { continue; } DbCommandBuilder Command = DataRowSubmissionCommand(Table.Rows[i], rowSubmission); if (Command == null) { continue; } if (Trans == null) { effect += Engine.DBA.ExecuteNoneQuery(Command); } else { effect += Trans.DBA.ExecuteNoneQuery(Command); } } return(effect); }