第 13 章 服务器端数据访问0.docx
- 文档编号:4884941
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:76
- 大小:131.35KB
第 13 章 服务器端数据访问0.docx
《第 13 章 服务器端数据访问0.docx》由会员分享,可在线阅读,更多相关《第 13 章 服务器端数据访问0.docx(76页珍藏版)》请在冰豆网上搜索。
第13章服务器端数据访问0
第13章服务器端数据访问
13.1服务器端数据介绍
数据访问是任何实际应用程序的核心部分,而ASP.NET提供了一套丰富的控件,这些控件与公共语言运行库中提供的托管数据访问API很好地集成在一起。
本节多次演练同一个示例,该示例使用ASP.NETDataGrid控件绑定到SQL查询的结果和XML数据文件。
本节假定您熟悉数据库基础知识和SQL查询语言。
服务器端数据访问很独特,因为Web页基本上是无状态的。
当试图执行事务时,如插入或更新从数据库检索的数据集中的记录时,这向我们提出了某些困难的挑战。
正如将在本节中看到的,DataGrid控件可以帮助应付这些挑战,使您得以更多地集中在应用程序逻辑上,对状态管理和事件处理的具体细节则不用考虑太多。
13.2连接、命令和数据集
公共语言运行库为数据密集的应用程序开发提供了完整的托管数据访问API集。
这些API帮助抽象数据并用一致的方法表示数据,与实际的数据源(SQLServer、OLEDB、XML等)无关。
最常使用的对象基本上有三种:
连接、命令和数据集。
∙连接表示与某些数据存储区(如SQLServer或XML文件)的物理连接。
∙命令表示从数据存储区检索(选择)或对数据存储区进行操作(插入、更新、删除)的指令。
∙数据集表示应用程序使用的实际数据。
注意,数据集总是同它们的源连接和数据模型断开并可独立修改。
不过,数据集的更改可以很容易与起始数据模型相协调。
13.3访问基于SQL的数据
应用程序一般需要对SQL数据库执行一个或多个选择、插入、更新或删除查询。
下表显示上述每个查询的示例。
查询
示例
简单选择
SELECT*fromEmployeesWHEREFirstName='Bradley';
联接选择
SELECT*fromEmployeesE,ManagersMWHEREE.FirstName=M.FirstName;
插入
INSERTintoEmployeesVALUES('123-45-6789','Bradley','Millington','ProgramManager');
更新
UPDATEEmployeesSETTitle='DevelopmentLead'WHEREFirstName='Bradley';
删除
DELETEfromEmployeesWHEREProductivity<10;
为了使页能够访问执行SQL数据访问所需的类,必须将System.Data和System.Data.SqlClient命名空间导入到页中。
<%@ImportNamespace="System.Data"%>
<%@ImportNamespace="System.Data.SqlClient"%>
若要对SQL数据库执行选择查询,请创建与数据库的SqlConnection,传递连接字符串,然后构造包含查询语句的SqlDataAdapter对象。
若要用查询结果填充DataSet对象,请调用命令的Fill方法。
SqlConnectionmyConnection=newSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
SqlDataAdaptermyCommand=newSqlDataAdapter("select*fromAuthors",myConnection);
DataSetds=newDataSet();
myCommand.Fill(ds,"Authors");
DimmyConnectionAsNewSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes")
DimmyCommandAsNewSqlDataAdapter("select*fromAuthors",myConnection)
DimdsAsNewDataSet()
myCommand.Fill(ds,"Authors")
varmyConnection:
SqlConnection=newSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
varmyCommand:
SqlDataAdapter=newSqlDataAdapter("select*fromAuthors",myConnection);
vards:
DataSet=newDataSet();
myCommand.Fill(ds,"Authors");
使用数据集的好处是它为您提供了断开连接的数据库视图。
可以在应用程序中操作数据集,然后在以后协调更改和实际的数据库。
对于长期运行的应用程序,这通常是最好的方法。
对于Web应用程序,通常对每个请求执行短操作(一般只是显示数据)。
通常不需要在一系列请求间保持DataSet对象。
对于这类情况,可以使用SqlDataReader。
SqlDataReader对从SQL数据库检索的数据提供仅向前的只读指针。
若要使用SqlDataReader,请声明SqlCommand而不是SqlDataAdapter。
SqlCommand公开返回SqlDataReader的ExecuteReader方法。
还请注意,当使用SqlCommand时,必须显式打开和关闭SqlConnection。
调用ExecuteReader后,SqlDataReader可以绑定到ASP.NET服务器控件。
SqlConnectionmyConnection=newSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
SqlCommandmyCommand=newSqlCommand("select*fromAuthors",myConnection);
myConnection.Open();
SqlDataReaderdr=myCommand.ExecuteReader();
myConnection.Close();
DimmyConnectionAsSqlConnection=NewSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes")
DimmyCommandAsSqlCommand=NewSqlCommand("select*fromAuthors",myConnection)
myConnection.Open()
DimdrAsSqlDataReader=myCommand.ExecuteReader()
...
myConnection.Close()
varmyConnection:
SqlConnection=newSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
varmyCommand:
SqlCommand=newSqlCommand("select*fromAuthors",myConnection);
myConnection.Open();
vardr:
SqlDataReader;
dr=myCommand.ExecuteReader();
...
myConnection.Close();
当执行不要求返回数据的命令(如插入、更新和删除)时,也使用SqlCommand。
该命令通过调用ExecuteNonQuery方法发出,而该方法返回受影响的行数。
注意当使用SqlCommand时,必须显式打开连接;SqlDataAdapter自动为您处理如何打开连接。
SqlConnectionmyConnection=newSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
SqlCommandmyCommand=newSqlCommand(
"UPDATEAuthorsSETphone='(800)555-5555'WHEREau_id='123-45-6789'",
myConnection);
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
DimmyConnectionAsNewSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes")
DimmyCommandAsNewSqlCommand(_
"UPDATEAuthorsSETphone='(800)555-5555'WHEREau_id='123-45-6789'",_
myConnection)
myCommand.Connection.Open()
myCommand.ExecuteNonQuery()
myCommand.Connection.Close()
varmyConnection:
SqlConnection=newSqlConnection("server=(local)\NetSDK;database=pubs;Trusted_Connection=yes");
varmyCommand:
SqlCommand=newSqlCommand(
"UPDATEAuthorsSETphone='(800)555-5555'WHEREau_id='123-45-6789'",
myConnection);
myCommand.Connection.Open();
myCommand.ExecuteNonQuery();
myCommand.Connection.Close();
重要说明:
始终记住在页完成执行之前关闭与数据模型的连接。
如果不关闭连接,则可能会在等待页实例被垃圾回收处理期间不经意地超过连接限制。
13.4将SQL数据绑定到DataGrid
下面的示例显示一个绑定到DataGrid控件的简单选择查询。
DataGrid呈现包含SQL数据的表。
C#DataGrid1.aspx
例:
<%@ImportNamespace="System.Data"%>
<%@ImportNamespace="System.Data.SqlClient"%>
protectedvoidPage_Load(Objectsender,EventArgse){
SqlConnectionmyConnection=newSqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes");
SqlCommandmyCommand=newSqlCommand("select*fromAuthors",myConnection);
myConnection.Open();
SqlDataReaderdr=myCommand.ExecuteReader();
MyDataGrid.DataSource=dr;
MyDataGrid.DataBind();
myConnection.Close();
}
DataGrid控件的简单选择
DataGridid="MyDataGrid"runat="server" Width="700" BackColor="#ccccff" BorderColor="black" ShowFooter="false" CellPadding=3 CellSpacing="0" Font-Name="宋体" Font-Size="8pt" HeaderStyle-BackColor="#aaaadd" EnableViewState="false" /> 与“数据绑定”节中显示的DropDownList一样,DataGrid控件也支持DataSource属性。 该属性除了采用DataSet外,还采用IEnumerable或ICollection。 可以通过将DataSet中包含的表的DefaultView属性分配给希望在DataSet中使用的表名来使用DataSet。 DefaultView属性表示DataSet中表的当前状态,包括应用程序代码所做的任何更改(例如,行删除或值更改)。 设置了DataSource属性后,调用DataBind()填充控件。 MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); MyDataGrid.DataSource=ds.Tables("Authors").DefaultView MyDataGrid.DataBind() MyDataGrid.DataSource=ds.Tables["Authors"].DefaultView; MyDataGrid.DataBind(); 替换语法是同时指定DataSource和DataMember。 这种情况下,ASP.NET自动为您获取DefaultView。 还可以直接绑定到SqlDataReader。 这种情况下只是显示数据,因此SqlDataReader的仅向前特性非常适合此方案,而您则从SqlDataReader提供的性能提升获益。 C#DataGrid1.1.aspx 例: <%@ImportNamespace="System.Data"%> <%@ImportNamespace="System.Data.SqlClient"%> protectedvoidPage_Load(Objectsender,EventArgse){ SqlConnectionmyConnection=newSqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); SqlCommandmyCommand=newSqlCommand("select*fromAuthors",myConnection); myConnection.Open(); SqlDataReaderdr=myCommand.ExecuteReader(); MyDataGrid.DataSource=dr; MyDataGrid.DataBind(); myConnection.Close(); }
DataGrid控件的简单选择
DataGridid="MyDataGrid"runat="server" Width="700" BackColor="#ccccff" BorderColor="black" ShowFooter="false" CellPadding=3 CellSpacing="0" Font-Name="宋体" Font-Size="8pt" HeaderStyle-BackColor="#aaaadd" EnableViewState="false" /> 13.4执行参数化选择 也可以使用SqlDataAdapter对象执行参数化选择。 下面的示例显示可以如何修改使用从selectHtmlControl传递的值所选择的数据。 C#DataGrid2.aspx 例: <%@ImportNamespace="System.Data"%> <%@ImportNamespace="System.Data.SqlClient"%> publicvoidGetAuthors_Click(Objectsender,EventArgsE) { StringselectCmd="select*fromAuthorswherestate=@State"; SqlConnectionmyConnection=newSqlConnection("server=(local)\\NetSDK;database=pubs;Trusted_Connection=yes"); SqlDataAdaptermyCommand=newSqlDataAdapter(selectCmd,myConnection); myCommand.SelectCommand.Parameters.Add(newSqlParameter("@State",SqlDbType.NVarChar,2)); myCommand.SelectCommand.Parameters["@State"].Value=MySelect.Value; DataSetds=newDataSet(); myCommand.Fill(ds,"作者"); MyDataGrid.DataSource=ds.Tables["作者"].DefaultView; MyDataGrid.DataBind(); } 10.5pt宋体"> 选择州: DataGridid="MyDataGrid"runat="server" Width="700" BackColor="#ccccff" BorderColor="black" ShowFooter="false" CellPadding=3 CellSpacing="0" Font-Name="宋体" Font-Size="8pt" HeaderStyle-BackColor="#aaaadd" EnableViewState="false" />