48
1 5 .NET 数数数数数

5 .NET 数据库开发

  • Upload
    storm

  • View
    225

  • Download
    0

Embed Size (px)

DESCRIPTION

5 .NET 数据库开发. 主要内容. 5.1 ADO.NET 基础 5.2 使用 ADO.NET 进行数据库开发 5.3 一个示例. 5.1.1 数据访问发展简述. 1 . ODBC 在 20 世纪 90 年代初, Microsoft 和其他几家公司都开发了 ODBC ( Open Database Connectivity ,开放数据库连接)。它提供了一个公共数据访问层,可用来访问几乎所有的 RDBMS ( Relational Database Management System ,关系型数据管理系统 ) , - PowerPoint PPT Presentation

Citation preview

Page 1: 5 .NET 数据库开发

1

5 .NET 数据库开发

Page 2: 5 .NET 数据库开发

2

主要内容 5.1 ADO.NET 基础 5.2 使用 ADO.NET 进行数据库开发 5.3 一个示例

Page 3: 5 .NET 数据库开发

3

5.1.1 数据访问发展简述

1 . ODBC 在 20 世纪 90 年代初, Microsoft 和其他几家公

司都开发了 ODBC ( Open Database Connectivity ,开放数据库连接)。它提供了一个公共数据访问层,可用来访问几乎所有的RDBMS ( Relational Database Management System ,关系型数据管理系统 ) ,

ODBC 最重要的特性是,它是一个开放标准,甚至己被开放源代码团体广泛采用。

Page 4: 5 .NET 数据库开发

4

5.1.1 数据访问发展简述 (2)

2 . DAO(Data Access Objects) DAO 提供了一个可与 Jet 交互的简单对象

模型, Jet 是 Microsoft Access 桌面数据库的数据库引擎。

3 . RDO(Remote Data Object) RDO 提供了一个与 DAO 相似的简单对象

模型,该模型专门用于访问 ODBC 数据源,RDO 实质上是 ODBC API 上的一个薄层。

Page 5: 5 .NET 数据库开发

5

5.1.1 数据访问发展简述 (3)

4 . OLE DB (Object Linking and Embedding, Database)OLE DB 提供者实现了一组 COM 接口,它可

访问标准行 / 列格式的数据。5 . ADO

ADO ( ActiveX Data Objects , ActiveX 数据对象) ADO 只是一个 OLE DB 客户──它是一个薄层,允许用户使用诸如 VB 和脚本语言等高级语言通过简单对象模型来访问 OLE DB数据源。

Page 6: 5 .NET 数据库开发

6

5.1.2 ADO.NET 简介 ADO.NET 优于从 .NET 中调用 ADO 的特

点:1 .使用管理类的优点2 .跨语言支持3 .更清晰的结构4 . XML 支持5 .优化的对象模型

Page 7: 5 .NET 数据库开发

7

5.1.3 ADO.NET 体系结构 ADO.NET 对象模型由两个基本组件组成:

一个是数据集( DataSet )另一个是 .NET Framework 数据提供者 (.NET

Framework data provider)

Page 8: 5 .NET 数据库开发

8

.NET Framework数据提供者 每个提供者都位于 System.Data 命名空间内的一

个命名空间中,并且由许多类构成。提供者可以为任何数据源编写 .NET Framework 数据提供程序。

.NET Framework 提供了四个 .NET Framework数据提供者: SQL Server (System.Data.SqlClient) OLE DB (System.Data.OleDb) ODBC (System.Data.Odbc) Oracle (System.Data.OracleClient)

Page 9: 5 .NET 数据库开发

9

数据提供者对象 Connection 对象──提供与数据源的连接。 Command 对象──能够访问用于返回数据、修改

数据、运行存储过程以及发送或检索参数信息的数据库命令。

DataReader 对象──从数据源中提供高性能的数据流,是一个已连接的、前向只读结果集。

DataAdapter 对象──提供连接 DataSet 对象和数据源的桥梁。 DataAdapter 使用 Command 对象在数据源中执行 SQL 命令,以便将数据加载到DataSet 中,并使对 DataSet 中数据的更改与数据源保持一致。

Page 10: 5 .NET 数据库开发

10

5.1.4 建立与数据库的连接 操作一个 Access数据库:string myConnString =

"server=localhost;database=Northwind;uid=sa;pwd=;";

SqlConnection myConn = new SqlConnection(myConnString);

myConn.Open();//Do something usefulmyConn.Close();

Page 11: 5 .NET 数据库开发

11

