当前位置:文档之家› 第六节:aspnet数据库操作

第六节:aspnet数据库操作

是对Microsoft ActiveX Data Objects (ADO)一个跨时代的改进,它提供了平台互用性和可伸缩的数据访问。

由于传送的数据都是XML格式的,因此任何能够读取XML格式的应用程序都可以进行数据处理。

事实上,接受数据的组件不一定要是ADO .NET组件,它可以是基于一个Microsoft Visual Studio的解决方案,也可以是任何运行在其它平台上的任何应用程序。

以前做数据库访问的时候,需要一直与数据库保持连接,直到获取完所有满足需要的数据之后才会断开数据库连接,这种数据库访问方式称之为连接式数据访问技术。

相比于以前的连接式数据访问技术,除了提供连接式数据访问技术之外,还提供了另一种断开式解决方案,那就是在内存中模拟一个数据库,也就是内存中的数据库。

我们知道在实际的数据库技术中,每个数据库就是一个业务逻辑单元,一般来说这个数据库包含了实现一个应用软件或者一个网站所需要的全部数据。

在这里数据库就是顶级对象,我们引用创建数据库时所用到的名词database来表示(因为创建数据库的SQL语句是create database),在一个数据库里可以包含有多个表(table)和视图(view),除此之外还可以包含有一些外键关系等。

在一个表(table)或者视图(view)里可以包含多个列(column)和行(row)。

在中对上面提到的对象都在内存中进行了模拟,在内存中的数据库对象称之为DataSet,一个内存中的数据库(DataSet)可以包含多个在内存中的表(DataTable)和内存中的视图(DataView),并且也允许在表存在一些关系(DataRelation)。

同时在一个内存中的表(DataTable)或者内存中的视图(DataView)中也允许存在行(DataRow)和列(DataColumn)。

物理数据库与内存数据库之间的各对象的对应关系如下:在上图中颜色相同的表示二者基本上是一种对应关系。

在本篇将讲述6个中的常用对象:Connection对象Command对象DataReader对象DataAdapter对象DataSet对象DataTable对象DataRow对象DataColumn对象参数化SQL语句分页查询SQL语句严格地说,在.net类库中并没有Connection、Command、DataAdapter和DataReader对象的,这是对相关的对象做了一个抽象。

在实际的开发中,我们经常用到的数据库有Access、SQL Server、Oracle、MySQL等,尽管大部分都遵循SQL国际化标准,但是它们在遵循标准的前提下又做了一些扩充,并且即使遵循了相同的标准,但是实现方法并不相同,所以在某些情况下实现相同的功能可能在不同的数据库中SQL语句并不相同。

于是,在也定义了一套用于访问数据库的标准,当然这个标准是以接口(interface)的形式提供的,各数据库厂商只要实现了这个接口就能在下正常工作(这也是接口的作用,接口就是用于指定规范,自己本身并不实现,在Java中针对数据库访问也有一套接口留待各数据库来实现)。

当然在.net类库中微软已经提供对Access、SQL Server和Oracle数据库对上面提到的接口的实现。

在中定义的这一套接口是IDbConnection、IDbCommand、IDbDataAdapter和IDataReader,并且还有一套实现这些接口的抽象类,分别是DbConnection、DbCommand、DbDataAdapter和DataReader。

上图最上面的是数据库访问接口,紧接着的是数据库访问抽象类,下面是针对不同数据库中实现这些接口的类,并且在括号中注明了其所在的命名空间,比如针对MySQL数据的数据库访问类就位于MySql.Data.MySqlClient命名空间下,关于MySql的数据库访问类需要到MySql数据库的官方网站去下载,它的官方网站是。

其它的数据库访问类都在.net类库中自带了。

注意:访问SQL Server7.0以下版本的SQL Server数据库时需要用System.Data.OleDb命名空间下一套数据库访问类,虽然这一套数据库访问类同样也能访问SQL Server2000以上版本,但是没有办法利用SQL Server数据库的一些新特性,所以不建议使用System.Data.OleDb命名空间下的类访问SQL Server2000以上的版本。

在本篇的讲述中,针对SQL Server数据库讲述Connection、Command、DataAdapter和DataReader对象的用法,它们在其它数据库中也有对应的类,除了有些SQL语句语法不一样之外,用法是基本一样的。

Connection对象Connection对象也称为数据库连接对象,Connection对象的功能是负责对数据源的连接。

所有Connection对象的基类都是DbConnection类。

Connection对象有两个重要属性:ConnectionString:表示用于打开 SQL Server 数据库的字符串;State:表示 Connection 的状态,有Closed和Open两种状态。

Connection对象有两个重要方法:Open()方法:指示打开数据库;Close()方法:指示关闭数据库。

在实际开发中很多朋友经常询问数据库连接字符串该怎么写,其实有一个很简单的技巧,我们可以在Visual Studio 2005工具箱中找到数据分组,如下图:打开或新建一个页面,在设计视图下双击SqlDataSource控件就会添加一个SqlDataSource到当前页面,如下图:当我们用鼠标单击SqlDataSouce控件时会出现一个小三角箭头,如上图所示,当我们点击这个三角箭头时会出现如下图所示的界面:点击“配置数据源”时会出现下面的界面:点“新建连接”后出现如下界面:在这个界面中默认是连接到SQL Server数据库,其实我们还可以利用这个向导连接到其它数据库的,我们点击“数据源”旁边的“更改”按钮出现如下图所示的界面:从上面的界面中我们可以看出可以利用这个连接向导配置连接到Access数据库文件、ODBC数据源、SQL Server数据库、SQLServer手机版数据库、SQL Server数据库文件、Oracle数据库文件及其它数据库。

