使用数据源控件修改数据
更新:2007 年 11 月
数据源控件极大地扩展了 ListView、GridView、FormView 和 DetailsView 等数据绑定控件的功能,使您无需另外编写大量代码即可修改数据源的数据。数据修改由数据源控件执行,这样数据绑定控件无需有关数据库或其他数据源的特定信息即可支持更新。您可以将不同的数据源控件与页上的任意控件组合一起使用。另外,您还可以更改数据绑定控件所使用的数据库或数据源,方法是将它的 DataSourceID 更改为指向另一个数据源控件。
数据修改命令
可以对 ObjectDataSource、SqlDataSource 和 AccessDataSource 控件配置用来在其关联数据存储区中插入、更新和删除数据的数据命令。
在使用 LinqDataSource 控件修改数据时,无需提供用于插入、更新和删除数据的命令。这些命令会自动为您生成。
使用 LinqDataSource 控件修改数据
通过将 EnableInsert、EnableUpdate 和 EnableDelete 属性设置为 true,可以使用 LinqDataSource 控件启用插入、更新和删除操作。当这些属性为 true 时,LinqDataSource 控件会使用 LINQ to SQL 自动创建用于修改数据的命令。
下面的示例演示了一个 LinqDataSource 控件,其 EnableInsert、EnableUpdate 和 EnableDelete 均已设置为 true。DetailsView 控件用于显示数据并为每个命令创建一个按钮,以供用户在修改数据时使用。
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="Products"
EnableUpdate="true"
EnableInsert="true"
EnableDelete="true"
ID="LinqDataSource1"
runat="server">
</asp:LinqDataSource>
<asp:DetailsView
DataKeyNames="ProductID"
AutoGenerateEditButton="true"
AutoGenerateDeleteButton="true"
AutoGenerateInsertButton="true"
AllowPaging="true"
DataSourceID="LinqDataSource1"
ID="GridView1"
runat="server">
</asp:DetailsView>
<asp:LinqDataSource
ContextTypeName="ExampleDataContext"
TableName="Products"
EnableUpdate="true"
EnableInsert="true"
EnableDelete="true"
ID="LinqDataSource1"
runat="server">
</asp:LinqDataSource>
<asp:DetailsView
DataKeyNames="ProductID"
AutoGenerateEditButton="true"
AutoGenerateDeleteButton="true"
AutoGenerateInsertButton="true"
AllowPaging="true"
DataSourceID="LinqDataSource1"
ID="GridView1"
runat="server">
</asp:DetailsView>
用 ObjectDataSource 控件修改数据
使用 ObjectDataSource 控件,可以指定用来执行特定类型更新的数据对象方法。InsertMethod 属性指定当 ObjectDataSource 控件向数据源中插入项时所调用的数据对象方法。同样,UpdateMethod 属性指定用于更新项的数据对象方法,DeleteMethod 属性指定用于从数据源中删除项的方法。
下面的代码示例演示 ObjectDataSource 控件,该控件的 InsertMethod、UpdateMethod 和 DeleteMethod 属性是用基础数据对象中的方法名配置的。
<asp:ObjectDataSource
ID="EmployeeDetailsObjectDataSource"
runat="server"
TypeName="Samples.AspNet.Controls.NorthwindEmployee"
SelectMethod="GetEmployee"
UpdateMethod="UpdateEmployee"
DeleteMethod="DeleteEmployee"
InsertMethod="InsertEmployee"
OnInserted="EmployeeDetailsObjectDataSource_OnInserted" >
<SelectParameters>
<asp:Parameter Name="EmployeeID" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="NewEmployeeID" Direction="Output"
Type="Int32" DefaultValue="0" />
</InsertParameters>
</asp:ObjectDataSource>
<asp:ObjectDataSource
ID="EmployeeDetailsObjectDataSource"
runat="server"
TypeName="Samples.AspNet.Controls.NorthwindEmployee"
SelectMethod="GetEmployee"
UpdateMethod="UpdateEmployee"
DeleteMethod="DeleteEmployee"
InsertMethod="InsertEmployee"
OnInserted="EmployeeDetailsObjectDataSource_OnInserted" >
<SelectParameters>
<asp:Parameter Name="EmployeeID" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="NewEmployeeID" Direction="Output"
Type="Int32" DefaultValue="0" />
</InsertParameters>
</asp:ObjectDataSource>
有关更多信息,请参见创建 ObjectDataSource 控件源对象。
用 SQL 命令修改数据
使用 SqlDataSource 和 AccessDataSource 控件可以提供用来在数据源修改数据的 SQL 命令。InsertCommand 属性指定用来向数据源中插入记录的 SQL 命令。同样,UpdateCommand 属性指定用于更新记录的命令,DeleteCommand 属性指定用于从数据源中删除记录的命令。
下面的代码示例演示 SqlDataSource 控件,它的 InsertCommand、UpdateCommand 和 DeleteCommand 属性配置为用来执行更新任务的 SQL 命令。
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
</asp:sqlDataSource>
<asp:sqlDataSource ID="EmployeeDetailsSqlDataSource"
SelectCommand="SELECT EmployeeID, LastName, FirstName FROM Employees WHERE EmployeeID = @EmpID"
InsertCommand="INSERT INTO Employees(LastName, FirstName) VALUES (@LastName, @FirstName);
SELECT @EmpID = SCOPE_IDENTITY()"
UpdateCommand="UPDATE Employees SET LastName=@LastName, FirstName=@FirstName
WHERE EmployeeID=@EmployeeID"
DeleteCommand="DELETE Employees WHERE EmployeeID=@EmployeeID"
ConnectionString="<%$ ConnectionStrings:NorthwindConnection %>"
OnInserted="EmployeeDetailsSqlDataSource_OnInserted"
RunAt="server">
<SelectParameters>
<asp:Parameter Name="EmpID" Type="Int32" DefaultValue="0" />
</SelectParameters>
<InsertParameters>
<asp:Parameter Name="EmpID" Direction="Output" Type="Int32" DefaultValue="0" />
</InsertParameters>
</asp:sqlDataSource>
有关更多信息,请参见 使用 SqlDataSource 控件修改数据。
参数
通过使用参数来传递要在数据存储区中插入、更新或删除的值,可以使数据更新方案更灵活更安全。参数值可以包括页上控件的值、ASP.NET 应用程序变量、会话值等。
参数值通常来自正在调用更新、插入或删除操作的数据绑定控件。另外,您还可以针对给定操作为数据源控件创建显式参数对象,这样您便可以自定义参数。例如,可以使用显式参数对象来指定参数的类型或方向,或者,可以定义当传递的是 null 值时所用的默认参数值。
对于 ObjectDataSource 控件,当调用基础数据对象的相应方法时,参数值作为变量传递。对于 SqlDataSource 或 AccessDataSource 控件,参数将传递到用于执行更新的 SQL 命令。有关更多信息和示例,请参见 对数据源控件使用参数。
事件
数据源控件在数据修改之前和之后都会引发事件。可以使用这些事件在数据操作发生之前执行代码(包括取消操作)和之后执行代码。例如,可以使用 SqlDataSource 控件的 Deleting 事件记录有关要删除的记录的信息。还可以使用 SqlDataSource 控件的 Inserted 事件来检索为新插入的记录自动生成的标识值。