第15章ASP.NET/SQLServer开发与编程15.1ADO.NET模型15.1ADO.NET模型15.1A DO.NET模型15.1ADO.NET模型15.1ADO.NET模型15.2连接数据库15.2连接数 据库15.2连接数据库15.3.1Command对象15.3.1Command对象15.3.1Comm and对象15.3.2DataAdapter对象15.3.2DataAdapter对象15.3.2DataAd apter对象15.4.1DataReader对象的属性和方法15.4.2使用DataReader对象访问数据1 5.4.2使用DataReader对象访问数据15.4.2使用DataReader对象访问数据15.4.2使用Da taReader对象访问数据15.5.1DataSet对象15.5.1DataSet对象15.5.1DataS et对象15.5.1DataSet对象15.5.1DataSet对象15.5.1DataSet对象15.5.1 DataSet对象15.5.2数据库查询操作15.5.2数据库查询操作15.6执行存储过程15.6 执行存储过程15.6执行存储过程15.6执行存储过程15.6执行存储过程15.6执行存储过程15.6 执行存储过程15.6执行存储过程方法二:使用DataAdapter对象执行存储过程xsInfo。设计步骤如下:(1)创 建项目Proj5_2。(2)设计项目主页面Main5_2.aspx的界面,各控件的属性列于表15.17中。见说明①?? DsStu1DataSet数据控件见说明①??ConnSqlDataAdapter数据控件??Connect ionStringConnSqlConnection数据控件xsInfoDataMember自动套用格式;数据属性设置 见说明②。DsStu1DataSourceDataGrid1DataGridWeb控件标签文本为:执行存储过程xsIn fo后的结果字体:黑体;大小:Large;颜色:#3333ff;背景:#ccffff;边框样式:双线style-Labe lHTML控件备注属性值属性控件标识控件名控件类别程序界面中加入SqlDataAdapter控件后, 将进入“数据适配器配置向导”,选择或新建数据连接后,在界面中选择“使用现有存储过程”,单击“下一步”;将出现图15.6所示的选择存 储过程窗口,在其中选择要执行的存储过程(本例选择xsInfo),单击“下一步”;数据适配器配置完成,如图15.7所示。接下去生成数 据集DsStu1。②在3个数据控件均配置完成之后,才可设置DataGrid控件的数据属性,方法是,在DataGrid属性窗口 中选择数据源为“DsStu1”,数据成员为“xsInfo”。(3)在Main3_2.aspx界面的空白处双击,进入程序编辑窗 口,在Page_load()事件处理中输入以下程序代码:PrivateSubPage_Load(ByValsenderA sSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load SqlConn.Open()SqlDtAdpt.Fill(DsStu1,"xsInfo") DataGrid1.DataBind()SqlConn.Close()EndSub(4) 编译程序。选择主选单的“生成”?“生成解决方案”。(5)运行程序,结果与图15.5相同。是否显示表头(Header),Tr ue/False。ShowHeader是否显示脚注(Footer),True/False。ShowFooter被选定的项目 (Item)SelectedItem选定列(以Selected样版样式显示)SelectedIndex每页显示的纪录数 PageSize总页数(只读)PageCount水平对齐方式HorizontalAlign是否显示网格线(在Repeat Layout设为Table时有效)GridLines设定被编辑的字段名称(-1表示放弃编辑)EditItemIndex 指定数据源DataSource主键字段DataKeyField数据页数(在程序中设定)CurrectPageIndex 控件所显示的字段数(只读)Columns储存格和储存格边框的距离CellSpacing储存格与表格边框的距离CellP adding表格背景图形BackImageUrl自动产生数据源中每一字段数据AutoGenerateColumns数据排 序AllowSorting分页AllowPaging说明属性1.DataGrid控件的属性和事件Data Grid控件的常用属性和事件分别列于表15.18和15.19中。当点击DataGrid控件的“更新”按钮时触发该事件,参数与On ItemCommand相同。OnUpdateCommand在选择要排序的字段时触发(属性AllowSorting为True时有 效)OnSortCommand在不同的数据页被选取时便触发OnPageIndexChanged当点击DataGrid控件的 “编辑”按钮时触发该事件,参数与OnItemCommand相同。OnEditCommand当点击DataGrid控件的“删除” 按钮时触发该事件,参数与OnItemCommand相同。OnDeleteCommand当点击DataGrid控件的“取消”按钮 时触发该事件,参数与OnItemCommand相同。OnCancelCommand当用户点击DataGrid控件中的Butto n、ImageButton或LinkButton等按钮控件时触发此事件。该事件的参数为DataListCommandEventAr gs,该参数可取值为:CommandArgument:获取按钮控件指定的选择参数;CommandName:获取按钮控件指定的命 令名;CommandSource:获取被点击的按钮对象;Item:获取按钮对象所在的数据行,返回DataGridItem对象。 OnItemCommand说明事件ADO.NET对象模型的两个主要成员是.NET数据提供程序和DataSet对 象。ADO.NET的主角是DataSet,它是一个内存数据库。DataSet中可以包含多个数据表,可在程序中动态地产生数据 表。每个表由数据列(DataColumn)和数据行(DataRow)组成,如图15.2所示。DataSet提供方法 对数据集中表数据进行浏览、编辑、排序、过滤或建立视图(View)。DataSet对象模型如图所示。?在ASP.Ne t应用程序中访问数据库,需要在程序开始处用Import引入相应的命名空间。例如,若在程序中访问SQLServer2000,则需 要使用以下语句:<%@ImportNamespace="System.Data"%><%@ImportNamespa ce="System.Data.SqlClient"%>若在程序中访问OLE数据源或SQLServer6.5或 更前的版本,则需要使用以下语句:<%@ImportNamespace="System.Data"%><%@Import Namespace="System.Data.OleDb"%>(1)SQL数据库常用的类这些类位于System.Data. SqlClient命名空间下,用于SQLServer2000数据库操作,表15.1列出SQL数据库常用的类。以只读方式读取数据 源的数据,一次只能读取一条记录。SqlDataReader执行SQL命令并返回DataSet类型结果。SqlDataAdap ter执行SQL命令并返回SqlDataReader类型结果。SqlCommand建立数据库连接。SqlConnectio n说明类SqlCommand和OleDbCommand、SqlAdapter和OleDbAdapte r以及SqlReader和OleDbReader都与之类似。获取数据库客户端标识。默认为客户端计算机名。此属性只适用于SQL Server数据库。WorkstationId获取数据库的连接状态,返回1表示联机,0表示关闭。State获取数据库驱动程 序的版本。ServerVersion获取OLEDB提供程序的名称。此属性只有OLEDB数据源才可使用。Provider 获取与SQLServer通信的网络数据包的大小,单位为字节。默认为8192。此属性只有SQLServer数据库才可使用。P acketSize获取数据员的完整路径及文件名,若是SQLServer数据库则获取所连接的SQLServer服务器名称。D ataSource获取当前数据库名称,默认为Nothing。Database获取Connection对象的超时时间,单位为秒 ,为0表示不限制。即若在这个时间之内Connection对象无法连接数据源,则返回失败。ConnectionTimeout取得 或设置连接字符串。ConnectionString说明属性Connection对象的常用属性和方法如表15.3中。 调用Close()方法关闭与数据库的连接,并释放所占用的系统资源。Dispose()创建并返回与Connection对象有关的 Command对象。CreateCommand()在打开连接的状态下,更改当前数据库。ChangeDatabase()关闭 数据库连接。Close()打开与数据库的连接。注意ConnectionString属性只对连接属性进行了设置,并不打开与数据库 的连接,必须使用Open()方法打开连接。Open()说明方法Connection对象的Connec tionString属性用于获取或设置与数据库的连接字符串。对于SQLServer2000数据库,ConnectionStri ng属性包含的主要参数有:DataSource(Server):设置需连接的数据库服务器名。InitialCata log(Database):设置连接的数据库名称。IntegratedSecurity:服务器的安全性设置,是否使用 信任连接。值有True、False和SSPI三种,True和SSPI都表示使用信任连接。WorkstationId:数据库 客户端标识。默认为客户端计算机名PacketSize:获取与SQLServer通信的网络数据包的大小,单位为字节,有效值 为512~32767,默认值为8192。UserID(UID):登录SQLServer的帐号。Password(P wd):登录SQLServer的密码。ConnectionTimeout:设置SqlConnection对象连接SQL数据库 服务器的超时时间,单位为秒,若在所设置的时间内无法连接数据库,则返回失败。Connection对象的事件有以下两个:Info Message:在.NET数据提供程序发送警告或信息时触发该事件。StateChange:当数据连接状态改变时(即调用Ope n()或Close()方法)触发该事件。该事件的参数为StateChangeEventArgs,有两种取值:CurrentSta te:获取Connection对象连接的新状态,为1表示联机,为0表示关闭;OriginState:获取Connection对象 连接的原始状态,为1表示联机,为0表示关闭。ADO.NET提供的Command对象对数据源执行各种SQL命令或存储 过程,可返回DataReader对象,或执行对数据表的更新操作。SQL命令参数集合。Parameters获取或设置Comma nd对象所使用的数据连接属性。Connection获取或设置命令类别,可取的值:StoredProcedure,TableDi rect,Text,代表的含义分别为:存储过程、数据表名和SQL语句,默认为Text。数字、属性的值为CommandType.St oredProcedure、CommandType.Text等。CommandType获取或设置Command对象的超时时间超 时时间,单位为秒,为0表示不限制。默认为30秒,即若在这个时间之内Command对象无法执行SQL命令,则返回失败。Comman dTimeout取得或设置要对数据源执行的SQL命令、存储过程或数据表名。CommandText说明属性Comma nd对象的主要属性和方法分别列于表15.5中。执行CommandText属性指定的内容,返回XmlReader对象。只有SQL Server才能用此方法。ExecuteXmlReader()执行CommandText属性指定的内容,返回结果表第一行第一列 的值。该方法只能执行Select命令。ExecuteScalar()执行CommandText属性指定的内容,返回DataRe ader对象。ExecuteReader()执行CommandText属性指定的内容,返回数据表被影响行数。只有Update、 Insert和Delete命令会影响的行数。该方法用于执行对数据库的更新操作。ExecuteNonQuery()创建Param eter对象。CreateParameter取消Comand对象的执行。Cancel()说明方法Command对 象的CommandType属性用于设置命令的类别:可以是存储过程、表名或SQL语句。【例15.1】修改xscj数据库XS数据 表记录,使学号020101的总学分+5。程序代码如下:<%@ImportNamespace="System.Data"% ><%@ImportNamespace="System.Data.SqlClient"%>e="VB"Runat="Server">subpage_loadDimconnAsnewSqlConnectio n()''定义Connetction对象conn.ConnectionString="DataSource=My SRV1;IntegratedSecurity=false;InitialCatalog=XSCJ;PacketSize =4096;uid=sa;pwd=;"conn.Open() ''打开与数据库的连接 DimcmdAsNewSqlCommand("UpdateXSsetzxf=z xf+5wherexh=''001101''",conn)cmd.ExecuteNonQuery() ''执行SQL语句 conn.Close() ''关闭数据连接endsub 获取或设置更新数据源中的数据行的SQL命令。该值为Comand对象。Update Command获取或设置查询数据源的SQL命令。该值为Comand对象。SelectCommand获取或设置向数据源中插入数 据行的SQL命令。该值为Comand对象。InsertCommand获取或设置删除数据源中的数据行的SQL命令。该值为Coma nd对象。DeleteCommand获取或设置当执行Update()方法更新数据源发生错误时是否继续。默认为False。Co ntinueUpdateOnError说明属性DataAdapter对象的DeleteComman d、InsertCommand和UpdateCommand属性只有在调用Update()方法,DataAdapter对象得知数据源 的数据行后才可使用。调用InsertCommand或UpdateCommand或DeleteCommand属性指定的SQL命令 ,将DataSet对象更新到相应的数据源。参数dataSet指定要更新到数据源的DataSet对象,srcTable参数为数据表对 应的来源数据表名。该方法的返回值为影响的行数。Update(dataset,srcTable)将数据集的SelectComma nd属性指定的SQL命令执行后所选取的数据行置入参数dataSet指定的DataSet对象。Fill(dataset,srcTa ble)说明方法Fill()用于新增或更新DataSet中的记录;当新增、修改或删除DataSet中的记录时, 并需要更改数据源时,使用Update()方法。当调用Update()方法、在开始执行SQL命令时会触发该事件。RowUpdat ing当调用Update()方法并执行完SQL命令时会触发该事件。RowUpdated调用DataAdapter的Fill( )方法时若发生错误则触发该事件。FillError说明事件使用DataAdapter可以执行多个SQL命令。在执行D ataAdapter对象的UpDate()方法之前,所操作的都是数据集(即内存数据库)中的数据,只有执行了Update()方法后, 才会对物理数据库进行更新。使用DataAdapter对象对数据进行更新操作分为三个步骤:创建DataAdapter对象并设置Up dateCommand等属性;(2)指定更新操作;(3)调用Update()方法执行更新。DataAdapter对象 的InsertCommand、UpdateCommand和DeleteCommand属性是对数据进行相应更新操作的模板,当调用Up date()方法时,DataAdapter对象将根据需要的更新操作去查找相应属性(即操作模板),则会产生错误。DataRead er对象的属性和方法分别列于表15.9和15.10中获取在执行Insert、Update或Delete命令后受影响的行数。该属 性只有在读取完所有行且DataReader对象关闭后才会被指定。ReacordsAffected获取或设置表字段值,name为 字段名;col为列序号,序号从0开始。例如:objReader.Item(0)、objReader.Item("name")。I tem({name,col})获取DataReader对象的状态,为True表示关闭。IsClosed获取DataReade r对象包含的记录行数。FieldCount说明属性读取下一条记录,返回布尔值,返回True表示有下一条记录;返回Fa lse表示没有下一条记录。Read()若序号为Col的列为空值,则返回True,否则返回False。IsDBNull(Col )获取所有字段的值,并讲字段值存放在values数组中。GetValues(values)获取序号为Col的列的值。Get Value(Col)获取字段名为Name的列的序号。GetOrdinal(Name)获取序号为Col的列的字段名。GetN ame(Col)获取序号为Col的列数据类型。GetFieldType(Col)获取序号为Col的列的来源数据类型名。Ge tDataTypeName(Col)获取序号为Col的列的值,所获取列的数据类型必须为Boolean类型;其他类似的方法还有:G etByte、GetChar、GetDateTime、GetDecimal、GetDouble、GetFloat、GetInt16 、GetInt32、GetInt64、GetString等。GetBoolean(Col)关闭DataReader对象。Cl ose()说明方法15.4.1DataReader对象的属性和方法1.基本的数据访问使用DataReader 对象读取数据的步骤如下:使用Connection对象创建数据连接。使用Command对象的ExecuteReader( )方法执行SQL查询或存储过程,创建DataReader对象。成功创建该对象后,可使用其属性和方法访问数据。在VS. NET中没有与DataReader对应的可视化数据控件,因此对该对象的操作必须编写代码完成。【例15.2】使用DataReade r对象访问XSCJ数据库的xs数据表,将所有记录以表格的形式显示出来。本例给出两种解决方法:一是在VS.NET环境中设 计该程序;二是直接在编辑器中编写所有程序代码,读者可以将它们进行对比。方法一:在VS.NET中进行设计。(1) 创建项目Proj1。(2)设计项目主页面Main1.aspx的界面,包含一个Label控件、一个DataGrid控件、一个Sq lConnection控件和一个Command控件,各控件的属性列于表15.11中。SelectFromxsComma ndText?ConnConnectionCmdSqlCommand数据控件生成连接数据库xscj字符串-Con nectionStringConnSqlConnection数据控件使用“自动套用格式”中的“彩色型2”--Data Grid1DataGridWeb控件标签文本为:学生信息字体:隶书;大小:X-Large;背景:#ccccffstyl e-LabelHTML控件备注属性值属性控件标识控件名控件类别(3)在Main1.aspx界面的空白处双击, 进入程序编辑窗口,在Page_load()事件处理中输入以下程序代码:PrivateSubPage_Load(ByVals enderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBa se.LoadDimobjReaderAsSystem.Data.SqlClient.SqlDataR eader ''定义SqlDataReader对象conn.Open() ''建立到数据源的连接objReader= cmd.ExecuteReader()创建DataReader对象DataGrid1.Da taSource=objReader设置DataGrid的数据源DataGrid1.Dat aBind()''数据绑定并显示conn.Clos e()''关闭到数据源的连接EndSu b(4)编译程序。选择主选单的“生成”?“生成解决方案”。(5)运行程序,结果如图15.4所示。DataSet对象 包括3个集合:DataTableCollection(数据表的集合,包括多个DataTable对象)、DataRowCollect ion(行集合,包含多个DataRow对象)和DataColumnCollection(列集合,包含多个DataColumn对象) 。获取数据集的数据表集合(DataTableCollection),DataSet对象的所有DataTable对象都属于Data TableCollection。TablesDataSet对象内的数据表是否存在错误行。HasErrors获取或设置执行数 据更新操作时是否遵循约束。默认为True。EnforceConstraints获取或设置DataSet对象的名称。DataS etName获取或设置在DataTable对象中字符串比较时是否区分字母的大小写。默认为False。CaseSensitive 说明属性【例15.3】使用DataSet对象访问XSCJ数据库的xs数据表,将所有记录以表格的形式显示出来。在Pag e_load()事件处理中输入以下程序代码:SubPage_Load(SenderAsObject,eAsEvent Args)DimconnAsNewSqlConnection()DimcmdAsNewSqlC ommand()DimDsStu1AsNewDataSet()conn.ConnectionString= "DataSource=MySRV1;IntegratedSecurity=false;"&_"InitialCat alog=XSCJ;PacketSize=4096;uid=sa;pwd=;"conn.Open()cmd .Connection=conncmd.CommandText="Selectfromxs" DimDtAdptAsNewSqlDataAdapter(cmd)DtAdpt.Fill(DsStu1,"stu dents")DataGrid1.datasource=DsStu1DataGrid1.DataBind() ''数据绑定Conn.Close()''关闭到数据 源的连接EndSub2.数据表集合和DataTable对象DataSet的所有数据表包含于数据表集合DataTableC ollection中,通过DataSet的Tables属性访问DataTableCollection。DataTableColle ction有以下两个属性:Count:DataSet对象所包含的DataTable个数。Item({index,n ame}):获取DataTableCollection中下标为index或名称为name的数据表。DataTableColle ction有以下常用方法:Add({table,name}):向DataTableCollection中添加数据表。C lear():清除DataTableCollection中的所有数据表。CanRemove(table):判断参数table 指定的数据表能否从DataTableCollection中删除。Contains(name):判断名为name的数据表是否 被包含在DataTableCollection中。IndexOf({table,name}):获取数据表的序号。Re move({table,name}):删除指定的数据表。RemoveAt(index):删除下标为index的数据表。获取 或设置数据表名。TableName获取数据表的所有行,即DataRowCollection集合。Rows获取或设置数据表的 主键.PrimaryKey获取与数据表相关的DataView对象。DataView对象可用来显示DataTable对象的部分数 据。可通过对数据表选择、排序等操作获得DataView(相当于数据库中的视图)。DefaultView获取DataTable对 象所属的DataSet对象。DataSet获取数据表的所有字段,即DataColumnCollection集合。Column s说明属性每个数据表都是一个DataTable对象。表15.13、表15.14和表15.15分别列出了DataTabl e对象的常用属性、常用方法和事件。获取包含错误的DataRow对象数组。GetErrors()创建一个与当前数据表有相同字段 结构的数据行。NewRoe()复制DataTable对象的结构和数据,返回与本DataTable对象具有同样结构和数据的Dat aTable对象。Copy()说明方法数据行被成功删除后将触发该事件。该事件参数为DataRowDeleteEven tArgs,可以取的值与RowChanged事件的DataRowChangeEventArgs参数相同。RowDeleted当 数据行更新成功时将触发该事件。该事件参数为DataRowChangeEventArgs,可以取的值为:Action(对数据行进行的 更新操作名,包括:Add—讲行加入数据表;Change—修改数据行内容;Commit—数据行的修改已提交;Delete—数据行已被 删除;RollBack—数据行的更改被取消);Row(发生更新操作的数据行)。RowChanged当数据行中某字段值发生变化时 将触发该事件。该事件参数为DataColumnChangeEventArgs,可以取的值为:Column(值被改变的字段);Row (字段值被改变的数据行)。ColumnChanged说明事件DataTable的创建有两种方法,一种是由数据库中的数 据创建,这需要使用DataAdapter对象的Fill方法填充数据集;另一是直接使用程序代码创建数据表。3.数据列集合和Dat aColumn对象数据表的所有字段都被存放于数据列集合DataColumnColection中,通过DataTable的Colu mns属性访问DataColumnCollection。Count:数据表所包含的字段个数。Item({index, name}):获取下标为index或名称为name的字段。数据表中的每个字段都是一个DataColumn对象。获取包含该字段 的DataTable对象。Table获取或设置新增数据行时,字段的值是否可修改。默认值为False。ReadOnly获取或 设置新增数据行时,字段的默认值。.DefaultVale获取或设置字段的数据类型。DataType获取或设置字段名。Co lumnName获取或设置字段标题。若未指定字段标题,则字段标题即为字段名。该属性常与DataGrid配合使用。Caption 设置该字段可否为空值。默认值为true。AllowDBNull说明属性通过DataColumn对象的DataTyp e属性设置字段数据类型时,不可直接设置数据类型,而要按照以下语法格式:DataColumn对象名.DataType=Syst em.Type.GetType("数据类型")其中的"数据类型"取值为.NETFramework数据类型,常用的值如下:Sy stem.Boolean—布尔型System.Char—字符型System.DateTime—日 期型System.Decimal—数值型System.Double—双精度数据类型 System.Int16—短整数类型System.Int32—整数类型System.Int6 4—长整数类型System.Single—单精度数类型System.String—字符串类型4.数据 行集合和DataRow对象Item({index,columnName}):获取或设置指定字段的值。Table:获取包 含该数据行的DataTable对象。DataRow对象的方法主要有:AcceptChanges():将所有变动过的数据行更 新到DataRowCollection。Delete():删除数据行。IsNull({colName,index,Co lumn对象名}):判断指定列或Column对象是否为空值。使用Select的Where子句指定条件进行过滤和Orderb y子句进行排序;使用DataView对象来筛选和排序数据。1.DataView对象及使用DataView对象可看作Da taTable对象的子集,它是DataTable的映射。DataView与DataTable的关系类似于数据库系统中的视图与表的关 系。DataView对象的主要属性有:AllowDelete:获取或设置是否允许删除DataView中的数据行。类似的属性还有AllowEdit、AllowNew。Count:获取DataView对象中包含的数据行数。Item(recordIndex):获取DataView对象中下标为recordIndex的DataRowView对象(即DataView中的数据行),Item可省略不写。RowFilter:获取或设置选取数据行的表达式(即过滤条件)。Sort:获取或设置排序字段和方式。Table:获取或设置DataView对象对应的数据表名。DataView对象的主要方法有:AddNew():添加一条记录到DataView对象中。Delete(index):删除下标为index的数据行。DataView对象最主要的用途是与数据显示控件(Repeater、DataList和DataGrid)配合使用,可方便地绑定到这3个服务器控件,实现数据的展示,并能实时反映出数据的变化。2.执行带参数查询使用DataAdapter对象执行带参数的SQL查询,其方式与在Command对象中执行带参数查询是一样的,因为DataAdapter是建立在Command对象之上的。【例15.5】通过执行SQLServer2000数据库xscj的存储过程xsInfo,查询学生的学号、姓名、课程名、成绩和学分等信息并显示。创建存储过程xsInfo的SQL命令如下:Usexscj/检查是否xsInfo存储过程是否已存在,若是则删除/IfExists(SelectnameFromsysobjectsWherename=''xsInfo''andtype=''P'')DropProcedurexsInfoGo/创建存储过程xsInfo/CREATEPROCEDURExsInfoASSelectxs.XH,xs.XM,kc.KCM,cjFromxs,kc,xs_kcWherexs.XH=xs_kc.XHandkc.KCH=xs_kc.KCHGO方法一:使用Command对象执行存储过程xsInfo。(4)编译程序。选择主选单的“生成”?“生成解决方案”。(5)运行程序,结果如图15.5所示。 |
|