在这里我们选择Microsoft SQL Server选项,连接到SQL Server数据库。

如果我们在局域网中,我们可以点击“添加连接”界面中的刷新按钮来查看局域网中有哪些SQL Server数据库可以连接。

连接到数据库可以用下面的方式:(1)如果要连接的数据库服务器与开发者的机器在同一个局域网里,可以使用局域网IP地址或者局域网中的电脑主机名;(2)如果要连接的数据库服务器与开发者的机器不在同一个局域网内,那么就要求数据库服务器必须有一个公网IP,我们可以使用公网IP来连接,如果数据库服务器还有互联网域名,那么用互联网域名也是可以的。

(3)如果要连接的数据库服务器与开发者所使用的机器是同一台机器,那么可以使用以下几种方式之一:”(local)”或者”.”或者”127.0.0.1”。

需要注意的是,如果在一台机器上运行者同一种数据库的不同版本,比如说在”administrator”这台主机上同时运行着SQL 2000、SQL 2005和SQL Express三种版本,并且它们所使用的Windows服务名分别为”SQL2000”、”SQL2005”和”SQLExpress”,那么我们要连接到SQL 2000这个数据库上所使用的服务器名就应该填写”zhoufoxcn/SQL2000”这种“主机名/实例名”的方式或者“主机IP/实例名”,这种情况在同时安装了Visual Studio 2005和SQL 2005的朋友那里很常见,因为SQL Express是针对学生的功能有限的免费版本,这个版本的数据库在安装Visual Studio 2005时默认是一同安装的。

在上面的“添加连接”窗口,我们分别填写如下信息:在上面我们连接的是本机上的数据库,所使用的数据库帐号是sa,访问的数据库是AspNetStudy,创建这个数据的SQL脚本如下:1.1.IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'AspNetStudy')2.3.DROP DATABASE [AspNetStudy]4.5.GO6.7.CREATE DATABASE [AspNetStudy] ON (NAME = N'AspNetStudy_Data', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL/data/AspNetStudy_Data.MDF' , SIZE = 1, F ILEGROWTH = 10%) LOG ON (NAME = N'AspNetStudy_Lo g', FILENAME = N'C:/Program Files/Microsoft SQL Server/ MSSQL/data/AspNetStudy_Log.LDF' , SIZE = 1, FILEGROWTH = 10%)8.9.COLLATE Chinese_PRC_CI_AS10.11.GO12.e [AspNetStudy]14.15.GO16.17.if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[UserInfo]') and OBJECTPROPERTY(id, N'IsUserTabl e') = 1)18.19.drop table [dbo].[UserInfo]20.21.GO22.23.CREATE TABLE [dbo].[UserInfo] (24.25. [UserID] [int] IDENTITY (1, 1) NOT NULL ,26.27. [UserName] [varchar] (20) COLLATE Chinese_PRC_CI_AS NOT NULL ,28.29. [RealName] [nvarchar] (8) COLLATE Chinese_PRC_CI_AS NOT NULL ,30.31. [Age] [tinyint] NOT NULL ,32.33. [Sex] [bit] NOT NULL ,34.35. [Mobile] [char] (11) COLLATE Chinese_PRC_CI_AS NULL ,36.37. [Phone] [char] (11) COLLATE Chinese_PRC_CI_AS NULL ,38.39. [Email] [varchar] (50) COLLATE Chinese_PRC_CI_AS NOT NULL40.41.) ON [PRIMARY]42.43.GO44.45.CREATE UNIQUE INDEX [IX_UserName] ON [dbo].[UserInfo]([UserName]) WITH IGNORE_DUP_KEY ON [PRIMARY]46.47.GO48.],[Phone],[Email],[Sex])values('zhangfei','张飞',36,'1300000','000000','zhangfei',1);50.51.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('guanyu','关羽',38,'1300000','0000000','guanyu',1);52.53.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('liubei','刘备',42,'111111111','111111','liubei',1);54.55.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('zhougong','周公',29,'111111111','1111111','zhoufoxcn',1);56.57.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('zhaoyun','赵云',32,'111111111','1111111','zhaoyun',1);58.59.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('huanggai','黄盖',50,'111111111','1111111','huanggai',1);60.61.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('zhugeliang','诸葛亮',27,'111111111','1111111','zhugeliang',1);62.],[Phone],[Email],[Sex])values('jiangwei','姜维',22,'111111111','1111111','jiangwei1',1);64.65.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('caocao','曹操',48,'111111111','1111111','caocao1',1);66.67.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('guojia','郭嘉',32,'111111111','1111111','guojia1',1);68.69.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('sunquan','孙权',33,'111111111','1111111','sunquan1',1);70.71.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('diaochan','貂禅',20,'111111111','1111111','diaochan1',0);72.73.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('yangyuhuan','杨玉环',24,'111111111','1111111','yangyuhuang1',0);74.75.insert into UserInfo([UserName],[RealName],[Age],[Mobile],[Phone],[Email],[Sex])values('wangzhaojun','王昭君',26,'111111111','1111111','wangzhaojun1',0);76.77.go78.我们可以点击一下“测试连接”按钮,如果弹出连接成功的提示消息就表示这个数据库连接是可用的。

相关主题