ODBC 方式 配置 ODBC 数据源

控制面板 -> 管理工具 -> 数据源 (ODBC)-> 系统 DSN

Page 12: 5 .NET 数据库开发

12

ODBC 方式连接字符串string connectString = @"Provider=System.Data.Odbc;"; connectString += "Dsn=PostgreSQL35W;database=postgres;"; connectString += "server=localhost;port=5432;"; connectString += "uid=test;pwd=123456";

Page 13: 5 .NET 数据库开发

13

获取连接字符串

Page 14: 5 .NET 数据库开发

14

Toolbox->BindingSource

Page 15: 5 .NET 数据库开发

15

Properties->DataSource

Page 16: 5 .NET 数据库开发

16

查看连接字符串

Page 17: 5 .NET 数据库开发

17

主要内容 5.1 ADO.NET 基础 5.2 使用 ADO.NET 进行数据库开发 5.3 一个示例

Page 18: 5 .NET 数据库开发

18

5.2.1 数据库查询 1.创建 Command对象string strConn,strSQL;strConn =

"server=localhost;database=Northwind;uid=sa;pwd=;";

strSQL = "select CustomerID,CompanyName from Customers";

SqlConnection myConn = new SqlConnection(strConn);myConn.Open();SqlCommand cmd;

Page 19: 5 .NET 数据库开发

19

5.2.1 数据库查询 1.创建 Command对象 // 第一种方式cmd = myConn.CreateCommand();cmd.CommandText = strSQL;

// 第二种方式cmd = new SqlCommand();cmd.CommandText = strSQL;cmd.Connection = myConn;

// 第三种方式Cmd = new SqlCommand(strSQL,myConn);

Page 20: 5 .NET 数据库开发

20

5.2.1 数据库查询 2.执行无返回行的查询 不返回结果集的查询通常称为操作查询

( action query ),操作查询有两种主要类型:– 数据操纵语言( DML,Data manipulation languag

e )查询。如 update 、 insert 或 delete 语句。– 数据定义语言( DDL,Data definition language )

查询,会更改数据库的结构,如 create table 、 alert view 或 drop procedure 等语句。

Page 21: 5 .NET 数据库开发

21

5.2.1 数据库查询 例如:

SqlConnection myConn = new SqlConnection();

myConn.ConnectionString = "server=localhost;database=Northwind;uid=sa;pwd=;";

myConn.Open();

SqlCommand cmd = myConn.CreateCommand();

cmd.CommandText = "update Customers set CompanyName='NewCompanyName'" + "where CustomerID ='ALFKI'";

cmd.ExecuteNonQuery();

Page 22: 5 .NET 数据库开发

22

5.2.1 数据库查询 3.用 DataReader对象检查查询结果

Command 对象提供了一个 ExecuteReader 方法,该方法能够返回 DataReader 对象,可通过此对象检查查询结果。

连接模型

Page 23: 5 .NET 数据库开发

23

5.2.1 数据库查询 例如:

string strConn,strSQL;strConn = "server=localhost;database=Northwind;uid=sa;pwd=;";SqlConnection myConn = new SqlConnection(strConn);myConn.Open();strSQL = "select CustomerID,CompanyName from Customers";SqlCommand cmd = new SqlCommand(strSQL,myConn);SqlDataReader dr = cmd.ExecuteReader();while(dr.Read())Console.WriteLine(dr["CustomerID"] + "-" +

dr["CompanyName"]);dr.Close();

Page 24: 5 .NET 数据库开发

24

5.2.1 数据库查询获取多个结果SqlCommand cmd = new SqlCommand(strSQL,myConn);

SqlDataReader dr = cmd.ExecuteReader();

do

{

while(dr.Read())

Console.WriteLine(dr[0] + "-" + dr[1]);

Console.WriteLine();

}while(dr.NextResult());

Page 25: 5 .NET 数据库开发

25

5.2.1 数据库查询

4 .执行返回单值的查询 假设想执行一个查询,并获取单个数据元素(如一行,一列),用 DataReader 或DataSet 来获取单值可能有些大材小用。 Command 对象有一种专为该类查询设计的方法: ExecuteScalar 。

Page 26: 5 .NET 数据库开发

26

5.2.1 数据库查询5 .执行参数化查询

……

strSQL = "select OrderID,CustomerID,EmployeeID,OrderDate from"

+ " Orders where CustomerID=@CustomerID";

SqlCommand cmd = new SqlCommand(strSQL,myConn);

cmd.Parameters.Add("@CustomerID",SqlDbType.Char,8);

