如何在单行上处理DataColumn表达式异常而不会导致所有行都使用默认值?

时间:2015-10-26 19:17:00

标签: c# expression datacolumn system.data system.data.datatable

我尝试使用DataTable使用DataColumns上的Expression属性对数据行执行计算。 msdn

我发现如果将表达式应用于行时存在异常,则将使用默认值。这正是我想要的有问题的那一行。问题是每个后续行将使用默认值而不是评估表达式。

在此示例中,以包含两列和10行的基表开头。第一列是自动递增的列,范围为-5到5.第二列始终为3.

我添加第三列,其中的表达式将" 3"第一列的列。这将导致一行的div0异常。

对于那一行,我希望它使用我提供的默认值。它确实如此,但也将默认值应用于剩余的4行。

输出:

using System;
using System.Data;

namespace DataSetExpressionTest
{
    public class SO
    {
        private static DataTable table = null;

        private static void Main(string[] args)
        {
            table = CreateBaseTable(); 

            //If there is a problem only in some rows of the table, the rows before the error are calculated using the expression. All rows afrer use the default value
            DataColumn onlyOneException = new DataColumn()
            {
                ColumnName = "One-Ex",
                Expression = "third / index",
                DefaultValue = -33
            };

            AddCalculationToTable(onlyOneException);

            PrintDataTable(table);
            Console.ReadLine();
        }

        private static void AddCalculationToTable(DataColumn calculationColumn)
        {
            //You can wrap individual stats in try/catch blocks. If there is an exception in a calc, it will use the default value specified
            try
            {
                table.Columns.Add(calculationColumn);
            }
            catch (Exception e)
            {
                Console.WriteLine("Caught a calculation exception while adding column {0}. Will use default value instead!!", calculationColumn.ColumnName);
            }
        }

        private static DataTable CreateBaseTable()
        {
            DataTable table = new DataTable();

            // Create 3s column.
            DataColumn threeColumn = new DataColumn
            {
                DataType = Type.GetType("System.Decimal"),
                ColumnName = "third",
                DefaultValue = 3
            };

            //Create icrementing index column
            DataColumn indexColumn = new DataColumn
            {
                DataType = Type.GetType("System.Decimal"),
                ColumnName = "index",
                AutoIncrement = true,
                AutoIncrementSeed = -5
            };

            // Add columns to DataTable.
            table.Columns.Add(indexColumn);
            table.Columns.Add(threeColumn);

            for (var i = 0; i < 10; i++)
            {
                table.Rows.Add(table.NewRow());
            }
            return table;
        }

        public static void PrintDataTable(DataTable table)
        {
            foreach (DataColumn column in table.Columns)
            {
                Console.Write(column.ColumnName + " ");
            }

            Console.WriteLine();

            foreach (DataRow dataRow in table.Rows)
            {
                foreach (var item in dataRow.ItemArray)
                {
                    Console.Write(item + " ");
                }
                Console.WriteLine();
            }
        }
    }
}

如何添加处理以便在单个行出现问题时使用默认值,同时继续对后续行使用表达式?

请注意,我不能简单地使用here描述的IIF来检查这样的问题,因为使用的表达式是动态的,并且是作为自定义数据的方式从用户提供的。

重现此代码的完整代码:

OR

0 个答案:

没有答案