1.数据源及其相关的ADO.NET对象
ADO.NET是通过数据源提供程序访问数据库的。数据源提供程序不同,Connection、Command、DataAdapter和DataReader等4个ADO.NET对象的具体实现也随之不同。表4-1列出了两种常见的数据源及其对应的ADO.NET对象:具体到OleDb数据源提供程序,上述4个ADO.NET对象分别为OleDbConnection、OleDbCommand、OleDbDataAdapter和OleDbDataReader;而具体到SQL Server数据源提供程序,上述4个ADO.NET对象分别为SqlConnection、SqlCommand、SqlDataAdapter和SqlDataReader。
表4-1 不同数据提供程序对应的ADO.NET对象
基于OleDb数据源提供程序对应的ADO.NET对象适应所有数据库,而基于SQL Server数据提供程序则专门针对SQL Server数据库进行了优化,仅适用7.0版以上的SQL Server。很显然,如果访问7.0版以上SQL Server数据库,基于SQL Server数据提供程序对应的ADO.NET对象是最佳选择,而如果是访问其他数据库,则要选择OleDb提供程序对应的ADO.NET对象或者其他的专用数据源提供程序。
由于不同数据源提供程序对应的ADO.NET具体组件不一样,其所属的名称空间也不同。因此使用ADO.NET对象操作数据库时,必须正确地导入其相应的名称空间。OleDb和Sql Server数据源对应的ADO.NET组件的名称空间如表4-2所示。
表4-2 不同数据提供程序对应的ADO.NET对象的名称空间
尽管不同数据源提供程序对应的ADO.NET组件不一样,但是使用不同数据源对应的ADO.NET对象操作数据库的程序设计方法基本相同,因此本学习单元将以基于SQL Server数据源供程序对应的ADO.NET对象为载体介绍操作数据库的相关技能。
2.使用SqlDataReader对象输出数据
从图4-6可以看出,使用SqlDataReader对象输出数据的步骤如下:
1)创建SqlConnection对象连接到SQL Server数据库。
2)创建执行SQL查询命令的SqlCommand对象。
3)执行SqlCommand对象SQL查询命令,建立SqlDataReader对象。
4)将数据绑定控件绑定到SqlDataReader对象输出显示数据。
(1)建立与关闭数据库的连接
1)基本方法如下。
通过Connection对象可实现与数据库的连接,SqlConnection专用于连接SQL Server数据库。其语义性代码如下:
第1~2行导入必要的名称空间。第3行创建SqlConnection对象变量conn。有关SQL Server数据库连接字符串的说明请参见学习单元3有关SqlDataSource数据源控件连接数据库属性的内容。第4行执行SqlConnection对象的Open()方法,打开数据库连接(打开数据库连接是必需的,因为只有事先打开数据库连接才能使用Command对象执行SQL命令实现数据库操作)。第6行执行SqlConnection对象的Close()方法,关闭数据库连接。SQL Server数据库连接数是有限制的,因此数据库操作任务完成后,应及时关闭数据库连接。
2)读取应用程序集Web.Config中的连接字符串建立数据库连接。
可以事先将连接字符串通过连接字符串变量保存到ASP.NET Web应用程序配置文件Web.Config的<connectionStrings>节中,然后在程序中读取连接字符串变量建立Connection对象。
下面的代码为应用程序Web.Config文件,在<connectionStrings>节的<add>子节的name属性用于指定保存连接字符串的变量名称,connectionString属性则指定了该变量所保存的连接字符串。
应用程序Web.Config文件保存好连接字符串后,建立SqlConnection对象的语义性代码如下:
代码中第3行即为使用Web.Config应用程序配置文件事先保存好的连接字符串建立SqlConnection对象。
先将连接字符串保存到Web.Config配置文件中,然后在程序中读取连接字符串建立Connection对象非常有必要。如果是这样,应用程序发布后,一旦数据库名称、位置或安全验证方式发生变化,只要在Web.Config配置文件中修改连接字符串即可,否则必须在应用程序源代码中一一修改,既麻烦又不现实。
(2)创建SqlCommand对象
1)基本方法如下所示。
创建SqlCommand对象的语义性代码如下:
第5行以SQL命令字符串和数据库连接对象构造一个SqlCommand对象。第6行指定命令字符串的类型。命令字符串可以是SELECT语句,也可以是存储过程名,还可以直接是数据表名称,具体须由SqlCommand对象的CommandType属性指定,否则数据库不理解传过来的命令字符串具体是什么。命令字符串是SELECT语句或存储过程名或者直接是数据表名称时,SqlCommand的CommandType属性取值值可为Text、StoredProcedure或TableDirect,表示SqlCommand对象中的命令字符串分制是SELECT语句,存储过程名或者直接是数据表名称时,其默认值是Text。
2)传递参数到SqlCommand对象。
Command对象将执行的SQL命令或存储过程往往需要传入参数,如:
其中的@userid即为参数。
那么怎样将参数值传给Command对象中带参数的SQL语句或存储过程呢?如图4-8所示,Command对象具有名为Parameters的属性,该属性是集合对象,可以将Command对象中SQL命令所需要的一系列参数及其参数值以“名称/值”对的方式保存在Parameters集合中,执行SQL语句或存储过程前,Command对象能够自动根据命令字符串中的参数名到Parameters集合中检索参数值,然后执行SQL语句或存储过程。
图4-8 Command对象根据参数名到Parameters集合检索SQL参数值示意图
可以通过Command对象的Parameters集合的Add()方法将参数及其参数值加入到Parameters集合,其格式如下:
下述为在某数据库的Employee数据表中添加一条记录的语义性代码。
(3)创建DataReader对象
执行Command对象ExecuteReader()方法可创建DataReader对象,其语义性代码如下:
第6行声明一个SqlDataReader对象变量,并执行SqlCommand对象变量的ExecuteReader()方法建立DataReader对象。
(4)使用数据绑定控件输出DataReader数据
ASP.NET的数据绑定控件可分为列表类、表格类和表单类,同一种类别数据绑定控件绑定输出DataReader的方法是一样的。下面以DropDownList、GridView控件为例分别介绍列表类和表格类数据绑定控件输出DataReader的方法。
1)绑定DataReader到DropDownList控件。
绑定DataReader到DropDownList控件语义性代码如下所列第2~5程序行语句:
2)绑定DataReader到GridView控件。
绑定DataReader到GridView控件相对比较简单,仅涉及GridView的DataSource属性和DataBind()方法,其语义性代码如下所列第2~3程序行语句:
(5)使用DataList控件输出DataReader
DataList绑定DataReader的方法与GridView控件相同,DataList控件还与GridView控件的模板列技术类似,具有Item和EditItem等不同的视图,并且可以在其中加入绑定到从数据源获取的数据字段的Web控件,以输出数据或编辑修改数据。与GridView控件不同的是,DataList自身不具备分页显示的功能,视图切换也需要程序员编程实现,但是其排列比GridView控件灵活(例如可以设置各显示项目为水平排列或垂直排列,还可以设置显示项目的列数或每行显示的项目数)。
使用DataList控件显示DataReader数据步骤及方法如下:
1)在页面中加入DataList控件,然后设置其排列属性,具体设置如表4-3所示。
2)在DataList控件Item视图加入显示相应数据的子控件,然后和GridView控件的模板列中数据输出类控件一样,将其中子控件相关的输出属性绑定到对应的DataReader数据字段。
表4-3 DataList控件排列属性及其说明
3)将DataList控件绑定到DataReader。其语义性代码如下所列5~6程序行语句:
(6)分页输出DataReader(www.xing528.com)
因为DataReader为前向只读数据流,分页输出DataReader可以从SQL语句着手,让DataReader只返回当前页显示的那部分记录。假设每页显示的记录数为pageSize,当前页为pageNumber,针对SQL Server 2005,返回当前页那部分记录的SQL命令字符串为:
分页输出DataReader典型程序片段如下:
3.使用Command对象添加、更新和删除数据记录
(1)添加、更新和删除数据记录基本语法
直接使用Command对象插入、更新和删除数据记录语义性代码如下:
第1个命令行创建将执行插入、更新和删除数据记录的SQL语句的Command对象;第2个命令行则通过Command对象的ExecuteNonQuery()方法执行Command对象的插入、更新和删除数据记录的SQL语句,实现数据库记录的插入、更新和删除操作。
(2)向数据库添加数据记录
向数据库添加记录的典型方法是在页面中设置若干输入控件,然后读取输入值将其添加到数据库中。
假设有一个具有Leaveword和属性为自动编号的LeaveID的两个字段、名为LeaveWord的数据表,实现数据的插入的界面可由一个文本框和一个命令按钮构成(假设二者控件名分别为txtLeaveword和btnInsert),程序实现则可响应btnInsert命令按钮的Click事件,具体代码如下:
(3)使用DataList控件更新和删除数据记录
使用DataList控件更新和删除数据记录分两步进行。首先在DataList控件中添加能够引发DataList控件编辑、更新、取消和删除操作的Button、LinkButton和ImageButton等按钮控件,然后在按钮引发的相应事件的事件函数中执行ADO.NET中Command对象的更新和删除数据记录命令实现数据记录的更新或删除。基本步骤如下:
1)添加能够输入数据到绑定的数据字段的输入控件到DataList控件EditItem视图。
2)在DataList控件的Item视图添加编辑和删除功能按钮,在EditItem视图添加更新和取消功能按钮。和GridView控件的模板列技术一样,DataList控件的编辑、更新、取消和删除功能按钮,实际上就是普通的Button、LinkButton和ImageButton等按钮控件,只是其CommandName属性是系统规定的,具体如表4-4所示。
表4-4 DataList控件中功能按钮及其使用说明
3)响应DataList控件相关事件实现数据的删除和更新。
若有名为dtlstLeave的DataList控件,表4-4所示事件的事件函数典型代码如下。
①响应EditCommand事件从DataList控件Item视图切换到EditItem视图。
②响应CancelCommand事件从DataList控件EditItem视图切换回到Item视图。
③响应UpdateCommand事件更新数据记录。
④响应DeleteCommand事件删除记录。
4.上传并通过数据库存取、输出文件
(1)使用FileUpload控件上传并保存文件
FileUpload控件在学习单元2已有涉及,此处将作进一步的深入说明。
1)常见属性。
FileUpload控件常见属性如表4-5所示。
表4-5 FileUpload控件常见属性
2)常见方法如下所示。
FileUpload控件常见方法主要为SaveAs()方法,其功能为将上传的文件按指定的物理路径保存到Web服务器上,其格式为:
通常情况下我们只知道上传文件将保存的相对路径,可以通过Page类的静态方法MapPath方法将相对路径转化为物理路径,格式如下:
3)上传并保存文件。
使用FileUpload控件上传并保存文件的一种典型程序语义性代码实例如下:
(2)通过数据库存取、输出文件
使用FileUpload控件可实现上传并保存文件到Web服务器的某个文件夹下,但是也存在一个问题:不能很好地对上传的文件进行跟踪和管理。解决办法有两种:一种办法是上传保存文件到Web服务器的同时,将文件的路径、文件名等等信息保存在数据库中,以便对上传的文件进行跟踪和管理;第二种办法是直接将上传的文件保存在数据库中,直接利用数据库管理系统对上传的文件进行跟踪和管理。下文仅对第二种方法进行详细讨论。
1)使用FileUpload控件上传文件到数据库。
在SQL Server数据库中可以通过binary类型或者image字段类型保存任何类型文件的内容。由于不同类型数据在浏览器中的输出方式不同,所以在设计数据表时,除了保存文件本身外,一般还得保存文件的Mime类型,以便在读取文件时根据Mime类型确定正确的输出方式。
使用FileUpload控件上传文件到数据库的基本方法是读取FileUpload控件的FileBytes属性值并将其保存到对应的binary类型或者image类型字段。如果要保存文件类型,则读取FileUpload控件的PostedFile属性的ContentType属性并将其保存到对应的nvarchar类型或nchar类型字段中。假设保存上传文件的数据表为upfiles,其有content和contentType两个字段,分别用于保存上传文件本身及其Mime类型,则使用FileUpload控件上传文件到数据库的语义性代码如下:
如果上传的文件是图像,往往先将原图像处理为缩略图,然后再保存到数据库,其程序语义性代码如下:
上述代码中GetImageType()为自定义函数,其作用是将Mime类型映射为Image类Save方法的第2个参数所需要的System.Drawing.Imaging.ImageFormat枚举。GetImageType()函数的定义如下:
2)读取数据库中文件二进制数据并输出到页面。
读取数据库中保存的文件数据与读取其他数据完全一样,但不同媒体类型,输出方法有所不同。本书此处只对图像输出进行说明,在理解本书示例的基础上,读者参阅相关资料完全可以自己实现其他类型的输出。
通过设置Image或者ImageButton控件的ImageUrl属性可实现图像的输出。从狭义上讲,ImageUrl属性为控件将显示像的图像文件的URL地址,但是从广义上讲,控件的ImageUrl属性可以是任何能返回图像数据的文件的URL,包含一个能够读取数据库中图像数据并通过Response.BinaryWrite()方法输出该图像数据到浏览器端的ASPX文件,假设该文件为Out_pic.aspx,其页面代码如下:
此时,如果通过Image控件显示图像,代码如下:
如果Image控件在GridView、DetailsView、FormView或DataList等数据绑定控件中,其代码则为:
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。