




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章数据库应用回顾数据库相关知识ADO.NET基本概念、结构、组件使用Connection对象创建连接使用Command对象操作数据使用DataReader对象检索数据使用DataAdapter对象和DataSet对象管理数据8.1.1关系数据库模型数据库
——以一定的组织形式存放在计算机存储介质上的相互关联的数据的集合。关系数据库
——是以关系模型来组织的。 关系模型中数据的逻辑结构是一张二维表用数据库保存数据的好处:数据库中的数据实现了整体数据的结构化数据的共享性好,冗余度低数据的独立性高数据由DBMS统一管理和控制数据库管理系统(DataBaseManagementSystme)专门用于管理数据库的计算机系统软件(DBMS)数据定义、建立、维护、查询和统计对数据的完整性、一致性、安全性进行控制著名的数据库管理系统:OracleSQLserverSybaseInformix数据库管理系统的基本功能数据定义:(DataDescriptionLanguage)数据结构、完整性约束、数据库用户、口令、存取权限等数据操纵:(DataManipulationLanguage)检索、插入、修改和删除数据库运行管理:并发控制、安全性检验、完整性检查、内部维护数据组织、存储管理:分类组织存取数据数据库的建立与维护数据通讯接口数据库学习如何设计数据库
范式、E-R图如何使用数据库
SQL语句(结构化查询语句) 编程中的调用方法学生选课信息学号姓名出生日期课程编号课程名称课程性质课程学分成绩21010101张芳1983-12-52112105C#语言基础专修39021010102刘超1983-11-222112348管理信息系统选修2.58521010501林华1981-9-132121345VB程序设计选修37021010502王涛1981-7-82121331计算机信息检索方向378学号姓名出生日期课程编号课程名称课程性质课程学分成绩21010101张芳1983-12-52112105C#语言基础专修39021010101张芳1983-12-52112348管理信息系统选修2.58121010102刘超1983-11-222112348管理信息系统选修2.58521010501林华1981-9-132121345VB程序设计选修37021010502王涛1981-7-82121331计算机信息检索方向378表8.1Students表StudentNoStudentNameSexbirthdayNativeAddress21010101张芳女1983-12-5江苏南京南京农业大学21010102刘超男1983-11-22江苏南京南京农业大学21010501林华男1981-9-13江苏南京南京农业大学列行主键学生信息管理系统
1.学生表(Students):用来描述学生的属性2.课程表(Courses):用来描述课程的属性3.成绩表(Scores):用来记录学生所学的课程对应成绩信息学生课程选修mn课程学号出生日期成绩课程名称课程学分姓名课程号ER图StudentNoStudentNameSexbirthdayNativeAddressCourseNoCourseNameCourseTypeOpenTermCourseHoursCreditStudentNoCourseNoScore物理模型(表设计)根据数据库类型,指定表字段(属性)的数据类型,如数据类型数据类型数据库类型数据库字段类型整型数字SQLServerint、bigintOracleintegerAccess数字、自动编号字符SQLServerchar、Varchar、NvarcharOracledhar、NChar、Varchar2、NVarchar2、Access文本、备注实数SQLServerfloat、double、decimalOraclefloat、real、number、decimalAccess数字(带精度)………………数据库设计
ER图——概念数据模型 物理数据模型 数据库关系图数据库练习:设计并创建数据库1.认识SQLServer2005Express或20002.设计数据库以学生选课为例子3.新增数据库新建表、新增/修改/删除数据4.备份数据库5.还原数据库6.新增数据手工方式(非编程方式)学习SqlServer2000打开SqlServer200企业管理器,使用Windows集成认证或SQLserver认证,进入SqlServer2005Express新建数据库右键点击数据库,选择新建数据库,在DatabaseName中输入数据库名称新建数据库输入数据库名称,选择确定,这样就可以创建数据库。新增/修改/删除表和数据实际操作举例还原数据库右键点击数据库,选择“还原数据库”还原数据库备份数据库右键点击需要备份的数据库,从任务中选择备份练习示例实际操作举例如何使用数据库手工方式编程方式SQL语句(结构化查询语言)增/删/改/查询程序调用8.1.2结构化查询语言(SQL)1.select语句——查询
SELECT
select_list
[INTOnew_table]
FROM
table_source
[WHEREsearch_condition]
[GROUPBYgroup_by_expression]
[HAVINGsearch_condition]
[ORDERBYorder_expression[ASC|DESC]]
例如:SELECT*FROMCoursesSELECTCourseNo,CourseNameFROMCourses大小写不敏感SELECT
select_list
[INTOnew_table]
FROM
table_sourceselect_list的修饰符可以有ALL/DISTINCT/Topn[PERCENT]ALL-指定在结果集中可以显示重复行。ALL为默认设置DISTINCT——指定在结果集中只能显示唯一行TOPn[PERCENT]——指定只从查询结果集中输出前n行。n是介于0和之间的整数。如果还指定了PERCENT,则只从结果集中输出前百分之n行。当指定时带PERCENT时,n必须是介于0和100之间的整数。select_list可以是*,也可以是用逗号分割的字段名INTO:创建新表并将结果行从查询插入新表中FROM:从table_source表/视图/结果集等中查询数据结果集——利用联接操作而得到SELECT*FROMtable1LEFTOUTERJOINtable2 ONtable1.c3=table2.c3SELECT*FROMtable1INNERJOINtable2 ONtable1.c3=table2.c3RightFull联接操作的类型INNER
指定返回所有相匹配的行对。废弃两个表中不匹配的行。如果未指定联接类型,则这是默认设置。
LEFT[OUTER]指定除所有由内联接返回的行外,所有来自左表的不符合指定条件的行也包含在结果集内。来自左表的输出列设置为NULL。
RIGHT[OUTER]指定除所有由内联接返回的行外,所有来自右表的不符合指定条件的行也包含在结果集内。来自右表的输出列设置为NULL。
FULL[OUTER]如果来自左表或右表的某行与选择准则不匹配,则指定在结果集内包含该行,并且将与另一个表对应的输出列设置为NULL。除此之外,结果集中还包含通常由内联接返回的所有行。
WHERE——设定查询条件条件包括>、<、>=、<=、<>、LIKELike模糊查询——通配符星号(*):0~n个字符问号(?):1个字符多个条件:AND(与)、OR(或)、NOT(非)Select*fromScoreswherescore>=80Select*fromScoreswhereStudentNoLike’21*’Select*fromScoreswhereScore<=80ANDScore>=70OrderBy——排序按照指定字段进行依次排序ASC指定按递增顺序,从最低值到最高值对指定列中的值进行排序,默认。DESC指定按递减顺序,从最高值到最低值对指定列中的值进行排序。Select*fromscoresorderbyStudentNo,CourseNoGroupBy——分组指定用来放置输出行的组如果SELECT子句<selectlist>中包含聚合函数,则计算每组的汇总值。指定GROUPBY时,选择列表中任一非聚合表达式内的所有列都应包含在GROUPBY列表中,或者GROUPBY表达式必须与选择列表表达式完全匹配。SELECTCourseNo,Count(CourseName)FROMCoursesGroupbyCourseNo,CourseName2.insert语句——向表中新增记录insertintotableName(col1,col2,…,colN) Values(val1,val2,…,valN)表名列名(字段名)值InsertintoStudents(StudentNo,StudentName)Values(‘21010503’,’张小峰’)逗号相隔,不区分大小写3.Update语句——更新记录UPDATEtableNameSETcolumn1=value1,column2=value2,…,columnN=valueN
WHEREconditionUPDATEStudentsSETStudentName='王鹏'WHEREStudentNo='21010503‘将学号为“21010503”的记录中的StudentName字段内容更新为“王鹏”。4.Delete语句——删除记录DELETEFROMtableNameWHEREconditionDELETEFROMStudentsWHEREStudentNoLIKE’210105*’将Students表中所有以210105开头的学号的记录删除高级应用:视图——View创建一个虚拟表,该表以另一种方式表示一个或多个表中的数据CREATEVIEW[<database_name>.][<owner>.]
view_name[(column[,...n])]
[WITH<view_attribute>[,...n]]
AS
select_statement
[WITHCHECKOPTION]
<view_attribute>::=
{ENCRYPTION|SCHEMABINDING|VIEW_METADATA}高级应用:存储过程——ProcedureCREATEPROC[EDURE]procedure_name[;number]
[{@parameterdata_type}
[VARYING][=default][OUTPUT]
][,...n]
[WITH
{RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION}]
[FORREPLICATION]
ASsql_statement[...n]
——保存起来的可以接受和返回用户提供的参数的Transact-SQL语句的集合执行存储过程——exec执行存储过程:[[EXEC[UTE]]
{
[@return_status
=]
{procedure_name[;number]|procedure_name_var
}
[[@parameter
=]{value|@variable[OUTPUT]|[DEFAULT]]
[,...n]
[WITHRECOMPILE]执行字符串:EXEC[UTE]({@string_variable|[N]'tsql_string'}[+...n])显示指定ID的用户信息及LastName高级应用:函数——Function一组Transact-SQL语句。可以从查询中调用,也可以通过EXEC语句执行CREATEFUNCTION[owner_name.]function_name
([{@parameter_name[AS]parameter_data_type[=default]}[,...n]])RETURNSscalar_return_data_type[WITH<function_option>[[,]...n]][AS]BEGIN
function_body
RETURNscalar_expression
END查询数据库记录点击NewQuery或新查询,也就是Sqlserver2000中的查询分析器。查询练习:答案(a)NorthWind数据库中Employees表中的所有信息。Select??? (b)NorthWind数据库中员工(Employees表)lastname为Peacock,分类名称为Seafood的所有订单(order)的前100条信息。
selecttop100???课堂练习1.Select*fromemployees2.SELECTTOP100dbo.Orders.*FROMdbo.ProductsINNERJOINdbo.[OrderDetails]ON dbo.Products.ProductID=dbo.[OrderDetails].ProductIDINNERJOINdbo.CategoriesONdbo.Products.CategoryID=dbo.Categories.CategoryIDINNERJOINdbo.EmployeesINNERJOINdbo.OrdersONdbo.Employees.EmployeeID=dbo.Orders.EmployeeIDONdbo.[OrderDetails].OrderID=dbo.Orders.OrderIDWHERE(dbo.Employees.LastName='Peacock')AND(dbo.Categories.CategoryName='seafood')修改数据库记录修改练习:答案(a)在NorthWind数据库中的Employees表中新增一条记录,EmployeeID=10,LastName=‘MyName’,FirstName=’MyFirstName’。Insert???(b)修改NorthWind数据库中Employees表中EmployeeID=8的员工信息,将lastname改为PeacockMY。
update???课堂练习Insertintoemployees(employeeid,lastname,firstname)values(10,’MyName’,’MyFirstName’)Updateemployeessetlastname=‘PeacockMy’whereEmployeeID=8视图练习:答案在NorthWind数据库中的Employees表中新增一个视图MyView,用于显示所有产品的供应商信息。View????存储过程练习:新增存储过程1,实现查询所有员工信息。新增存储过程2,实现查询编号为8的员工信息。新增存储过程3,实现查询编号为8的员工LastName,并使用output参数返回。在查询分析器中的执行存储过程Exec存储过程名参数课堂练习SELECTdbo.Products.*,dbo.Suppliers.CompanyNameFROMdbo.SuppliersRIGHTOUTERJOINdbo.ProductsONdbo.Suppliers.SupplierID=dbo.Products.SupplierID存储过程:1.CREATEPROCEDUREmyProc1ASselect*fromemployeesGO3.createPROCEDURE[dbo].[myproc2] @employeeidint,@lastnamevarchar(200)outputASBEGIN select@lastname=lastnamefromemployeeswhereemployeeid=@employeeidENDGOdeclare@lastnamevarchar(1020)execmyproc2'8',@lastnameoutputprint@lastname函数练习:答案新增自定义函数,完成如下功能:计算某一个供应商提供的所有产品的平均价格提示:在product表中unitprice为产品价格,supplierid为供应商编号fucntion????利用用户自定义函数查询supplierid=1的所有产品平均价格,并print出来??课堂练习CREATEFUNCTIONmyFunction( @supplieridint)RETURNSfloatASBEGINdeclare@averpricefloatselect@averprice=avg(unitprice)fromproductswheresupplierid=@supplieridgroupbysupplieridreturn@averpriceENDGO调用:selectdbo.myfunction('1')asmyprice或printdbo.myfunction('1')注意使用帮助——联机丛书课外思考题学生学习管理----?ER图?若干学生组成一个班级每个班级设立一个学生作为班长管理相关事务每个学生可以选择多门课程学习,每门课程也可以由多个学生选择每门课程有相关先修课程教师可以讲授多门课程,并可以分别选择多本教材8.2ADO.NET概述8.2.1ADO.NET基本概念与特点ADO(ActiveXDataObjects)是一个COM组件库,主要包含Connection、Command、Recordset和Field对象。ADO.NET附带了4个数据库客户命名空间System.Data.SqlClient——用于SQLServerSystem.Data.OracleClient——用于OracleSystem.Data.Odbc——用于ODBC数据源System.Data.OleDb——用于通过OLEBC实现的数据库数据库用户需要时,可以随时访问数据用户计算机向数据库服务器发送请求客户端不同的访问方法和技术ADO.NET打开数据库操作数据库关闭数据库打开连接生成操作命令读写操作命令数据集关闭连接数据适配器8.2.2ADO.NET对象模型的结构Connection对象DataAdapter对象Command对象DataReader对象DataSet对象WinFormWebForm其他应用程序ADO.NET数据提供程序
1、数据提供程序(DataProvider)
——托管提供程序 负责与物理数据源的连接2、数据集(DataSet) 代表实际的数据ADO.NET的对象模型的组成
数据提供程序(DataProvider)根据物理数据源类型的不同,有不同的数据提供程序:1、SQLServer对象 ——Sql前缀2、Oracle对象 ——Oracle前缀3、ODBC对象 ——Odbc前缀4、OLEDB对象 ——OleDb前缀1、Connection对象
——表示与一个数据源的物理连接打开和关闭连接,改变数据库和管理事务2、Command对象
——代表在数据源上执行的一条SQL对象和一个存储过程
1)独立地创建和执行不同的Command对象
2)使用DataAdapter对象 包含4个Command对象3、DataReader对象
——用于从数据源中获取仅转发的、只读的数据源,往往用于显示查询的结果。不能用代码直接创建,只能通过调用Command对象的ExecuteReader()方法来创建4、DataAdapter对象(数据适配器)
——用于Connection对象和DataSet数据集的数据通信。管理了4个Command对象:
1、SelectCommand对象
2、UpdateCommand对象
3、InsertCommand对象
4、DeleteCommand对象填充DataSet数据集
——Fill()方法
更新、插入、删除数据
——Update()方法
数据集——DataSet记录在内存中的数据,结构如图8.2所示离线数据库
1、离线的关系数据库,数据来源多样2、数据集由两个基本对象组成:
1)DataTableCollection
包含零个或多个DataTable对象 每个DataTable对象由Columns集合、Rows集合和Constraints集合构成
2)DataRelationCollection
包含零个或多个DataRelation对象。3、访问DataSet的方式:
1)作为关系数据库中的表
2)作为XML(可扩展标记语言)结构数据8.3创建连接8.3.1Connection连接字符串——ConnectionString1、用于提供登录数据库和指向特定数据库所需的信息2、唯一的非只读属性语法举例:''Provider=SQLOLEDB;DataSource=MSSQLServer;InitialCatalog=MyDB;IntegratedSecurity=SSPI''Connection对象负责:数据库连接和事务管理1、数据库服务器名2、IP地址3、4、localhost5、(local)或(local)\SQLExpress6、.或.\SQLExpress数据服务器的几种表示方法:1.与SQLServer数据库的连接Windows集成安全性认证方式:(1)SQLClient方式的字符串如下:''DataSource=;PersistSecurityInfo=False;InitialCatalog=MyDB;IntegratedSecurity=SSPI;'‘(2)OLEDB方式的字符串如下:''Provider=SQLOLEDB;DataSourse=;PersistSecurityInfo=False;InitialCatalog=MyDB;IntegratedSecurity=SSPI;'‘(3)ODBC方式的字符串如下:''Driver={SQLServer};Server=;Database=MyDB;Trusted_Connection=Yes;UID=Administrator''1.与SQLServer数据库的连接SQLServer身份认证方式:(1)SQLClient方式的字符串如下:’’DataSource=UPC-CHENC;InitialCatalog=Northwind;UserID=sa’’(2)OLEDB方式的字符串如下:''Provider=SQLOLEDB;DataSource=.;UserID=sa;InitialCatalog=Northwind'‘''Provider=SQLOLEDB;DataSource=localhost;Database=NorthWind;UID=sa;PWD=pwd;''2.与Access数据库的连接设Access2000数据库文件的路径为C:\data.mdb(1)OLEDB方式:''Provider=Microsoft.Jet.OLEDB.4.0;UserID=Admin;DataSource=C:\data.mdb;'‘(2)ODBC方式:''Driver={MicrosoftAccessDriver(*.mdb)};DBQ=C:\data.mdb;UID=admin;''常用8.3.2创建并使用连接对象connection对象的两种创建方式:1)使用带参数的构造函数:System.Data.SqlClient.SqlConnectionconn=newSystem.Data.SqlClient.SqlConnection(''Provider=Microsoft.Jet.OLEDB.4.0;UserID=Admin;DataSource=C:\\data.mdb;'');2)使用无参数构造函数,然后修改ConnectionString属性::System.Data.SqlClient.SqlConnectionconn=newSystem.Data.SqlClient.SqlConnection();conn.ConnectionString=''Provider=Microsoft.Jet.OLEDB.4.0;UserID=Admin;DataSource=C:\\data.mdb;'';打开连接:Open() ——建立一个打开的连接关闭连接:Close() ——关闭已打开的连接常用的数据连接打开与关闭方法:利用try…catch…finally语句块确保在finally块中关闭任何已打开的连接。
try{ //Opentheconnection
conn.Open(); //Dosomethinguseful}catch(Exceptionex){ //Dosomethingabouttheexception}finally{ //Ensurethattheconnectionisfreed
conn.Close();}2.使用using语句块using语句块保证在退出语句块时实现对象能立即释放。stringsource="server=(local)\\NetSDK;"+"integratedsecurity=SSPI;"+"database=Northwind";using(SqlConnectionconn=newSqlConnection(source)){ //Opentheconnection conn.Open(); //Dosomethinguseful}8.3.3事务处理1、使用事务处理的目的:保证在数据更新过程中数据操作的安全与一致2、大型数据库服务器都支持事务处理3、事务处理的方法:
通过Connection对象的BeginTransaction方法实现usingSystem.Data.SqlClient;stringconnString="datasource=;persistsecurityinfo=False;initialcatalog=MyDB;integratedsecurity=SSPI;";SqlConnectionconn=newSqlConnection(connString);SqlTransactiontx;try{ conn.Open(); //打开数据连接
tx=conn.BeginTransaction(); //执行数据操作
tx.Commit(); //提交事务}catch(Exceptionex){ tx.Rollback(); //回滚事务}finally{ conn.Close();}事务处理的例子:8.4使用Command对象与DataReader对象
8.4.1简介Command对象——根据设置的SQL语句对数据库进行操作。DataReader对象——使用ExecuteReader方法返回的结果集不同的数据源有不同的Command对象和DataReader对象:1、OleDbCommand和OleDbDataReader——System.Data.OleDb(NameSpace)2、SqlCommand和SqlDataReader——System.Data.SqlClient(NameSpace)8.4.2使用Command对象操作数据1.Command对象的建立构造函数含义Command()创建一个默认数据命令实例Command(cmdTxt)创建一个数据命令实例,设置CommandText属性为参数cmdTxt中指定的字符串Command(cmdTxt,conn)…,设置Connection属性为conn中指定的数据连接对象Commnad(cmdTxt,conn,trans)…,设置Transcation属性为参数trans中指定的事务对象2.Command对象的属性(1)CommandText属性——是字符串属性,包含要执行的SQL语句或数据源中存储过程的名字;(2)Connection属性——指定要执行数据命令的连接对象,即指定要执行数据操作的数据源;(3)Transaction属性——指定执行数据命令登记的事务对象。(4)CommandTimeout属性——决定数据命令出错前等待服务器响应的时间。2.Command对象的属性(5)CommandType属性——命令类型,是SQL语句(Text,默认)还是存储过程(StoredProcedure)、返回表(TableDirect,仅OleDbCommand支持)(6)Parameters属性——命令参数,增加参数方法Add、Insert,去除参数方法Remove、RemoveAt(7)UpdatedRowSource属性——决定Command对象在执行存储过程时如何使用输出的参数。
Both:将输出参数和第一个返回行都映射到DataSet中的已更改的行。
FirstReturnedRecord:将第一个返回行中的数据映射到DataSet中的已更改的行。
None:忽略任何返回的参数或行。
OutputParameters:将输出参数映射到DataSet中的已更改的行。3.执行数据命令CommandType属性要与CommandText属性对应Text ——SQL语句StoredProcedure ——存储过程构造函数含义ExecuteeNonQuery()执行一个命令(update,insert,detele)但不返回结果集ExecuteReader()执行一个命令返回一个DataReader对象ExecuteScalar()执行一个命令返回一个值(结果集的第一行第一列)ExecuteXmlReader()SqlCommand专有的方法,执行一个命令,返回一个XmlReader对象,可用于传送数据库中返回的XML代码段Command对象用于执行命令的相关方法如表8.6所示。【例8.1】使用Command对象的ExecuteNonQuery方法执行SQL语句。
usingSystem;usingSystem.Data.SqlClient;publicclassExecuteNonQueryExample1{publicstaticvoidMain(string[]args){ //连接字符串,连接本地的MSSQLServer服务器stringconnString="datasource=;persistsecurityinfo=False;initialcatalog=MyDB;integratedsecurity=SSPI;"; //SQL语句,更新Students表中的学生姓名
stringsqlString="UPDATEStudentsSETStudentName='王鹏'"+ "WHEREStudentNo='21010503'";
SqlConnectionconn=newSqlConnection(connString);
conn.Open(); //打开连接
SqlCommandcmd=newSqlCommand(sqlString,conn); //建立数据命令对象
introwsReturned=cmd.ExecuteNonQuery(); //执行命令,返回影响的行数
Console.WriteLine("{0}记录已更新",rowsReturned); conn.Close(); //关闭连接}}练习一下insert语句和delete语句首先创建数据库MyDB(学生信息管理)数据库存储过程如下:--填入客户表CREATEPROCEDUREPRO_INSERT_CUSTOMER @Customer varchar(50), @Contact varchar(50), @Address varchar(200), @resultint OUTPUTAS SELECT@result=MAX(CustomerNo)+1FROMCustomers IF@resultISNULL SET@result=1 INSERTINTOCustomers(CustomerNo,Constomer,Contact,Address)VALUES(@result,@Customer,@Contact,@Address)GO
该存储过程接受三个参数作为字段客户名称、联系人和联系地址的值,并生成一个唯一整数作为客户标识插入数据库,最后将生成的客户标识作为输出参数返回。【例8.2】使用Command对象的ExecuteNonQuery方法执行存储过程
【例8.2】使用Command对象的ExecuteNonQuery方法执行存储过程
usingSystem;usingSystem.Data;usingSystem.Data.SqlClient;publicclassExecuteNonQueryExample2{publicstaticvoidMain(string[]args){//连接字符串,连接本地的MSSQLServer服务器stringconnString="datasource=;persistsecurityinfo=False;initialcatalog=MyDB;integratedsecurity=SSPI;";//建立连接对象,打开连接SqlConnectionconn=newSqlConnection(connString);conn.Open();
//建立数据命令对象,设定数据命令类型为存储过程SqlCommandcmd=newSqlCommand("PRO_INSERT_CUSTOMER",conn);cmd.CommandType=CommandType.StoredProcedure;//定义存储过程输入参数cmd.Parameters.Add(newSqlParameter("@Customer",SqlDbType.VarChar,50,"Customer"));
cmd.Parameters.Add(newSqlParameter("@Contact",SqlDbType.VarChar,50,"Contact"));cmd.Parameters.Add(newSqlParameter("@Address",SqlDbType.VarChar,200,"Address"));//定义输出参数cmd.Parameters.Add(newSqlParameter("@result",SqlDbType.VarChar,200,ParameterDirection.Output,false,0,0,CustomerNo",DataRowVersion.Default,null));cmd.UpdatedRowSource=UpdateRowSource.OutputParameters; //设定输入参数的值cmd.Parameters["@Customer"].Value="星光机械厂";cmd.Parameters["@Contact"].Value="张三";cmd.Parameters["@Address"].Value="长江路111号"; //执行数据命令cmd.ExecuteNonQuery(); //获得输出参数值并显示在命令行Console.WriteLine("插入的客户ID是:{0}",cmd.Parameters["@result"].Value); //关闭连接conn.Close(); }}【例8.3】使用Command对象的ExecuteScalar方法执行SQL语句。usingSystem;usingSystem.Data.SqlClient;publicclassExecuteScalarExample{publicstaticvoidMain(string[]args){//连接字符串,连接本地的MSSQLServer服务器stringconnString="datasource=;persistsecurityinfo=False;initialcatalog=MyDB;integratedsecurity=SSPI;";//SQL语句,查询Customers表中的记录数stringsqlString="SELECTCOUNT(*)FROMStudents";SqlConnectionconn=newSqlConnection(connString);conn.Open();//打开连接
//建立数据命令对象SqlCommandcmd=newSqlCommand(sqlString,conn); obejcto=cmd.ExecuteScalar();//执行命令,返回影响的行数Console.WriteLine("记录数为:{0}",o);conn.Close();//关闭连接}}8.4.3使用DataReader对象检索数据DataReader对象——返回结果集
1)提供了一个只读的、单向的游标,用于访问结果集的行
2)DataReader需要的开销很少,效率很高,因为内存中每次仅有一个数据行
3)DataReader对象不能直接实例化,必须通过Command对象的ExecuteReader方法来生成
4)DataReader对象最主要的方法是Read方法,用来检索行,然后用数组来访问行中的字段
5)在DataReader遍历记录时,数据连接必须保持打开状态,直到DataReader对象被关闭为止【例8.4】使用Command对象和DataReader对象获取数据。usingSystem;usingSystem.Data.SqlClient;publicclassExecuteReaderExample{publicstaticvoidMain(string[]args){//连接字符串,连接本地的MSSQLServer服务器stringconnString="datasource=;persistsecurityinfo=False;"+ "
initialcatalog=MyDB;integratedsecurity=SSPI;";
stringsqlString="SELECT*FROMStudents";SqlConnectionconn=newSqlConnection(connString);//建立连接对象conn.Open();//打开连接SqlCommandcmd=newSqlCommand(sqlString,conn);SqlDataReaderrdr=cmd.ExecuteReader(); //迭代结果集中的行,直到读完最后一条记录Read方法返回falsewhile(rdr.Read()){ Console.WriteLine("{0},{1},{2},{3},{4},{5}",rdr[0],rdr["StudnetName"],
rdr["Sex"],rdr["Birthday"],rdr["Native"],rdr["Address"]);}rdr.Close();//关闭DataReaderconn.Close(); //关闭连接}}8.5使用DataAdapter对象与DataSet对象8.5.1使用DataSet对象管理数据DataSet——内存数据库 离线数据库(数据库/XML文件/程序代码)属性含义Tables数据集中数据表的集合,是一个DataTabelCollection集合类,通过集合类的通用操作方法Add、Remove等来添加、删除数据库DataTable对象Relations数据集中数据关系的集合,DataRelationCollection集合类,通过集合类的通用操作方法Add、Remove等来添加、删除数据库DataRelation对象ExtendedProperties与DataSet相关的自定义用户信息的集合HasErrors判断DataSet中的任一DataTable对象是否存在错误DataSetName当前DataSet的名称CaseSenstive字符串比较是否区分大小写Locate数据表中字符串的区域设置信息DataSet对象的常用属性2.数据集中DataTable对象的构建DataSet类的Tables属性
——一个包含数据表的集合构造DataTable类对象
——使用无参数的构造函数和带表名参数的构造函数。DataTable类的一些属性:
1、Columns属性是该表的列的集合;
2、Rows属性是该表的行的集合;
3、PrimaryKey属性是该表主键的列的数组;
4、MinimumCapacity属性是该表最初的大小(记录行数,默认为25);
5、ParentRelations和ChildRelations属性是该表的父、子关系的集合。DataTable对象的Columns属性
——一个包含数据表的列的集合,存储DataColumn对象。构造函数如表8.8所示。3.数据表的字段(列)操作1、ColumnName属性指定列的名称
2、DataType属性指定该列的数据类型,默认类型为String*3、Expression属性为该列指定一个表达式字符串
4、ColumnMapping属性指定该列和XML元素的映射方式
5、AllowDBNull属性用来获取或设置在行中该列是否允许空值
6、Caption属性用来获取或设置列的标题,若没有设置,则返回ColumnName的值,它常常用来显示DataColumn的描述文字或友好名称
7、Ordinal属性用来获取在集合中的位置(索引)
8、ReadOnly属性用来指定该列在行中是否不允许修改
9、Unique属性用来指定该列在每一行中的值是否必须是唯一
10、DefaultValue属性用来指定在创建新行时该列的默认值
11、MaxLength属性用来获取或设置文本列的最大长度(字符个数)
12、AutoIncrement属性:指定添加新行时该列的值是否自动递增
13、AutoIncrementStep属性:指定添加新行时该列的值自动递增时,增量的大小(默认)
14、AutoIncrementSeed属性分别用来指定添加新行时该列的值自动递增时,列的起始值。
15、通过调用Columns集合的Add、AddRange、Insert、Remove和Clear方法可分别进行列的添加、插入、删除和清除操作。DataColumn类的一些属性:利用AddRange方法构造学生信息管理系统中数据表Score的列结构。DataTabledataTable1=newDataTable();dataTable1.TableName="Score";DataColumndataColumn1=newDataColumn();DataColumndataColumn2=newDataColumn();DataColumndataColumn3=newDataColumn();dataColumn1.Caption="学号";dataColumn1.ColumnName="studentno";dataColumn1.MaxLength=8;dataColumn2.Caption="课程号";dataColumn2.ColumnName="courseno";dataColumn2.MaxLength=8;dataColumn3.Caption="成绩";dataColumn3.ColumnName="score";dataColumn3.DataType=typeof(Single);DataColumn[]cols=newDataColumn[3];cols[0]=dataColumn1;cols[1]=dataColumn2;cols[2]=dataColumn3;dataTable1.Columns.AddRange(cols);4.数据表的记录(行)操作DataTable类的Rows属性
——一个包含数据表的行的集合,存储DataRow类对象。DataRow类封装了数据表中行的所有操作。DataRow类的RowState属性反映了记录行的操作状态
DataRowState枚举值:
Added(已添加)——当调用Rows集合的Add或AddRange方法添加记录行时
Deleted(已删除)——当调用DataRow类的Delete方法
Detached(已创建)——当调用DataTable类的NewRow方法时
Modified(已修改)——当通过DataRow类的Item属性来指定该行的字段值时
Unchanged(未更改)——当调用AcceptChanges方法时通过RowState属性,DataRow可以维护数据行的不同状态,直到使用AcceptChanges方法确认更新或RejectChanges方法取消更新。(1)添加记录行按下列步骤操作:①使用DataTable对象的NewRow方法创建一个DataRow对象②指定DataRow对象中不同字段的值③调用DataTable对象Rows集合属性的Add方法添加记录行④调用DataTable类的AcceptChanges方法接受该表进行的所有更改例如,下面的代码向Scores表中添加一个记录。DataRowrow1=dataTable1.NewRow();row1[0]="21010101"; //学号row1[1]="2112105"; //课程号row1[2]="80.0"; //成绩dataTable1.Rows.Add(row1);dataTable1.AcceptChanges(); //接受更改(2)查找记录行——使用Rows集合的Find方法查找指定主键值的记录行。方法参数是要查找的主键值或主键值的数组。例如在Scores表中查找学号为“21010102”的记录行:DataRowfindRow=dataTable1.Rows.Find("21010102");if(findRow!=null) //查找到{ //TODO… }需要说明的是,在通过Find方法查找记录行时,该表需指定主键才能进行查找。(3)修改记录行按下列步骤进行:①获取指定记录行的DataRow对象;②调用DataRow对象的BeginEdit方法进入记录行的编辑模式;③更改该记录行的列的值;④调用DataRow对象的EndEdit方法退出记录行的编辑模式;⑤调用DataRow对象的AcceptChanges方法接受对该行的所有修改,或调用所在DataTable对象的AcceptChanges方法接受对该表进行的所有更改。(4)删除记录行先使用DataRow类的Delete方法来删除,然后调用
DataRow类的AcceptChanges方法接受删除B)直接调用Rows集合的Remove方法。
1.DataSet对象的构建通过窗体设计器可以很方便地添加DataSet组件。【例8.5】
添加DataSet组件。(1)创建一个Windows窗体应用程序项目Ex_9_DataSet。(2)在工具箱中,单击“数据”标签项,弹出所有与“数据”操作相关的组件。(3)将工具箱中的DataSet组件拖放到窗体上,此时弹出一个“添加数据集”对话框,用来选择“类型化数据集”或“非类型化数据集”,如图8.3所示。(4)若选中“类型化数据集”选项,则将创建已经存在于项目中的数据集类的一个实例(数据架构已定义);若选中“非类型化数据集”选项,则创建一个类型为System.Data.Dataset的数据集,通常,若以编程方式定义数据集架构,如添加数据表和列,则需要选中此项。(5)本例中我们选中“非类型化数据集”选项,单击“确定”按钮,将添加DataSet组件对象dataSet1。(6)单击窗体模板下方的dataSet1图标,将在其属性窗口中显示该DataSet组件对象的全部属性,通过修改Name属性可以更改该组件的实例名称,通过修改DataSetName属性可以设置该DataSet组件的名称,默认为NewDataSet。可以在运行时通过代码来建立数据集,这只要直接调用数据集的构造函数创建一个新的实例即可,例如:DataSetds=newDataSet();2.数据集中DataTable对象的构建DataSet类的Tables属性
——一个包含数据表的集合构造DataTable类对象
——使用无参数的构造函数和带表名参数的构造函数。DataTable类的一些属性:
1、Columns属性是该表的列的集合;
2、Rows属性是该表的行的集合;
3、PrimaryKey属性是该表主键的列的数组;
4、MinimumCapacity属性是该表最初的大小(记录行数,默认为25);
5、ParentRelations和ChildRelations属性是该表的父、子关系的集合。DataTable对象的Columns属性
——一个包含数据表的列的集合,存储DataColumn对象。构造函数如表8.8所示。3.数据表的字段(列)操作1、ColumnName属性指定列的名称
2、DataType属性指定该列的数据类型,默认类型为String*3、Expression属性为该列指定一个表达式字符串
4、ColumnMapping属性指定该列和XML元素的映射方式
5、AllowDBNull属性用来获取或设置在行中该列是否允许空值
6、Caption属性用来获取或设置列的标题,若没有设置,则返回ColumnName的值,它常常用来显示DataColumn的描述文字或友好名称
7、Ordinal属性用来获取在集合中的位置(索引)
8、ReadOnly属性用来指定该列在行中是否不允许修改
9、Unique属性用来指定该列在每一行中的值是否必须是唯一
10、DefaultValue属性用来指定在创建新行时该列的默认值
11、MaxLength属性用来获取或设置文本列的最大长度(字符个数)
12、AutoIncrement属性:指定添加新行时该列的值是否自动递增
13、AutoIncrementStep属性:指定添加新行时该列的值自动递增时,增量的大小(默认)
14、AutoIncrementSeed属性分别用来指定添加新行时该列的值自动递增时,列的起始值。
15、通过调用Columns集合的Add、AddRange、Insert、Remove和Clear方法可分别进行列的添加、插入、删除和清除操作。DataColumn类的一些属性:利用AddRange方法构造学生信息管理系统中数据表Score的列结构。DataTabledataTable1=newDataTable();dataTable1.TableName="Score";DataColumndataColumn1=newDataColumn();DataColumndataColumn2=newDataColumn();DataColumndataColumn3=newDataColumn();dataColumn1.Caption="学号";dataColumn1.ColumnName="studentno";dataColumn1.MaxLength=8;dataColumn2.Caption="课程号";dataColumn2.ColumnName="courseno";dataColumn2.MaxLength=8;dataColumn3.Caption="成绩";dataColumn3.ColumnName="score";dataColumn3.DataType=typeof(Single);DataColumn[]cols=newDataColumn[3];cols[0]=dataColumn1;cols[1]=dataColumn2;cols[2]=dataColumn3;dataTable1.Columns.AddRange(cols);除了用程序添加数据表的列外,还可以在“表集合编辑器”窗口中单击Columns属性右侧的[…]按钮,通过弹出的“列集合编辑器”对话框来添加列,如图8.4所示。4.数据表的记录(行)操作DataTable类的Rows属性
——一个包含数据表的行的集合,存储DataRow类对象。DataRow类封装了数据表中行的所有操作。DataRow类的RowState属性反映了记录行的操作状态
DataRowState枚举值:
Added(已添加)——当调用Rows集合的Add或AddRange方法添加记录行时
Deleted(已删除)——当调用DataRow类的Delete方法
Detached(已创建)——当调用DataTable类的NewRow方法时
Modified(已修改)——当通过DataRow类的Item属性来指定该行的字段值时
Unchanged(未更改)——当调用AcceptChang
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 双方土地买卖合同范本
- 个人年会发言稿简短
- 危机公关服务合同范本
- 个人向公司借款合同
- 二结构瓦工合同范本
- 仪表自动化模拟练习题含答案
- 医药研发调研合同范本
- 保健按摩测试题含参考答案
- 厨房小店出租合同范例
- 厂房带货梯合同范本
- 艾草种植基地合同(2篇)
- 幼儿园小班音乐游戏《听声学走》课件
- 《公债经济学》课程教学大纲
- 《产后出血预防与处理指南(2023)》解读课件
- 趣味语文课程设计
- 外研版(2019)必修 第一册Unit 1 A New Start revision 课件
- 肺部感染临床路径
- 电商平台定价策略优化
- 人美版美术 二年级下册全册教学设计(表格式)
- 保险经纪人考试题库含答案
- 2024-2030年中国骨传导耳机行业销售渠道及供需前景预测报告
评论
0/150
提交评论