コード例 #1
0
        /// <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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }