ASP.NET为我们提供了功能非常强大的数据访问、展示、操作的控件合对象,比如GridView、FormView控件,配合强类型的DataSet和ObjectDataSource控件,我们可以很快速的以N层结构来管理开发我们的数据。
本文主要讲解如何结合上述对象高效快速的开发我们的Web数据应用程序,关于它们的具体示例和说明请参考MSDN上相应文档:
使用ASP.NET 2.0 ObjectDataSource控件
下面按步骤说明,在Access数据库中运用上述控件,如有问题请回复。
一,创建解决方案DataAccessingSample以及DataAccessingSample数据库
如下图所示创建Web应用程序:
在App_Data文件夹下创建Access数据库DataAccessingSample.mdb;此数据库包含一个表Notes,即留言表,其结构如下:
二,添加强类型的DataSet
DataSet数据集是数据表DataTable的集合,而强类型的DataSet即是继承自DataTable的强类型的DataTable的集合。在VS中添加强类型DataSet后,会自动的生成强类型的数据表DataTable以及Adaptor用于添加删除数据等,可以直接供ObjectDataSource使用。
在Web应用程序项目下,添加文件夹DAL,即数据访问层。在DAL下添加DataSet名称为NotesData:
打开此数据集,在工具箱中拖拽TableAdaptor,当项目无数据库连接时,会提示创建数据库连接:
点击查询生成器,生成查询:
最终如下:
单击下一步完成。
自此我们的强类型数据集创建完毕了:
查看NotesData.Designer.cs可以看到VS以及自动帮我们生成强类型的数据表,一些相关事件以及TableAdaptor,并且给相应的方法标注了DataObjectMethodAttribute,我们可以直接在ObjectDataSource中使用。
三,在Default,aspx中添加ObjectDataSource,GridView,FormView控件
在页面中添加ObjectDataSource控件命名为ObjectDataSourceNotes,并配置数据源(配置之前请记得生成下项目):
定义数据方法,一般情况下,VS会自动设置TableAdaptor中的对应方法:
点击完成,即可查看到生成的控件标记如下:
<asp:ObjectDataSource ID="ObjectDataSourceNotes" runat="server"
DeleteMethod="Delete" InsertMethod="Insert"
OldValuesParameterFormatString="original_{0}" SelectMethod="GetNotes"
TypeName="DataAccessingSample.DAL.NotesDataTableAdapters.NotesTableAdapter"
UpdateMethod="Update">
<DeleteParameters>
<asp:Parameter Name="Original_NoteID" Type="Int32" />
<asp:Parameter Name="Original_NoteTitle" Type="String" />
<asp:Parameter Name="Original_AddDateTime" Type="DateTime" />
<asp:Parameter Name="Original_NoteUser" Type="String" />
</DeleteParameters>
<InsertParameters>
<asp:Parameter Name="NoteTitle" Type="String" />
<asp:Parameter Name="NoteContent" Type="String" />
<asp:Parameter Name="AddDateTime" Type="DateTime" />
<asp:Parameter Name="NoteUser" Type="String" />
</InsertParameters>
<UpdateParameters>
<asp:Parameter Name="NoteTitle" Type="String" />
<asp:Parameter Name="NoteContent" Type="String" />
<asp:Parameter Name="AddDateTime" Type="DateTime" />
<asp:Parameter Name="NoteUser" Type="String" />
<asp:Parameter Name="Original_NoteID" Type="Int32" />
<asp:Parameter Name="Original_NoteTitle" Type="String" />
<asp:Parameter Name="Original_AddDateTime" Type="DateTime" />
<asp:Parameter Name="Original_NoteUser" Type="String" />
</UpdateParameters>
</asp:ObjectDataSource>
从工具箱中拖拽GridView控件,设置其样式和数据源为刚添加的ObjectDataSource:
此控件的标记代码如下:
<asp:GridView ID="GridViewNotes" runat="server" AllowPaging="True"
AutoGenerateColumns="False" CellPadding="4" DataKeyNames="NoteID"
DataSourceID="ObjectDataSourceNotes" EnableModelValidation="True"
ForeColor="#333333" PageSize="5">
<AlternatingRowStyle BackColor="White" />
<Columns>
<asp:BoundField DataField="NoteID" HeaderText="NoteID" InsertVisible="False"
ReadOnly="True" SortExpression="NoteID" />
<asp:BoundField DataField="NoteTitle" HeaderText="NoteTitle"
SortExpression="NoteTitle" />
<asp:BoundField DataField="NoteContent" HeaderText="NoteContent"
SortExpression="NoteContent" />
<asp:BoundField DataField="AddDateTime" HeaderText="AddDateTime"
SortExpression="AddDateTime" />
<asp:BoundField DataField="NoteUser" HeaderText="NoteUser"
SortExpression="NoteUser" />
<asp:CommandField ShowDeleteButton="True" ShowEditButton="True"
ShowSelectButton="True" />
</Columns>
<EmptyDataTemplate>
还没有留言。
</EmptyDataTemplate>
<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
<RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
<SelectedRowStyle BackColor="#FFCC66" Font-Bold="True" ForeColor="Navy" />
</asp:GridView>
生成项目打开页面,可以看到如下效果,目前尚无记录:
为了方便添加记录,我们在页面中拖拽一个按钮,以及一个FormView控件(数据源亦为ObjectDataSourceNotes),单击此按钮则显示FormView,FormView默认为添加模式,添加完毕后隐藏FormView。
这两个控件标记如下:
<asp:Button ID="ButtonAddNote" runat="server" onclick="ButtonAddNote_Click"
Text="Add Note" />
<br />
<asp:FormView ID="FormViewNotes" runat="server" CellPadding="4"
DataKeyNames="NoteID" DataSourceID="ObjectDataSourceNotes" DefaultMode="Insert"
EnableModelValidation="True" ForeColor="#333333" GridLines="Both"
oniteminserted="FormViewNotes_ItemInserted" Visible="False">
<EditItemTemplate>
NoteID:
<asp:Label ID="NoteIDLabel1" runat="server" Text='<%# Eval("NoteID") %>' />
<br />
NoteTitle:
<asp:TextBox ID="NoteTitleTextBox" runat="server"
Text='<%# Bind("NoteTitle") %>' />
<br />
NoteContent:
<asp:TextBox ID="NoteContentTextBox" runat="server"
Text='<%# Bind("NoteContent") %>' />
<br />
AddDateTime:
<asp:TextBox ID="AddDateTimeTextBox" runat="server"
Text='<%# Bind("AddDateTime") %>' />
<br />
NoteUser:
<asp:TextBox ID="NoteUserTextBox" runat="server"
Text='<%# Bind("NoteUser") %>' />
<br />
<asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True"
CommandName="Update" Text="更新" />
<asp:LinkButton ID="UpdateCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel" Text="取消" />
</EditItemTemplate>
<FooterStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#990000" Font-Bold="True" ForeColor="White" />
<HeaderTemplate>
Add/Modify/View Note
</HeaderTemplate>
<InsertItemTemplate>
NoteTitle:
<asp:TextBox ID="NoteTitleTextBox" runat="server"
Text='<%# Bind("NoteTitle") %>' />
<br />
NoteContent:
<asp:TextBox ID="NoteContentTextBox" runat="server"
Text='<%# Bind("NoteContent") %>' />
<br />
AddDateTime:
<asp:TextBox ID="AddDateTimeTextBox" runat="server"
Text='<%# Bind("AddDateTime") %>' />
<br />
NoteUser:
<asp:TextBox ID="NoteUserTextBox" runat="server"
Text='<%# Bind("NoteUser") %>' />
<br />
<asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True"
CommandName="Insert" Text="插入" />
<asp:LinkButton ID="InsertCancelButton" runat="server"
CausesValidation="False" CommandName="Cancel"
onclick="InsertCancelButton_Click" Text="取消" />
</InsertItemTemplate>
<ItemTemplate>
NoteID:
<asp:Label ID="NoteIDLabel" runat="server" Text='<%# Eval("NoteID") %>' />
<br />
NoteTitle:
<asp:Label ID="NoteTitleLabel" runat="server" Text='<%# Bind("NoteTitle") %>' />
<br />
NoteContent:
<asp:Label ID="NoteContentLabel" runat="server"
Text='<%# Bind("NoteContent") %>' />
<br />
AddDateTime:
<asp:Label ID="AddDateTimeLabel" runat="server"
Text='<%# Bind("AddDateTime") %>' />
<br />
NoteUser:
<asp:Label ID="NoteUserLabel" runat="server" Text='<%# Bind("NoteUser") %>' />
<br />
<asp:LinkButton ID="EditButton" runat="server" CausesValidation="False"
CommandName="Edit" Text="编辑" />
<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False"
CommandName="Delete" Text="删除" />
<asp:LinkButton ID="NewButton" runat="server" CausesValidation="False"
CommandName="New" Text="新建" />
</ItemTemplate>
<PagerStyle BackColor="#FFCC66" ForeColor="#333333" HorizontalAlign="Center" />
<RowStyle BackColor="#FFFBD6" ForeColor="#333333" />
</asp:FormView>
Code-Behind代码如下:
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace DataAccessingSample
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void ButtonAddNote_Click(object sender, EventArgs e)
{
this.FormViewNotes.Visible = true;
}
protected void InsertCancelButton_Click(object sender, EventArgs e)
{
this.FormViewNotes.Visible = false;
}
protected void FormViewNotes_ItemInserted(object sender, FormViewInsertedEventArgs e)
{
this.FormViewNotes.Visible = false;
}
}
}
最终页面运行如下,点击AddNote按钮,添加一些测试记录:
至此,我们的程序就完成了,不过细心的朋友可能会发现,在更新、删除的时候会出现一些无法删除的情况,至于为什么会出现这样的情况,可以仔细去查看生成的TableAdaptor类。
在DataSet中添加一个DeleteNote的方法,这个删除方法只传递一个删除的NoteID参数,重新设置ObjectDataSource即可:
<DeleteParameters>
<asp:Parameter Name="NoteID" Type="Int32" />
</DeleteParameters>
ObjectDataSource的属性设置为OldValuesParameterFormatString="{0}"而非OldValuesParameterFormatString="Original_{0}",为什么要这么做,大家可以思考下,因为我自己添加的删除方法的时候只有一个参数,否则就会找不到对应的方法了。
同理这样修改后,对于更新方法Update也需要自己手动的添加,否则也会出现类似下面的错误:
ObjectDataSource“ObjectDataSourceNotes”未能找到带参数的非泛型方法“Update”: NoteTitle, NoteContent, AddDateTime, NoteUser, Original_NoteID, Original_NoteTitle, Original_AddDateTime, Original_NoteUser, NoteID。
至于为什么VS自动生成的方法对于本文的Access数据库不适用了,可以详情参考自动生成的代码。
经过这样修改后,在页面测试删除成功(第二条已经删除掉):
如果需要本文的源码,请回复你的邮件,我会尽快发送到你的邮箱,谢谢。
本文为原创文章,如需转载,请注明转载地址,谢谢。