演练:向 N 层数据应用程序添加验证

“验证数据”是指确认输入到数据对象(例如,DataTable 或 LINQ to SQL 类)中的值是否符合对象架构内的约束的过程。 验证还可确保符合为应用程序建立的规则。 在将更新发送到基础数据库之前对数据进行验证是一种很好的做法,这样可以减少错误。 还可以减少应用程序和数据库之间的潜在往返行程次数。

本演练提供向 n 层应用程序(在演练:创建 N 层数据应用程序主题中创建的解决方案)添加验证的分步说明。

在本演练中,您将学习如何执行以下任务:

  • 使用数据集设计器自动生成分部类。

  • 添加代码,在各个列中的值更改时执行验证。

系统必备

若要完成本演练,需要以下项:

提示

对于在以下说明中使用的某些 Visual Studio 用户界面元素,您的计算机可能会显示不同的名称或位置。这些元素取决于您所使用的 Visual Studio 版本和您所使用的设置。有关更多信息,请参见 Visual Studio 设置

打开 NTierWalkthrough 解决方案

打开 NTierWalkthrough 解决方案

  • 在**“文件”菜单上指向“打开”,单击“项目/解决方案”**,然后定位到 NTierWalkthrough.sln 文件的位置。

    提示

    NTierWalkthrough.sln 文件是在演练:创建 N 层数据应用程序主题中创建的,它是完成本演练的必备条件。 如果尚未完成演练:创建 N 层数据应用程序主题,请将其完成,完成后保存所有项目。

添加验证,在单个列更改过程中检查数据

此过程将添加验证,以验证新订单中的 OrderDate 列是否设置为当前日期或更早日期的值。 此应用程序的要求是 OrderDate 列不能有晚于今天的日期;不允许出现将来的订单。

添加验证,验证输入 OrderDate 列中的值

  1. 通过在解决方案资源管理器中双击 DataAccessTier 项目中的 NorthwindDataSet.xsd 文件,在数据集设计器中打开数据集。

  2. 在设计器中双击 Orders 表的 OrderDate 列。 此操作将创建 ColumnChanging 事件处理程序。

    提示

    数据集设计器不会自动为 C# 事件创建事件处理程序。 此过程后面包括了用于在 C# 中处理事件所需的代码。 将创建 SampleColumnChangingEvent,然后在 EndInit 方法中订阅 ColumnChanging 事件。

  3. 添加代码以验证 OrderDate 列的 e.ProposedValue 是否包含当前日期或更早日期。 如果建议的值无效,请设置该列,指示其包含一个错误。

    下面的代码示例验证 OrderDate 列是否包含当前日期或更早日期。 如果 OrderDate 值为晚于今天的日期,则 OrderDate 列设置为错误。 如果 OrderDate 为今天或更早,则 Else 子句清除该错误。

    将 Visual Basic 代码粘贴到 ColumnChanging 事件处理程序中。 将 C# 代码粘贴到 OrdersDataTable 分部类声明中。

    If (e.Column.ColumnName = Me.OrderDateColumn.ColumnName) Then
        If CType(e.ProposedValue, DateTime) > Today Then
            e.Row.SetColumnError(e.Column, "OrderDate cannot be in the future")
        Else
            e.Row.SetColumnError(e.Column, "")
        End If
    End If
    
    // Replace the NorthwindDataSet partial class with the following:
    public partial class NorthwindDataSet
    {
        partial class OrdersDataTable
        {
            public override void EndInit()
            {
                base.EndInit();
                // Configure the ColumnChanging event
                // to call the SampleColumnChangingEvent method.
                ColumnChanging += SampleColumnChangingEvent;
            }
    
            public void SampleColumnChangingEvent(object sender, System.Data.DataColumnChangeEventArgs e)
            {
                if (e.Column.ColumnName == OrderDateColumn.ColumnName)
                {
                    if ((System.DateTime)e.ProposedValue > System.DateTime.Today)
                    {
                        e.Row.SetColumnError("OrderDate", " OrderDate cannot be in the future");
                    }
                    else
                    {
                        e.Row.SetColumnError("OrderDate", "");
                    }
                }
    
            }
        }
    }
    

测试应用程序

若要测试该应用程序,请将 OrderDate 列的值更改为一个无效的日期。

测试应用程序

  1. 按 F5。

  2. 来自 Customers 和 Orders 表的数据出现在窗体上。

  3. 在包含订单的 DataGridView 中,将(任何记录的)OrderDate 列中的值更改为明天的日期。

  4. 将光标从该行移开以接受更改。

    验证失败,并且在包含无效值的 OrderDate 单元格中出现一个错误图标。

  5. 将鼠标指针停留在错误图标之上以查看验证错误。

  6. 关闭窗体。

后续步骤

根据应用程序的要求,在向 n 层应用程序添加验证之后,可能还要执行多个步骤。 例如,可能要对此应用程序进行如下增强:

请参见

概念

数据应用程序开发中的新增功能

其他资源

在 N 层应用程序中使用数据集

分层更新

在 Visual Studio 中访问数据