如何:使用 LinqDataSource 控件更新、插入和删除数据
更新:2007 年 11 月
借助于 LinqDataSource 控件,您就可以创建使用户能够更新、插入和删除数据的网页,而不必指定 SQL 命令,因为 LinqDataSource 控件会为这些操作使用动态创建的命令。若要允许用户修改数据,可以在 LinqDataSource 控件上启用更新、插入或删除操作。然后可将该控件连接到一个数据绑定控件,如 DetailsView 或 GridView 控件,以便让用户更新数据。如果希望自定义要更新的值,则可添加参数或创建事件处理程序并动态更改值。
本主题介绍如何使用 LinqDataSource 控件来自动启用更新、插入和删除操作。此外,还介绍了如何自定义要更新的值。最后,本主题演示如何创建事件处理程序以便在插入或更新数据库记录之前以编程方式设置属性。
启用自动更新、插入和删除操作的步骤均相似,本主题的过程演示如何启用所有三个功能。不过,您不必启用所有三个功能,仅启用所需的功能即可。
如果对 LinqDataSource 控件不了解,请参见 LinqDataSource Web 服务器控件概述和演练:使用 LinqDataSource 和 DetailsView 控件检索、更新、插入和删除数据。
自动更新、插入和删除数据
若要启用 LinqDataSource 控件以自动处理数据更新,则以下设置是必需的:
在 ContextTypeName 属性中指定的对象必须派生自 DataContext 类。
一个或多个 EnableUpdate、EnableDelete 或 EnableInsert 属性必须设置为 true。
启用更新、插入和删除数据
向 ASP.NET 网页上添加 LinqDataSource 控件。
将 ContextTypeName 属性设置为派生自 DataContext 类的对象的名称。
当使用 Visual Studio 2008 中的对象关系设计器创建表示 SQL 数据库表的类时,生成的类将自动从 DataContext 派生。
将 TableName 设置为表示关联数据库表的实体类的名称。
将 LinqDataSource 控件的 EnableUpdate、EnableDelete 和 EnableInsert 属性设置为 true。
添加数据绑定控件(如 DetailsView 控件),并将其 DataSourceID 属性设置为 LinqDataSource 控件的 ID。
将数据控件的 DataKeyNames 属性设置为表的一个或多个主键列的名称。
为用户提供在数据绑定控件中切换到更新、删除或编辑模式的方法。
例如,可以向数据绑定控件添加一些按钮或使数据绑定控件能够自动创建这些按钮。
下面的示例演示 ASP.NET 网页的一个部分的声明性标记,此网页部分包含 LinqDataSource 控件和 DetailsView 控件。示例将这两个控件配置为允许用户显示、更新、插入和删除名为 Products 的表中的数据。
<asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" EnableUpdate="true" EnableInsert="true" EnableDelete="true" ID="LinqDataSource1" runat="server"> </asp:LinqDataSource> <asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="ProductID" AutoGenerateEditButton="true" AutoGenerateDeleteButton="true" AutoGenerateInsertButton="true" AllowPaging="true" ID="DetailsView1" runat="server"> </asp:DetailsView>
添加用于更新、插入或删除数据的参数
默认情况下,不必添加用于更新、插入或删除数据的参数。数据绑定控件将它的值传递到 LinqDataSource 控件,然后 LinqDataSource 控件使用这些值来设置相应的属性。LINQ to SQL 创建用于修改数据源的命令。有关更多信息,请参见 LINQ to SQL。
可以指定用于更新、插入或删除操作的参数。当您希望提供默认值或定义是否将空字符串值转换为 null 时,可以执行此操作。您不必为要更新或插入的每个值指定参数,而只需为要自定义的值指定参数。将由 LinqDataSource 控件自动处理未由参数定义的任何值。
LinqDataSource 控件包含以下用于管理参数的集合:UpdateParameters、InsertParameters 和 DeleteParameters。
添加用于更新、插入和删除数据的参数
为每个要修改的值添加参数定义。
下面的示例演示如何为名为 Category 的属性添加一个参数。示例将该参数将添加到 UpdateParameters 和 InsertParameters 集合中。
<asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" EnableUpdate="true" EnableInsert="true" EnableDelete="true" ID="LinqDataSource1" runat="server"> <UpdateParameters> <asp:Parameter Name="Category" DefaultValue="Miscellaneous" /> </UpdateParameters> <InsertParameters> <asp:Parameter Name="Category" DefaultValue="Miscellaneous" /> </InsertParameters> </asp:LinqDataSource>
当用户未为 Category 属性提供值时,将在数据库中保存默认值。
以编程方式设置值
若要在执行数据操作之前以编程方式设置属性,则可以为 LinqDataSource 控件的 Inserting、Updating 和 Deleting 事件创建事件处理程序。任何未在事件处理程序中设置的属性将由 LinqDataSource 控件自动设置。
以编程方式设置值
为 LinqDataSource 控件的 Inserting、Updating 或 Deleting 事件创建事件处理程序。
向以编程方式设置要修改的值的事件处理程序中添加代码。
若要更新、插入或删除的数据包含在以下属性中:
事件
属性
类
所有这些属性都返回一个 Object 类型的对象。可以将从这些属性返回的对象强制转换为表示数据的实体类的类型。完成强制转换后,可以设置该类型的属性。
下面的示例演示 Inserting 事件的事件处理程序,该事件处理程序将 DateModified 列设置为当前日期和时间。示例将 NewObject 属性中的对象强制转换为 Product 类型。
Protected Sub LinqDataSource_Inserting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LinqDataSourceInsertEventArgs) Dim product As Product product = CType(e.NewObject, Product) product.DateModified = DateTime.Now End Sub
protected void LinqDataSource_Inserting(object sender, LinqDataSourceInsertEventArgs e) { Product product = (Product)e.NewObject; product.DateModified = DateTime.Now; }
下面的示例演示 LinqDataSource 控件的声明性标记,该控件将 LinqDataSource_Inserting 方法绑定到 Inserting 事件。
<asp:LinqDataSource ContextTypeName="ExampleDataContext" TableName="Products" OnInserting="LinqDataSource_Inserting" EnableUpdate="true" EnableInsert="true" EnableDelete="true" ID="LinqDataSource1" runat="server"> </asp:LinqDataSource>
编译代码
若要使用 LinqDataSource 控件来更新、插入或删除数据,必须创建表示数据库表的实体类。可通过使用 Visual Studio 2008 中的对象关系设计器来创建实体类。
安全性
此示例包含一个接受用户输入的文本框,该文本框是一个潜在的安全威胁。默认情况下,ASP.NET 网页验证用户输入是否不包括脚本或 HTML 元素。有关更多信息,请参见脚本侵入概述。
有关存储连接字符串的信息,请参见如何:在使用数据源控件时保证连接字符串的安全。
有关不在错误消息中显示敏感信息的信息,请参见如何:显示安全错误信息。