SQL server数据库开发 - 网站开发专业

上传人:猪** 文档编号:243147580 上传时间:2024-09-16 格式:PPT 页数:140 大小:2.06MB
返回 下载 相关 举报
SQL server数据库开发 - 网站开发专业_第1页
第1页 / 共140页
SQL server数据库开发 - 网站开发专业_第2页
第2页 / 共140页
SQL server数据库开发 - 网站开发专业_第3页
第3页 / 共140页
点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,河南新华电脑学院,*,新华电脑学院,高级,IT,人才实作培训院校,河南新华电脑学院,数据库开发及,ADO.Net,什么是数据库,数据库,Database,:数据的仓库DB,仓库里有排货架,(,表,),,货物会分类存放。比如牙膏、牙刷会放到一个排货架上,面包会单独放在一个排货架上。,仓库又分很多种粮仓、武器仓库。,仓库中还会有仓库管理员,(DBA),对货物进行管理,从仓库中拿货物需要凭证,取货和进货的人,(,程序员,),我们怎么存储数据,学校的档案室,计算机文件,文件操作,开发人员需要熟悉操作磁盘文件的函数、必须编写复杂的搜寻算法才能高效的把数据从文件中检索出来、当数据格式发生变化时,需要编写复杂的文件格式升级程序、很难控制并发修改。,数据库(其实也是文件),,DBMS(,数据库管理系统,)RDBMS,对于数据不仅仅是需要存储,更重要的是将数据进行存储以后怎么才能方便快捷的查询、修改。,数据库特点:海量存储、查找速度快、并发性问题控制、安全性、数据完整性,(,保存在数据库中的数据是正确的,真是的,),。,数据库概述,DBMS,(,DataBase Management System,,数据库管理系统)和数据库。平时谈到“数据库”可能有两种含义:,MSSQLServer,、,Oracle,等某种,DBMS,;存放一堆数据表的一个分类( Catalog )。,不同品牌的DBMS有自己的不同的特点:MYSQL(速度很快,适合对数据要求并不是十分严谨的地方,去掉了很多中小型企业中不常用的功能)、,MSSQLServer(与,.net,结合很好,只能运行在,windows,平台下,大数据量、大交易量表现并不十分好),、DB2(大型)、Oracle(大型)、,Access,(文件)、,SQLite,(极其轻量级数据库) 、,Sybase,等。对于开发人员来讲,大同小异,SQL(语言,),SQLServerMSSQLServer。最常见的错误。,除了,Access,、,SQLServerCE,、,SQLite,等文件型数据库之外,大部分数据库都需要数据库服务器才能运行。学习、开发时是连接本机的数据库,上线运行时是数据库运行在单独的服务器。,数据库中的概念,数据库,DataBase,,不同类的数据应该放到不同的数据库中,便于对各个数据类别的进行个性化管理,避免命名冲突,安全性更高,Table,(表),:关系数据库中的关系指的就是表。,不同的货物要放到各自的货物架,将这种区域叫做“表”(,Table,)。不同的表根据放的数据不同进行空间的优化,找起来也方便。,列(,Column,)、字段(,Field,)、行,(Row),元组,用表格格式化数据:即便是引入了自动识别设备也很容易识别。,2003,年,5,月入职,是产品开发部的,姓名马小虎,王二小,技术支持部,入职是,2005,年,7,月,姓名,马小虎,部门,开发部,入职时间,2008.06.06,姓名,部门,入职时间,张三,开发,2002,思考:,1.一张表中有很多条记录,有没有可能出现重复的记录?,2.什么叫做重复的记录?,3.我们可以允许表中有重复的记录吗?为什么?,主键(,Primary,Key,)数据库的一种约束,工号,姓名,部门,入职时间,001,风姐,员工培训部,2010,年,7,月,5,日,002,瘦瘦,公关部,2010,年,8,月,2,日,003,憨憨,开发部,2009,年,3,月,5,日,主键,就是数据行的,唯一标识,。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊理由表都要设定主键,主键有两种选用策略:,业务主键和逻辑主键,。业务主键是使用有业务意义的字段做主键,比如身份证号、银行账号等;逻辑主键是使用没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据。因为很难保证业务主键不会重复(身份证号重复)、不会变化(帐号升位),因此,推荐用逻辑主键,。,表间关联、外键(,Foreign,Key,)冗余,商品名,价格,厂家编号,大大香瓜子,5.00,001,大大开心果,15.00,001,苦咖啡,2,002,随变,3,002,冰工厂,1,002,编号,名称,地址,电话,001,大大食品厂,恰恰大街,300,号,010-123456,002,伊利食品厂,内蒙古伊利路,1,号,400400400,商品名,价格,生产厂家,厂家地址,厂家电话,大大香瓜子,5.00,大大食品厂,恰恰大街,300,号,010-123456,大大开心果,15.00,大大食品厂,恰恰大街,300,号,010-123456,苦咖啡,2,伊利食品厂,内蒙古伊利路,1,号,400400400,随变,3,伊利食品厂,内蒙古伊利路,1,号,400400400,冰工厂,1,伊利食品厂,内蒙古伊利路,1,号,400400400,SQLServer,的管理,需要安装,SQLServer2005,或者,SQLServer2008,,若要使用,SQLServer,管理工具进行开发还要安装,SQL Server Management Studio,,还可以使用,VisualStudio,进行管理,使用免费的,SQLServerExpress,版本,,Express,版本的服务器名称,. SQLEXPRESS,,对于开发人员来讲和其他版本没有区别。(Express版本的数据库功能有一些限制,比如:数据文件最大大小为4GB等等。),SQLServer,的两种验证方式:用户名验证和,Windows,验证,开发时用,Windows,验证就行。,开发人员关注点在开发上,而不是配置、备份等之上,那是,DBA,做的事情。,创建数据库,创建数据库,创建表,设置主键,数据库的分离和附加,MS SQLServer,的每个数据库包含:,1,个主数据文件,(.mdf),必须。,1,个事务日志文件(,.ldf,)必须。,可以包含:,任意多个次要数据文件,(.ndf),多个事务日志文件,文件组:可将多个数据文件逻辑的分到一组,方便日后管理维护(备份、将表建在指定的文件组上等等。),创建,:部门,Id,部门名称,:员工,Id,身份证号,姓名,性别,入职日期,年龄,地址,电话,所属部门、,Email,数据库中的数据类型,分类,备注和说明,类型,说明,二进制数据类型,存储非子符和文本的数据,i,mage,(varbinary(max)),可用来存储图像,文本数据类型,字符数据包括任意字母、符号或数字字符的组合,Char,8000,固定长度的非,Unicode,字符数据。固定长度的字符串相对于可变长度的字符串来说效率要高一些,在数据长度固定的情况下优先选用固定长度,省去了计算长度的过程,提高效率,Varchar,8000,可变长度非,Unicode,数据,Nchar,4000,固定长度的,Unicode,数据,Nvarchar,4000,可变长度,Unicode,数据,Text,varchar(max),存储长文本信息,(,指针,2G),varchar(max),,大字符串类型可以保存非常多的字符,但是对于这种类型的数据,DBMS,经常将它们保存到单独的空间中,这就导致了数据的保存和加载速度比较慢,因此除非必要,否则不要使用。,Ntext,nvarchar(max),Nvarchar(max),代替,日期和时间,日期和时间在单引号内输入,Datetime,日期和时间,数字数据,该数据仅包含数字,包括正数、负数以及分数,int,smallint,整数,float,real,近似值,数字,货币数据类型,用于十进制货币值,money,和,smallmoney,数据类型精确到它们所代表的货币单位的万分之一。,Money,Bit,数据类型,表示是,/,否的数据,Bit,存储布尔数据类型,练习,创建一个,School,数据库。,创建一个班级表:,TblClass,:,tClassId,(班级编号,自动编号,主键)、,tClassName,(班级名称)、,tClassDesc,(班级简介)。,创建一个学生信息表:,TblStudent,:,tSId,(学生编号,自动编号,主键)、,tSName,(学生姓名)、,tSGender,(性别)、,tSAddress,(家庭地址)、,tSPhone,(电话)、,tSAge,(年龄)、,tSBirthday,(出生日期)、,tSCardId,(身份证号)、,tClassId,(班级,Id,),分离数据库,在需要分离的数据库上点右键,-,任务,-,分离,附加数据库,(,在其他计算机上,亲自测试!注意权限问题,),在数据库节点上点右键,-,附加,打开数据之前,要打开数据库服务,SQL,语句入门,(,脚本、命令,),SQL,全名是结构化查询语言(,Structured Query Language,),是关系数据库管理系统的标准语言,SQL语句是和DBMS“交谈”专用的语句,不同,DBMS,都认,SQL,语法。,=,=,SQL,语句中字符串用,单引号,、,单等号,。,select *,、,SeLeCT *,:,SQL语句是大小写不敏感的,不敏感指的是,SQL,关键字,字符串值还是,大小写敏感的(大小写是否敏感取决于具体的数据库排序规则设置),-在数据库中两个表示一个,【, 转义 ,】,=,建库、删除数据库、创建表、删除表不仅可以手工完成,还可以执行,SQL,语句完成,在自动化部署、数据导入中用的很多,简单的Insert语句。,(*),SQL,主要分,DDL,(数据定义语言,建表、建库等语句。),、,DML,(数据操作语言)和,DCL,(数据库控制语言) 。,Create Table,、,Drop Table,、,Alter Table,等属于,DDL,,,Select,、,Insert,、,Update,、,Delete,等属于,DML,,,GRANT,授权、,REVOKE,取消授权属于,DCL,使用,sql,语句创建数据库和表,使用,SQL,语句创建,School,数据库、,TblClass,表、,TblStudent,表。,Go,:,将,T-SQL,语句分批发送到数据库实例执行。,tSId,tSName,tSGender,tSAddress,tSPhone,tSAge,tSBirthday,tSCardId,tSClassId,创建表练习,创建数据库,School,,创建一个,学生表,TblStudent,-tSId,(主键),-tSName,-tSGender,-tSAddress,-tSPhone,-tSAge,-tSBirthday,-tSCardId,-tSClassId,创建,学生成绩表,TblScore,tScoreId,(成绩,id,主键,自动编号)、,tSId,(学生编号)、,tEnglish,(英语成绩)、,tMath,(数学成绩),创建,老师表,TblTeacher,tTId,、,tTName,、,tTGender,、,tTAge,、,tTSalary,、,tTBirthday,介绍生成脚本工具,数据库右键任务生成脚本,可选择生成什么样的脚本,选择生成的数据库版本,是否包含某些脚本等。,是否生成带数据的脚本(,2005,、,2008,都有该功能,express,没有。),简单数据插入insert,向表中插入一行(该行的每一列都有数据),insert into,表,(,列名,列名,) values(,值,1,,值,2),insert,语句可以省略表名后的列名,但是不推荐。,Insert into,表,values(,值,1,,值,2),插入数据时,只向某些列插入数据:如果插入的行中有些字段的值不确定,那么,Insert,的时候不指定那些列即可。,Insert into,表,(,列,1) values(,值,1),自动编号列不需要手动插入。,【SET IDENTITY_INSERT,表名,ON 】,注意:主键不能有重复值。,插入数据时的单引号问题。,Insert into,表(列),select,列,1,,列,2 union,Insert into,表(列),select,列,1,,列,2 from,表,Select,列,into,新表名,from,旧表,N,前缀:,N,字符串,在服务器上执行的代码中(例如在存储过程和触发器中)显示的,Unicode,字符串常量,必须以大写字母,N,为前缀。即使所引用的列已定义为,Unicode,类型,也应如此。如果不使用,N,前缀,字符串将转换为数据库的默认代码页。这可能导致不识别某些字符。在,Northwind,数据库下测试,print ,中文中文。通过Ado操作时如果遇到sql字符串也需要加前缀N。如果使用带参数sql语句则不需要加N.,简单数据更新,(,数据修改,),更新一个列:,update Student set sSex = ,男,更新多个列:,update Student set sSex =,女,sAge = 18,sBirthday=1989-8-8,更新一部分数据:,update Student set sClassId= 4 where sClassId = 1,,用,where,语句表示只更新,Name,是,tom,的行,,注意,SQL,中等于判断用单个,=,,而不是,=,。,Where,中还可以使用复杂的逻辑判断,update Student set sAge=30 where sName=,华佗, or sAge20 and sAge30) or(sAge=50),Where,中可以使用的其他逻辑运算符:,(|)or,、,(&)and,、,(!)not,、,、,=,、, 20,=,=,t,runcate table student,的作用与,delete from student,一样,都是删除,student,表中的全部数据,区别在于:,1.truncate,语句非常高效。由于,truncate,操作采用按最小方式来记录日志,所以效率非常高。对于数百万条数据使用,truncate,删除只要几秒钟,而使用,delete,则可能耗费几小时。,2.truncate,语句会把表中的自动编号重置为默认值。,3.truncate,语句不触发,delete,触发器。,练习:,插入3条老师信息和5条成绩信息、用,SQL,插入2条员工信息(注意:,bit,类型,在写代码中用,1,或,0,来表示,不要用,false,会进行类型转换的。),EmpId, EmpIdCardNo, EmpName, EmpGender, EmpJoinDate, EmpAge, EmpAddress, EmpPhone, EmpEmail, DeptId,练习,1,:给,studentId,是,1,的英语成绩加,10,分,练习,2,:考试题偏难,所有人的成绩加,5,分,练习,3,:所有女学生的年龄减,1,岁,删除工资大于,2000,的老师,=,将老师表清空,=,删除所有老师,删除数据时候 把自增长列的值还原成种子,约束,-,保证数据完整性,见备注,创建Employee表和Department表。,先用设计器创建约束、再用代码创建约束。,数据库约束是为了保证数据的完整性,(,正确性,),而实现的一套机制,见文件,Employee.sql,非空约束,主键约束,(PK),primary key constraint,唯一且不为空,唯一约束,(UQ)unique constraint,唯一,允许为空,但只能出现一次,默认约束,(DF)default constraint,默认值,检查约束,(CK)check constraint,范围以及格式限制,外键约束,(FK)foreign key constraint,表关系,增加外键约束时,设置级联更新、级联删除:,ON DELETE,NO ACTION,|,CASCADE,| SET NULL | SET DEFAULT ,ON UPDATE,NO ACTION,|,CASCADE,| SET NULL | SET DEFAULT ,约束练习,Teacher,表中,tSex,控制只能是男 女,默认男,tAge,在,30-40,之间 默认,30,Score,表中,studentId,是外键 先要把,Student,表中的,sId,设置为主键,测试外键约束:,1,:在学生表(主表)中删除在成绩表中被引用的学生记录。,2,:成绩表中添加一条新成绩,,studentId,在 学生表中没有。,保存,SQL,脚本。再次打开即可执行。,用,t-sql,代码来创建约束,操作,TblEmployee,表。,数据检索(查询),执行备注中的代码创建测试数据表。,简单的数据检索 :,SELECT * FROM Student,只检索需要的列 :,SELECT sName FROM Student,、,ame FROM Student WHERE sSex=,女,。,还可以检索不与任何表关联的数据:,select 1+1;select select getdate();,Top,、,Distinct,Top,获取前几条数据,,top,一般都与,order by,连用,获得年纪最小的,5,个学生,获得年纪最大的,10%,的学生,(percent),Distinct,去除重复数据,select distinct sName from student,select distinct sName,sAge from student,DISTINCT,是对,查询出的整个结果集,进行数据重复处理的,而不是针对某一个列。,1.建表,带重复数据。演示distinct,2.通过alter table增加identity列,再演示distinct。alter table TT2 add autoId int identity(1,1),3.演示查询除主键外的其他列重复数据。,聚合函数,SQL,聚合函数:,MAX,(最大值)、,MIN,(最小值)、,AVG,(平均值)、,SUM,(和)、,COUNT,(数量,:,记录的条数。),聚合函数对,null,值不计算。,如果一行的数据都是,null,,,count(*),包含对空值行、重复行的统计。,平均成绩,select avg(english) from score,男学生出生日期的最大值和最小值:,select max(sBirthday),min(sBirthday) from student where sSex=,男,带条件的查询,Select fromwhere ,查询没有及格的学生的学号,查询年龄在,20-30,岁之间的男学生,Betweenand ,在之间,查询年龄在,20-30,岁之间的男学生,查询,math,成绩在,80-90,分之间的所有学生,建议:使用,between and ,。(闭区间),查询班级,id,为,1,,,2,,,3,的所有学生,select sName,sAge from student where sClassId=1 or sClassId=2 or sClassId=3,select sName,sAge from student where,sClassId in (1,2,3),如果可能in尽可能替换为=1 and =60 and math=60 ORDER BY english DESC,math DESC,Order by,语句一般要放到所有语句的后面,就是先让其他语句进行筛选,全部筛选完成后,最后排序一下。,(表中数据是集合,集合是没有顺序的。,Order by,返回的数据是有顺序的,故此我们把,order by,以后返回的数据集合叫“游标”。),数据分组group by,在使用,select,查询的时候,有时需要对数据进行分组汇总(即:将现有的数据按照某列来汇总统计),这时就需要用到,group by,语句。,select,语句中可以使用,groupby,子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息。,/,分组一般都和聚合函数连用。,1.,请从学生表中查询出每个班的班级,Id,和班级人数:(见备注,1,),2 .,请从学生表中查询出每个班的班级,Id,和班级中男同学的人数: (见备注,2,),GROUP BY,子句必须放到,WHERE,语句的之后,Group By,与,Order By,都是对筛选后的数据进行处理,而,Where,是用来筛选数据的。,没有出现在,GROUP BY,子句中的列是不能放到,SELECT,语句后的列名列表中的 (聚合函数中除外),错误:,select sClassId,count(sName),sAge from student group by sClassId,正确:,select sClassId,count(sName),avg(sAge) from student group by sClassId,Having,语句,(,对组的筛选,哪些组显示哪些组不显示,),对表中的数据分组后,会得到一个分组后的结果集,如何对该结果集在进行筛选?,having,查询班级人数超过三个人的班级。(见备注,1,),注意,Having,中不能使用未参与分组的列,,Having,不能替代,where,。作用不一样,,Having,是对组进行过滤。,Having,是,Group By,的条件对分组后的数据进行筛选(与,Where,类似,都是筛选,只不过,having,是用来筛选分组后的组的。),在,Where,中不能使用聚合函数,必须使用,Having,,,Having,要位于,Group By,之后。,Having,的使用几乎是与,where,一样的,也可以用,in,。,Having count(*) in (5,8,10),SQL,语句的执行顺序,5,Select,5-2,distinct,7,top(,应用,top,选项最后计算,),5-1,选择列,1,From,表,2,Where,条件,3,Group by,列,4,Having,筛选条件,6,Order by,列,Group by,练习,从MyOrders表中查询:,1.,热销售商品排名表,,【,即按照每种商品的总销售数量排序,】,。,2.,请统计销售总价超过,3000,元的商品名称和销售总价,并按销售总价降序排序。,3.,统计各个客户对,可口可乐,的喜爱度,(,既统计每个购买人对“可口可乐”的购买量,),类型转换函数,CAST,( expression AS data_type),CONVERT,( data_type, expression,style),Select,您的班级编号,+ 1,错误这里,+,是数学运算符,SELECT,FIdNumber,CAST,(,RIGHT,(sNo,3),AS,INTEGER,),as,后三位的整数形式,CAST,(,RIGHT,(sNo,3),AS,INTEGER,)+1,as,后三位加,1,CONVERT,(,INTEGER,RIGHT,(sNo,3)/2,as,后三位除以,2,FROM,student,对编号排序,但编号是字符串类型。,1,、,2,、,11,、,3,、,21,、,36,对日期的转换。转换成各种国家格式的日期。,select,convert(varchar(,20,),getdate(),104,),Style,的格式,查,sql,帮助。(输入,convert,函数查询),将日期转换为指定格式的字符串。,日期字符串,联合,结果集,union(,集合运算符,),集合运算符是对两个集合操作的,两个集合必须具有相同的列数,列具有相同的数据类型(至少能隐式转换的),最终输出的集合的列名由第一个集合的列名来确定。(可以用来连接多个结果),联合,(union),与连接,(join),不一样,简单的结果集联合,(,老师、学生,),:,select tName,tSex from teacher union,select sName,sSex from student,基本的原则:每个结果集必须有相同的列数;每个结果集的列必须类型相容。,select tName,tSex,-1 from teacher union,select sName,sSex,sClassId from student,联合:将多个结果集合并成一个结果集。,union(,去除重复,相当于默认应用了,distinct),、,union all,(保留所有结果,不去除重复),常见应用:底部汇总。使用,Union all,Union all,select tName,tSex from teacher union,select sName,sSex from student,UNION,合并两个查询结果集,并且将其中完全重复的数据行合并为一条,select tName,tSex from teacher union all,select sName,sSex from student,Union,因为要进行重复值扫描,所以效率低,因此如果不是确定要合并重复行,那么就用,UNION ALL,案例,1,要求在一个表格中查询出学生的英语最高成绩、最低成绩、平均成绩,查询结果为,3,行:,select english,最高成绩,max(english) from score,union all,select english,最低成绩,min(english) from score,union all,select english,平均,avg(english) from score,查询结果为,1,行:,Select max(english),min(english),avg(english) from score;,案例,2,查询每位老师的信息,包括姓名、工资,并且在最后一行加上平均工资和最高工资,底部汇总:,select tName,tSalary from teacher,union all,select ,平均工资,avg(tSalary) from teacher,union all,select ,最高工资,max(tSalary) from teacher,练习,从MyOrders表中统计每种商品的销售总价,并且在底部做汇总。,一次插入多条数据,insert into Score(studentId,english,math),select 1,80,100 union,all,select 1,80,100 union,all,select 3,50,59 union,all,select 4,66,89 union,all,select 5,59,100,此处如果用,union,同样会去除重复数据。,*,一次插入多条数据,-,把现有表的数据插入到新表(表不能存在),为表建备份。,-select * into newStudent from student,(,newStudent,表在,select,查询的同时自动建立。),-,把现有表的数据复制到一个已存在的表,通过这种方式复制,只能复制表中的数据,以及列的名字和数据类型。对于约束,不会复制过来。,Select * into newTbl from oldTbl where 11,这样做可以只复制表结构,但效率并不高。建议:,select top 0 * into newTbl from oldTbl,=,如果表已经存在了,=,-insert into backupStudent select * from students(backupStudent,表必须提前建好,),字符串函数(*),LEN(),:计算字符串长度(字符的个数。),datalength();/,计算字符串所占用的字节数,不属于字符串函数。,测试,varchar,变量与,nvarchar,变量存储字符串,a,的区别。见备注,1.,LOWER(),、,UPPER (),:转小写、大写,LTRIM(),:字符串左侧的空格去掉,RTRIM (),:字符串右侧的空格去掉,LTRIM(RTRIM( bb ),LEFT(),、,RIGHT(),截取取字符串,SELECT LEFT(abcdefg,2),SUBSTRING(string,start_position,length),,索引从,1,开始。,参数,string,为主字符串,,start_position,为子字符串在主字符串中的起始位置,,length,为子字符串的最大长度。,SELECT SUBSTRING(abcdef111,2,3),尝试使用,SQLServer,的帮助。,日期函数(在帮助中输入“日期函数”),GETDATE(),:取得当前日期时间,DATEADD,(datepart , number, date ),,计算增加以后的日期。参数,date,为待计算的日期;参数,number,为增量;参数,datepart,为计量单位,可选值见备注。,DATEADD(DAY, 3,date),为计算日期,date,的,3,天后的日期,而,DATEADD(MONTH ,-8,date),为计算日期,date,的,8,个月之前的日期 。,(入职一年以上的员工发,1000$,),入职日期,+1,年,当前时间,Sql2005,中只有,DateTime,类型,,2008,中有,date,、,datetime,、,datetime2,等类型。,DATEDIFF,( datepart , startdate , enddate ),:计算两个日期之间的差额。,datepart,为计量单位,可取值参考,DateAdd,。,统计不同入学年数的学生个数:,select DateDiff(year,sInDate,getdate(),count(*) from student Group by DateDiff(year,sInDate,getdate(),DATEPART,(datepart,date),:返回一个日期的特定部分,datepart与datename区别,datename函数返回字符串。,Month(),、,year(),、,day(),来代替。,统计学生的生日年份个数:,select DatePart(year,sBirthday),count(*),from student,group by DatePart(year, sBirthday),1990,年出生的人的个数?,练习,创建一张表,记录电话呼叫员的工作流水,记录呼叫员编号、对方号码、通话开始时间、通话结束时间。建表、插数据等最后都自己写,SQL,语句。,要求:,输出所有数据中通话时间最长的,5,条记录。,orderby datediff,输出所有数据中拨打长途号码(对方号码以,0,开头)的总时长。,like,、,sum,输出,本月,通话总时长最多的前三个呼叫员的编号。,输出,本月,拨打电话次数最多的前三个呼叫员的编号,.group by,count(*),每个月打电话时间最长的前三个呼叫员(*),ADO.NET,为什么要学,ADO.NET,之前我们所学只能在查询分析器里查看数据,操作数据,我们不能让普通用户去学,sql,,所以我们搭建一个界面,(Web Winform),让用户方便的操作数据库中的数据,什么是,ADO.NET,ADO.NET,就是一组类库,这组类库可以让我们通过程序的方式访问数据库,就像,System.IO,下的类用类操作文件一样,,System.Data.,这组类是用来操作数据库,(,不光是,MSSql Server),,它提供了统一的编程接口让操作其它数据库,(Access,、,Oracle,等,),的方式和操作,MSSql Server,一致,ADO.NET,组成,数据提供程序,(,常用类,),Connection,,用来,连接,数据库,Command,,用来,执行,SQL,语句,DataReader,只读、只进,的结果集,一条一条读取数据(,StreamReader,、,XmlReader,微软的类库中这些,Reader,的使用方式都差不多),DataAdapter,,一个封装了上面,3,个对象的对象。,数据集,(DataSet),,临时数据库。,断开式数据操作,ADO.NET,中的其他常见类,ConnectionStringBuilder/,自动生成连接字符串,Parameter/,带参数的,SQL,语句,Transaction/,在,ADO.NET,中使用事务,与,DataSet,相关的类:,DataView/,视图类,,DataTable,中的数据以不同的视角查看,DataRowView/DataView,中的行。,DataTable /DataSet,中的数据表,DataRow/DataTable,中的行,DataColumn/DataTable,中的列,DataRealation/DataTable,与,DataTable,的关系,Constraint/DataTable,中建立的约束,A,访问数据库的方式。,1,1.,连接数据用,Connection,2.,执行,SQL,语句,Command,3.,执行完毕之后将结果一条一条返回。,DataReader,2,使用,DataAdapter+DataSet,这种方法本质还是通过,Connection,、,Command,、,DataReader,将数据全部取出来然后放到了,DataSet,中。,/,看,DataAdapter,的构造函数,第一个对象,Connection,如何让应用程序与数据库建立连接?,Connection,对象。,读取数据库数据之前先要创建一条路,读取,Sql Server,数据库使用,创建,SqlConnection,对象,获取连接字符串,VS,视图,-,服务器资源管理器,-,数据库连接上点右键,-,添加连接,在新添的数据库上点右键 属性 里有连接字符串,使用,SqlConnectionStringBuilder,帮助获取连接字符串,使用,PropertyGrid,控件的,SelectedObject,属性与,SqlConnectionStringBuilder,配合使用。,打开连接,.(,多次打开问题:,ConnectionState,枚举,),关闭连接,/,相当于设置了路障,释放资源,/,相当于把路拆了,这块地可以盖楼了。,调用,Connection.Dispose()【,继承自,Component,类的方法,】,方法时,内部调用了,Close(),connection,不能重复打开。,连接,SQLServer,连接字符串:程序通过连接字符串 指定要连哪台服务器上的、哪个实例的哪个数据库、用什么用户名密码等。,ADO.Net,中通过,SqlConnection,类创建到,SQLServer,的连接,,SqlConnection,代表一个数据库连接,,ADO.Net,中的连接等资源都实现了,IDisposable,接口,可以使用,using,进行资源管理。执行备注中的代码如果成功了就,ok,。,Connection,的,StateChange,事件,第二个对象,Command,操作,Sql Server,数据库使用,SqlCommand,对象,SqlCommand,表示向服务器提交的一个命令(,SQL,语句等),CommandText,属性为要执行的,SQL,语句,.,创建,SqlCommand,对象:,1.,通过,new,关键字创建,2.,通过,IDbConnection.CreateCommand(),方法创建(编写通用代码的时候使用(多态),常用的三个方法,ExecuteNonQuery(),执行对数据库的增删改,返回受影响的行数,适合:,insert,、,delete,、,update,(,对于其他语句返回,-1,),ExecuteScalar(),执行查询,返回首行首列,ExecuteReader(),执行查询,返回,DataReader,对象,(*),StatementCompleted,事件,每条,SQL,语句执行完毕之后触发。,多条语句同时执行(用分号隔开),如何获取每条语句所影响的行数?,/,实际返回值为每条语句所影响的行数的和。,执行简单的增删改语句,SqlCommand的ExecuteNonQuery执行增删改操作,ExecuteNonQuery,返回值是执行的影响行数,/,执行数据库操作,3,步,/,打开连接,conn.Open();,/,执行操作,result = cmd.ExecuteNonQuery();,/,关闭连接,conn.Close();,使用,using,语句即使释放连接资源,不用再考虑是否关闭连接,推荐使用,案例,对班级表操作,1.,增加一个班级,insert,2.,修改一个班级的名称,update,3.,删除一个班级的信息。,delete,4.,把班级表中的数据显示出来。,Select,5.,显示出当前班级表中的数据条数。,Count(*),异常处理,在执行数据库操作时,如果数据库服务器未打开,或者,sql,语句写错了会怎么样?,con.Open();cmd.Execute.();,可以使用,trycatchfinally,来捕获异常,使用异常处理可以保证一个功能出错不影响另一个功能,比如添加操作失败,不影响查询的操作,练习(熟练),添加学生,编辑学生,删除学生,一般在,中遇到的错误“:,1.,连接字符串问题,2.sql,语句问题。,ExecuteScalar,SqlCommand,的,ExecuteScalar,方法用于,执行查询,并返回查询所返回的结果集中第一行的第一列,,,因为不能确定返回值的类型,所以返回值是,object,类型,。,/ExecuteScalar(),方法内部也是调用,ExecuteReader(),实现的。,cmd.CommandText = select count(*) from student;int i = Convert.ToInt32(cmd.ExecuteScalar(),cmd.CommandText = select getdate(); DateTime dt = Convert.ToDateTime(cmd.ExecuteScalar();,得到自动增长字段的主键值,在,values,关键词前加上,output inserted.Id,,其中,Id,为主键字段名。执行结果就试插入的主键值,用,ExecuteScalar,执行最方便。,(output,语句使用的是,inserted,、,deleted,两个临时表,),cmd.CommandText =,“insert into class(cName,cDescription),output inserted.classId,values(,高三一班,描述,)”;,int i = Convert.ToInt32(cmd.ExecuteScalar();,作业:,练习:添加学生窗体,。,返回最新添加的学生的自动编号,Id,执行查询,执行有多行结果集的用ExecuteReader,HasRow,属性返回是否有行,SqlDataReader reader = cmd.ExecuteReader();,.,while (reader.Read(), Console.WriteLine(reader.GetString(1);,reader,的,GetString,、,GetInt32,等方法只接受整数参数,也就是序号,用,GetOrdinal,方法根据列名动态得到序号,更简单的方法,readeruUserName,为什么用,using,。,Close,:关闭以后还能打开。,Dispose,:直接销毁,不能再次使用。,using,在出了作用域以后调用,Dispose,,,SqlConnection,、 SqlDataReader等的,Dispose,内部都会做这样的判断:判断有没有,close,,如果没有,Close,就先,Close,再,Dispose,。,DataReader,必须独享一个,Connection,。,(,除非设置了允许,MARS,多活动结果集,在连接字符串中,),案例:登陆练习,第一条之前,最后一条之后,SqlDataReader,使用注意事项,返回,reader,后数据在哪里?,数据库服务器缓存,当使用,DataReader,的时候必须保证,Connection,为,Open,状态,。,reader,只读,(,不能通过,reader,修改数据。,),、只进,reader,每次读取一条就释放一条所以只能向前不能后退,由于功能有限,所以读取速度很快,适合从数据库中读取大量数据,使用,reader,根据列索引读取列数据而不是列名,使用强类型的,GetString(),、,GetInt32,、,GetFloat(),、,GetDouble().,数据库中的类型与,C#,的不太一样,数据库中的,float,,得用,c#,的,GetDouble(),来获取。,reader.,IsDbNull(,index,),判断当前列是否为null,如果返回多个结果集则用,NextResult(),方法。通过,do-while,循环测试。,介绍sql profiler,sql事件探查器,使用DataReader将数据绑定到控件上,将数据读取到List集合中,然后绑定到DataGridView上。,(ADO.NET,连接池,),由于每次正常连接数据库都会至少执行,3,个操作(,1.,登录数据库服务器,2.,执行操作,3.,注销用户),所以每次通过,Connection,向数据库服务器申请一个连接都比较耗时。,【ado
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!