Chap 12 从数据源中读取
-------------------------------------
1、 .NET Framework提供了一组数据访问技术,叫做ADO.NET,使用它可以很容易地连接数据源、访问数据、显示数据,以及修改数据
2、 使用文件系统,只能保存数据,但不能保存“元数据”。元数据是数据如何组织的信息,即在数据库中数据存储(摆放)的规则
3、 数据库规范化的理念是要尽可能地减少数据冗余。规范化是把数据分解到多个表上,最小化重复相同数据的次数的一个过程
4、 数据库规范化的基本规则是:
(1) 最小化单个表中的冗余数据
(2) 为每组相关数据创建一个单独的实体表
(3) 在每个表中把一个惟一字段指定为主键
5、 面向对象编程(OOP)的主要优点是可以把各种复杂的功能封装在一个自包含的单元中,接着需要处理的就是一个定义好的接口,它由一组方法和属性组成
6、 ADO.NET可以交互的对象:
(1) 企业级RDBMS,如Oracle,SQL Server,DB2
(2) 桌面级数据库,如Access
(3) 文件和目录系统,如Windows FAT32
(4) 用逗号分隔开的文本文件
(5) 非数据库文件,如Excel
(6) MS Exchange的电子邮件数据(有一定限制)
(7) 基于XML的数据源
7、 ADO.NET可以为其他的数据源格式编写供应程序、驱动程序和适配器
8、 在ADO.NET中处理的是断开连接的数据集:在访问者请求数据时建立连接,传送数据,之后关闭连接(说明了关闭连接的位置)。接着,访问者可以修改数据,但这些修改不会在数据源中立即更新(在DataSet中更新)。在用访问者所做的修改更新数据库之前,必须重新打开数据库连接。
9、 使用断开连接的数据可以提高应用程序的效率,并能处理更多的工作负载
10、 数据供应程序(Provider):与数据仓库通信的方式
11、 在ADO.NET中有两个托管的供应程序:Managed Provider for SQL Server和Managed Provider for OLE DB
12、 数据供应程序由4个核心对象组成:Connection对象、Command对象、DataReader对象和DataAdapter对象
13、 ADO.NET对象关系图:
14、 Connection对象:用于连接数据源。它表示数据源和数据使用者之间的连接。使用Connection对象的Open()方法,可以打开在连接字符串当中指定的数据库连接。
15、 连接SQL Server DB的方法:
“server=ITN-LIUDONG;database=Northwind;uid=sa;password=P@ssw0rd”
16、 连接其他OLE DB的方法:
“Provider=Microsoft.Jet.OLEDB.4.0;data source=D:/ DB/Northwind.mdb”
17、 打开数据库连接(Access、SQL Server)的代码示例:
<script runat=server>
void Page_Load()
{
string strConn="Provider=Microsoft.Jet.OleDb.4.0;";
//注意下面一行的@符号不能缺少,起到屏蔽“转义字符”的作用
strConn+=@"Data Source=D:/DB/northwind.mdb";
//--------------------------------------------------------------------------
//若连接SQL Server数据库应使用下面的方式:
//string strConn=”server=ITN-LIUDONG;database=Northwind”;
//strConn+=”uid=sa;password=P@ssw0rd”;
//--------------------------------------------------------------------------
data_src.Text=strConn;
OleDbConnection objConn=new OleDbConnection(strConn);
//--------------------------------------------------------------------------
//上面的实例化语句相当于:
//OleDbConnection objConn=new OleDbConnection();
//objConn.ConnectionString=strConn;
//--------------------------------------------------------------------------
//若连接SQL Server数据库应使用下面的方式:
//SqlConnection objConn=new SqlConnection(strConn);
//--------------------------------------------------------------------------
try
{
objConn.Open();
objConn.Close();
con_close.Text="数据库连接已经关闭";
}
//下面用于捕获数据库连接过程中的错误
catch(Exception e)
{
con_open.Text="数据库连接失败!";
con_close.Text=e.ToString();
}
}
</script>
18、 在这段代码中应注意:
(1) 导入名称空间的指令,SQL Server和一般OLE DB不同
<%@ Import Namespace=”System.Data”%>
<%@ Import Namespace=”System.Data.OleDb”%>
或<%@ Import Namespace=”System.Data.SqlClient”%>
(2) System.Data.OleDb名称空间包含OleDbConnection的一个类定义,用于创建一个Connection对象
19、 Command对象:能够读取和修改数据源。它包含可应用于数据库的所有指令,还可以使用ExecuteReader()方法创建一个DataReader,在表中显示查询结果。
20、 在编写好SQL查询后,需要把它作为一个字符串参数传送给Command对象,这样就可以应用于数据库了
21、 使用DataReader读取数据的代码示例:
D:/Microsoft .Net程序练习/ASP.NET/chap12/rm397_datareader.aspx
22、 在这段代码中应注意:
(1) 无需手工编码进行读取数据时的迭代和换行,只需要一个条件语句while即可,判断条件是while(objDataReader.Read()==true)
(2) 使用的是<div>标记输出数据,因为输出字符串包含了HTML标记,并且必须应用到InnerHTML属性上,而不是InnerText属性上
(3) 在程序最后只关闭了Connection和DataReader对象,没有关闭Command对象,Command对象没有Close()方法
(4) 在ASP.NET中,不必像旧版本ASP那样把对象设置为null。删除无用对象,释放内存的工作是自动进行的。但手动释放资源要比等待自动清空快
23、 将<datagrid>控件绑定在数据源上以后,<datagrid>控件完成如下功能:
(1) 自动把结果格式化到一个(数据)表中,在页面上显示,而无需迭代记录(也不用写while循环!)
(2) 使用<datagrid>控件的各个属性格式化表,如添加一个超链接列,格式化标题和页脚,或改变每行的颜色
(3) 对表中的数据排序
24、 使用<DataGrid>控件的代码示例:
D:/Microsoft .Net程序练习/ASP.NET/chap12/ rm401_execute_reader.aspx
25、 在这段代码中应注意:
(1) 此例没有创建空的DataReader对象,而<DataGrid>控件绑定在DataReader对象上,将DataReader对象作为数据源
(2) ojbComm.ExecuteReader(CommandBehavior.CloseConnection)的作用是在提取完数据,关闭DataReader的时候,自动关闭对应的数据库连接,即OleDbConnection对象
(3) 这里使用了DataGrid对象的属性格式化显示结果
(4) DataReader是从数据库中提取和显示数据的一个非常高效的方式,但不能使用其修改数据。DataReader只能向前循环数据,并且只能处理一个表中的数据
26、 ADO.NET处理的是断开连接的数据,它从数据库中拷贝数据,提供给数据访问程序,在修改完成后再更新数据库
27、 DataTable对象是表的本身;DataSet对象可包含多个表,可建立表之间的关系,把一个表中的一行与另一个表中的一行关联起来;DataAdapter对象用于把结果从Connection对象传递到DataSet,Fill()方法把数据拷贝到DataSet中,Update()方法把DataSet中的数据拷贝回数据源;DataView对象表示DataSet中存储的DataTable的特定视图(整体结构看第13点“ADO.NET对象关系图”)
28、 使用DataSet和DataAdapter的代码示例:
D:/Microsoft .Net程序练习/ASP.NET/chap12/ rm404_datagrid.aspx
29、 在这段代码中应注意:
(1) DataAdapter根据用户的SQL语句查询要求返回的结果写入DataSet当中,作为一个虚拟的表。虚拟的表名可以自己指定
(2) DataSet存储结构化的数据,可以存储多个表和他们之间的关系
(3) 在创建DataView后,必须把DataGrid的数据源设置为DataView,并绑定数据
30、 Microsoft专门为其SQL Server数据库开发了SQL Server版本的ADO.NET对象,分别为SqlConnection、SqlCommand和SqlDataAdapter。这几个对象速度较快,耗费的资源较少
31、 在ASP.NET中可使用.NET提供的一个有效的try…catch机制来捕获异常
32、 错误捕获机制的代码示例:
D:/Microsoft .Net程序练习/ASP.NET/chap12/rm410_datatable_errorcheck.aspx
33、 在这段代码中应注意:
(1) 在使用try…catch结构的时候,需要在结构的外部声明大多数对象。因为与所有C#代码块一样,变量的范围是其声明所在的块,所以在try块中声明的对象就不能应用于catch块中的代码
(2) 在try块中的任何代码在运行失败时,都会创建一个对应于实际引发错误的Exception对象。catch块接收异常,并在后面的代码中处理
(3) 有几种不同类型的catch块,常用的有“一般异常”和“特殊异常”。
(4) 一般异常使用catch(Exception objEx)声明,这表示由.NET运行时生成的任何异常都由catch块处理,这适用于不知道引发了什么类型的异常的情况
(5) 特殊异常使用catch(OleDbException objEx)声明,在处理OLE DB数据源的时候,可以假定可能出现的错误与数据访问有关,OleDbException对象是一种特殊的异常对象,包含了比一般Exception对象更多的(数据库专用)错误信息。但如果异常不是由OLE DB引发的,catch块就不会执行,执行线程就会传送给.NET运行时,导致一个ASP.NET服务器错误