演练:使用 LinqDataSource 和 DetailsView 控件检索、更新、插入和删除数据
更新:2007 年 11 月
在本演练中,您将创建一个简单的数据库表和一个使用 LinqDataSource 控件的网页。用户可以通过该网页在数据库表中检索、更新、插入和删除数据。您将使用 DetailsView 控件来显示数据。通过使用 LinqDataSource 控件,无需编写 Select、Update、Insert 或 Delete 语句即可执行所有这些操作。
您将使用对象关系设计器来创建一个表示包含值的数据库表的类。LinqDataSource 控件将与创建的上述类交互以检索、更新、插入和删除数据。
先决条件
若要在您自己的开发环境中实现这些过程,您需要:
Visual Studio 2008 或 Visual Web Developer 速成版
在计算机上安装 SQL Server Express Edition。如果已经安装了 SQL Server,则可以改用 SQL Server,但您必须对某些过程进行小的调整。
ASP.NET 网站。
创建数据库表
若要执行本演练中的这些步骤,您必须有一个数据库表。如果没有表,则可以使用下面的过程创建一个。如果使用现有的表,某些过程中的步骤将会与您的数据库不完全匹配。不过,在演练中阐释的概念是相同的。
创建数据库表
如果网站上还没有 App_Data 文件夹,则在“解决方案资源管理器”中右击相应的项目,再单击“添加 ASP.NET 文件夹”,然后单击“App_Data”。
右击 App_Data 文件夹,然后单击“添加新项”。
在“已安装的模板”下选择“SQL 数据库”,将文件名更改为 Reviews.mdf,然后单击“添加”。
在服务器资源管理器中,打开 Reviews.mdf 节点,然后右击“表”文件夹。
单击“添加新表”。
在表中创建以下列:
列名
数据类型
属性
MovieID
int
IsIdentity = Yes
不为 null
主键
Title
nvarchar(50)
Theater
nvarchar(50)
Review
nvarchar(1000)
Score
int
不为 null
保存该表并将其命名为 MovieReviews。
使用示例数据向 MovieReviews 表添加几条记录。
在“服务器资源管理器”中右击 MovieReviews 表,然后单击“显示表数据”。不必为 MovieID 指定值,因为该值由数据库生成。
创建表示数据库实体的类
若要使用 LinqDataSource 控件,请使用表示数据库实体的类。可以使用 Visual Studio 2008 或 Visual Web Developer 速成版中的工具创建这些类。
创建 MovieReviews 表的类
如果网站上还没有 App_Code 文件夹,请在“解决方案资源管理器”中右击相应的项目,再单击“添加 ASP.NET 文件夹”,然后单击“App_Code”。
右击 App_Code 文件夹,然后单击“添加新项”。
在“已安装的模板”下选择“Linq to SQL 类”模板,重命名 Reviews.dbml 文件,然后单击“添加”。
此时将显示“对象关系设计器”。
在服务器资源管理器中,将 MovieReviews 表拖动到“对象关系设计器”窗口中。
MovieReviews 表及其列在设计器窗口中由名为 MovieReview 的实体表示。
保存 Reviews.dbml 文件。
在解决方案资源管理器中,打开 Reviews.designer.cs 或 Reviews.designer.vb 文件。
请注意,此时该文件已包含 ReviewsDataContext 和 MovieReview 的类。ReviewsDataContext 类表示数据库,而 MovieReview 类表示数据库表。ReviewsDataContext 类的无参数构造函数从 Web.config 文件读取连接字符串。
打开 Web.config 文件。
注意,已在 connectionStrings 元素中添加了连接字符串。
关闭类文件和 Web.config 文件。
创建和配置 LinqDataSource 控件
由于已经有了一个数据库表和表示数据库实体的类,现在便可以使用 ASP.NET 网页上的 LinqDataSource 控件来管理数据。
创建和配置 LinqDataSource 控件
在 Visual Studio 中,创建一个新的 ASP.NET 网页并切换到“设计”视图。
从“工具箱”的“数据”选项卡中,将 LinqDataSource 控件拖动到网页的 form 元素内。
可以将 ID 属性保留为 LinqDataSource1。
将 ContextTypeName 属性设置为 ReviewsDataContext。
将 TableName 属性设置为 MovieReviews。
将 AutoPage 设置为 true 并切换到“源”视图。
下面的示例演示 LinqDataSource 控件的声明性标记。
<asp:LinqDataSource ContextTypeName="ReviewsDataContext" TableName="MovieReviews" AutoPage="true" ID="LinqDataSource1" runat="server"> </asp:LinqDataSource>
请注意,您不必为选择数据指定任何数据库命令。
添加显示数据的控件
现在可以添加 DetailsView 控件并将其绑定到 LinqDataSource 控件。DetailsView 控件使用户能够查看由 LinqDataSource 控件管理的数据。
将来自 LinqDataSource 的数据连接到 DetailsView
在“工具箱”的“数据”选项卡中,双击 DetailsView 控件以将其添加到页面中。
可以将 ID 属性保留为 DetailsView1。
将 DataSourceID 属性设置为 LinqDataSource1。
将 DataKeyNames 属性设置为 MovieID。
将 AllowPaging 设置为 true。
下面的示例演示 DetailsView 控件的声明性标记。
<asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="MovieID" AllowPaging="true" ID="DetailsView1" runat="server"> </asp:DetailsView>
保存更改,然后按 Ctrl+F5 在浏览器中查看页面。
DetailsView 控件将显示 MovieReviews 表中的当前记录的值。DetailsView 控件将自动创建 Web 控件以显示数据库表中的每个列。
使用户能够更新、插入和删除数据
LinqDataSource 控件可以创建用于更新、插入和删除数据的命令。
启用更新、插入和删除操作
在 LinqDataSource 控件中,将 EnableUpdate、EnableInsert 和 EnableDelete 属性设置为 true。
下面的示例演示 LinqDataSource 控件的声明性标记。
<asp:LinqDataSource ContextTypeName="ReviewsDataContext" TableName="MovieReviews" AutoPage="true" EnableUpdate="true" EnableInsert="true" EnableDelete="true" ID="LinqDataSource1" runat="server"> </asp:LinqDataSource>
在 DetailsView 控件中,将 AutoGenerateEditButton、AutoGenerateInsertButton 和 AutoGenerateDeleteButton 属性设置为 true。
若要限制在 DetailsView 控件中显示哪些字段并设置这些字段的顺序,请将 AutoGenerateRows 属性设置为 false。
为"Title"、"Theater"、"Score"和"Review"列添加字段,并将这些字段绑定到对应的数据字段。
下面的示例演示 DetailsView 控件的声明性标记。
<asp:DetailsView DataSourceID="LinqDataSource1" DataKeyNames="MovieID" AutoGenerateRows="false" AutoGenerateEditButton="true" AutoGenerateInsertButton="true" AutoGenerateDeleteButton="true" AllowPaging="true" ID="DetailsView1" runat="server"> <Fields> <asp:BoundField HeaderText="Title" DataField="Title" /> <asp:BoundField HeaderText="Theater" DataField="Theater" /> <asp:BoundField HeaderText="Number of Stars" DataField="Score" /> <asp:BoundField HeaderText="Review" DataField="Review" /> </Fields> </asp:DetailsView>
MovieID 列将随其他列一起从数据源进行选择。但是,在 DetailsView 控件中不会显示该列,并且用户将不能修改它的值。必须选择 MovieID 属性才能使 LinqDataSource 控件可以自动创建用于更新、插入和删除数据的命令。
请注意,您不必为这些数据操作指定命令。
保存更改,然后按 Ctrl+F5 在浏览器中查看页面。
DetailsView 控件将显示 MovieReviews 表中当前记录的字段。通过在 DetailsView 控件上单击对应的按钮,可以更新、插入和删除记录。
后续步骤
此演练演示了使用 LinqDataSource 控件来更新、插入和删除记录的基本功能。若要了解 LinqDataSource 控件的其他功能,可执行下列操作:
通过为 Where 属性指定值,可以筛选返回的数据记录。通过为 Select 属性指定值,还可以仅选择列的子集。有关更多信息,请参见演练:使用 LinqDataSource 和 GridView 控件选择和筛选数据子集。
为确保数据库中的数据在由网页读取之后未发生更改,LinqDataSource 控件将存储所有选定数据的原始值。将更新发送到 Web 服务器时,LinqDataSource 对象会将每个存储的字段与数据库中的当前值进行比较。如果二者匹配,则表明记录尚未经过更改,LinqDataSource 对象将更新或删除该记录。存储所有原始列值会造成效率低下。若要避免此问题,可以向数据库表添加一个 timestamp 列。有关更多信息,请参见演练:对 LinqDataSource 控件使用时间戳以检查数据完整性。