cmd.Parameters[0].Value = "ALFKI";

SqlDataReader dr = cmd.ExecuteReader();

Page 27: 5 .NET 数据库开发

27

5.2.2 DataAdapter 对象 DataAdapter 类可以看作是 ADO.NET 结构的电

子“插头”。 该适配器在生命周期内的惟一目的就是填充

DataSet ,以及向数据源传送 DataSet 的改变。

无连接模型

Page 28: 5 .NET 数据库开发

28

5.2.2 DataAdapter 对象 适配器实际上是 4 个独立的 Command 对

象的容器,即SelectCommand 、 InsertCommand 、 UpdateCommand 和 DeleteCommand 。

Page 29: 5 .NET 数据库开发

29

5.2.3 DataSet 类 DataSet 是提供内存数据存储的所有功能的

类。它维护完全非连接的数据缓存。

Page 30: 5 .NET 数据库开发

30

DataTable

该表是一个列的有条理的集合,并拥有许多的关联行。 ⑴ Columns Columns 集包含了表内所有列的列表。 ⑵ Constraints 约束是应用于表的数据规则。它为一集合对象。 ⑶ ChildRelations 关系集,用来定义建立该DataTable 子表的关系。

Page 31: 5 .NET 数据库开发

31

⑷ ParentRelations 该集合包含了用于建立该DataTable 的父表的所有关系的列表。 ⑸ PrimaryKey PrimaryKey属性是用于描述包含一个特定的 DataTable 的主键的所有列的DataColumn 对象的数组,它允许相当健壮和复杂的数据存储于 DataSet 中。 ⑹ Rows 而 Rows 集合提供了包含在该表中的实际数据。它包含 DataRow 对象集。

Page 32: 5 .NET 数据库开发

32

DataColumnDataColumn 是构建 DataTable 模式的核心,定

义 DataColumn时,要提供数据类型、尺寸,以及用于控制表内数据如何访问的名称信息。

常用的属性 : ⑴ AllowDBNull 为 Boolean 标志,指示在父级表列中每行的列是否允许为 null 。 ⑵ AutoIncrement 另一 Boolean 标志,指示对于新插入到父级表列中的新行,列是否会自动增加列值。

Page 33: 5 .NET 数据库开发

33

⑶ DataType DataType属性并不使用枚举或一些易错的数据类型编码系统,实际上它能存储实际的 .NET Framework 数据类型。 ⑷ ReadOnly 为一 Boolean 标志,指示表中的列值是否可以修改。 ⑸ Unique 为一 Boolean 标志,指示表中所有行的列的所有值必须保证是惟一的。

Page 34: 5 .NET 数据库开发

34

DataRow DataRow 是表内数据行的格式化的、结构

化的数据容器。 DataRow 对象为表内的数据行容纳了 Create 、 Retrieve 、 Update和 Delete功能。

Page 35: 5 .NET 数据库开发

35

⑴ RowState RowState属性属于枚举类型 DataRowState 。它告诉程序员

(以及 GetChanges() 和 HasChanges() 方法) DataRow 的当前状态。该状态可由下列枚举值的之一来表示。– Added :行已加入表中,然而AcceptChanges() 方法还未调用。– Deleted :行已使用 DataRow 的 Delete() 方法删除。– Detached :行实际上不是表的一部分;或者刚创建,还没有成

为集合的一部分;或者刚刚从集合中删除。– Modified :行内的数据已修改,然而AcceptChanges()还未调用。– Unchanged :自从上次AcceptChanges() 调用后,行内数据没

有改变。

Page 36: 5 .NET 数据库开发

36

⑵ Item Item属性经常被重载,以允许使用多种不同的方法得到

存储在行中的指定列的数据。可以提供列名,来设置和读取值。可以提供 DataColumn 对象,同样来设置和渎取该值。另外,可以提供列的顺序位置来设置和读取值。 ⑶ BeginEdit()

该函数使 DataRow处于编辑模式,来暂时延缓事件触发,以允许同时修改不只一行数据。程序员可通过使几行处于编辑模式来延缓有效验证,装载数据,然后进行修改。

Page 37: 5 .NET 数据库开发

37

⑷ CancelEdit() 该函数使 DataRow脱离编辑模式,并放弃自从调用 BeginEdit() 方法后对行所做的改变。 ⑸ Delete()

该函数删除当前行。

Page 38: 5 .NET 数据库开发

38

⑹ EndEdit() 该函数使当前行完成编辑模式,存储自调用

BeginEdit() 方法后对 DataSet 所做的改变。 ⑺ AcceptChanges()

该函数隐式调用 EndEdit () 方法。若在该函数调用前行的 RowState 是 Added 或Modified , RowState就成为 Unchanged 。如果在函数调用前 RowState 是 Deleted ,则RowState 被物理上删除。

Page 39: 5 .NET 数据库开发

39

5.2.5 XML 与 ADO.NET

① DataSet 的结构(表、列、关系和约束)可在XML架构中定义。② 可以使用 DataSet 的 ReadXML 方法将 XML文档或流读入 DataSet ,使用 DataSet 的WriteXML 方法将 DataSet 以 XML 格式写出。③ 可以创建 DataSet 内容的 XML视图

( XMLDataDocument 对象),然后用关系方法(通过 DataSet )或 XML 方法查看和操作数据。这两种视图在更改时自动同步。

Page 40: 5 .NET 数据库开发

40

5.2.5 XML 与 ADO.NET

1 . GetXml方法GetXml 方法,可以用它将 DataSet 的内容提

取为字符串。2 . WriteXml 和 ReadXml方法

将 DataSet 的内容写入一个文件或者一个实现了 Stream 、 TextWriter 或者 XMLWriter界面的对象。

Page 41: 5 .NET 数据库开发

41

小结 2-1

DataAdapter 类在生命周期内的惟一目的就是填充DataSet ,以及向数据源传送 DataSet 的改变。

DataAdapter适配器实际上是 4 个独立的 Command对象的容器,即 SelectCommand 、 InsertCommand 、UpdateCommand 和 DeleteCommand 。

DataSet 是提供内存数据存储的所有功能的类。它维护完全非连接的数据缓存。包含表集、表间的关系、表的限制和键值,以及每个表包含行和列的集合。

Page 42: 5 .NET 数据库开发

42

小结 2-2

DataAdapter 的 Fill 方法用于使用SelectCommand 的结果来填充DataSet 。 Fill 将要填充的 DataSet 和DataTable 对象用作它的参数。

DataAdapter 的 Update 方法可用来将DataSet 中的更改解析回数据源。

用 DataSet 对象读写 XML 数据的方法有:GetXml 、 WriteXml 、 ReadXml 方法等。

Page 43: 5 .NET 数据库开发

43

主要内容 5.1 ADO.NET 基础 5.2 使用 ADO.NET 进行数据库开发 5.3 一个示例

Page 44: 5 .NET 数据库开发

44

一个图片浏览器

Page 45: 5 .NET 数据库开发

45

数据库 PlayList.mdb

Page 46: 5 .NET 数据库开发

46

获取和显示 PlayList

string connectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\DotNetExample\DB\PlayList.mdb";

OleDbConnection aConnection = new OleDbConnection(connectString);

string commandStr; OleDbCommand aCommand; commandStr = "Select distinct ListName from PlayList"; aConnection.Open(); OleDbDataReader rd; aCommand = new OleDbCommand(commandStr, aConnection); rd = aCommand.ExecuteReader(); this.playList.Items.Clear(); while (rd.Read()) { string file = rd.GetString(0); this.playList.Items.Add(file); } rd.Close(); aConnection.Close(); this.playList.Refresh();

Page 47: 5 .NET 数据库开发

47

打开一个 PlayList string listname; int idx1 = playList.SelectedIndex; listname = playList.Items[idx1].ToString(); OleDbConnection aConnection = new

OleDbConnection(connectString); string commandStr; OleDbCommand aCommand; commandStr = "Select distinct FileName from PlayList where

ListName='" + listname + "'"; aConnection.Open(); OleDbDataReader rd ; aCommand = new OleDbCommand(commandStr, aConnection); rd = aCommand.ExecuteReader(); this.imageList.Items.Clear(); while (rd.Read()) { string file; file = rd.GetString(0); this.imageList.Items.Add(file); } rd.Close(); aConnection.Close(); this.imageList.Refresh();

Page 48: 5 .NET 数据库开发

48

保存一个 PlayList

string listname = listName.Text; OleDbConnection aConnection = new

OleDbConnection(connectString); aConnection.Open(); string commandStr; OleDbCommand aCommand; int index; int listNumber = this.imageList.Items.Count; for(index = 0; index < listNumber; index++) { string file = imageList.Items[index].ToString(); commandStr = "insert into PlayList values('" + listname + "','" + file + "')"; aCommand = new OleDbCommand(commandStr, aConnection); aCommand.ExecuteNonQuery(); } aConnection.Close();