《C#语言和数据库技术基础》
第一章
1..NET Framework 框架
2.sharp 尖锐,强烈的
3.application 应用程序
4.developer 开发者
5.network 网络
6.build 创建,构造
7.console 控制台
8.debug 调试
9.namespace 命名空间
10.project 项目
11.solution 解决方案
12.watch 监视
第二章
1.break 中断
2.continue 继续
3.switch 开关,选择结构
4.array 数组
5.each 每一个
6.while 一下子,时间
第三章
1.private 私人
2.public 公开
3.get 获得
4.set 设置
5.value 价值
6.this 这,这个
7.property 属性
8.ref 参考
第四章
1.format 格式
2.equals 等于
3.convert 转换
4.index 索引
5.join 加入
6.split 分裂
7.substring 子链,链接
8.trim 修剪,整理
第六章
1.database 数据库
2.edition 版本
3.studio 工做室
4.analysis 分析
5.table 表
6.relationship 关系
7.management 管理
8.administrator 管理员
9.record 记录
10.row 行
11.entity 实体
12.transaction 事物
13.DBMS 数据库管理系统
14.DBS 数据库系统
15.DBA 数据库管理员
第七章
1.constraint 约束
2.primary 初级
3.binary 二进制
4.foreign 国外的有
5.check 检查
6.course 课程
7.score 评分
第八章
1.structured 结构
2.query 查询
3.language 语言
4.transact 办理
5.insert 插入
6.update 更新
7.delete 删除
8.truncate 截断
9.employee 员工人数
10.default 默认
11.manipulation 操纵
12.definition 定义
第九章
1.recordset 记录设置
2.order 订购
3.null 空
4.trim 修剪
5.replace 替换
6.floor 楼层
7.ceiling 天花板
8.round 回合
9.convert 转换
10.length 长度
第十章
1.between 在…之间
2.business 业务范围
3.count 计数
4.landlord 房东
5.exchange 交流
6.salary 工资
7.education 教育
第十一章
1.group 组
2.join 加入
3.left 左
4.right 右
5.outer 外
6.client 客户端
第十三章
1.online 在线
2.nickname 昵称
3.province 省
4.relation 关系
5.base 基地
6.master 主人,雇主
第十四章
1.active 活动
2.object 爸爸,对象
3.connection 链接
3.command 命令
4.execute 执行
5.query 查询
6.scalar 标量
第十五章
1.operation 操做
2.read 阅读
3.append 附加
4.manager 经理
5.grade 等级
第十七章
1.primary 初级
2.reference 参考
3.check 检查
4.handle 句柄,把柄
5.online 在线
6.level 级别
第一章
第一个C#程序
本章技能目标
1.掌握简单C#程序的开发步骤
2.掌握C#中的变量类型及命名规则
3.使用Console类实现控制台输入输出信息
4.掌握C#中定义类、对象和方法的语法
★1..NET与C#
1..NET概述与C#应用
2.ID环境
★2.第一个C#程序
▲1.新建程序
1.启动Visual Studio 2012
2.新建项目
3.生成可执行文件
4.开始运行
新建项目
1.在Visual Studio 菜单栏中选择“文件”→“项目”选项,打开“新建项目”
2.在左侧的项目类型中选择“Visual C#”,在右侧的模板列表中选择
“控制台应用程序”。
3.在“名称”中输入“HelloWorld”。
4.为项目选择一个保存的位置,例如D:\。
5.在Main()方法中添加以下代码。
Console.WriteLine(“Hello World”);
Console.ReadLine();
经验
1.运行的快捷键:F5:启动。
2.运行的快捷键:Ctrl+F5:开始执行不调试。
★3.认识控制台应用程序文件夹的结构
看不到解决方案资源管理器怎么办?
1.在Visual Studio的菜单中选择 “视图”→ “解决方案资源管理器”选项,
就能够显示了,快捷键为Ctrl+Alt+L。
2.在Visual Studio的菜单中选择 “工具” → “选项”选项,打开 “选项”
对话框,在左边选择“项目和解决方案”,在右边选中“老是显示解决方案”
复选框便可。1.在Visual Studio的菜单中选择 “视图”→ “解决方案资源
管理器”选项,就能够显示了,快捷键为Ctrl+Alt+L。
3.在Visual Studio的菜单中选择 “工具” → “选项”选项,打开 “选项”
对话框,在左边选择“项目和解决方案”,在右边选中“老是显示解决方案”
复选框便可。
★4.认识C#程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace HelloWorld
{
class Program
{
static void Main(string[ ] args)
{
Console.WriteLine("Hello World");
Console.ReadLine();
}
}
}
1.namespace
namespace(命名空间)是C#中组织代码的方式,它的做用相似于Java中的package
(包)。
2.using
在Java中,若是导入其余包,应该使用import。而在C#中,使用using来引用其
他命名空间。
3.class
与Java同样
4.Main()方法
与Java同样,但C#中的Main()方法首字母必须大定民,Main()方法的返回值能够
是void或者int类型。
C# 的 Main( ) 方法
Main 首字母大写
返回值能够为 void 或者 int
命令行参数是可选的
四种 Main() 方法:
static void Main ( string[ ] args ) { }
static int Main ( string[ ] args ) { }
static void Main ( ) { }
static int Main ( ) { }
对比:
组织代码方式:C#使用命名空间(namespace),Java使用包(package)
引入命名空间或包的关键字:C#使用using,Java使用import
程序入口:C#的Main()有四种形式,Java的main()有一种形式。
★5.C#中的变量和常量
1.C#中数据类型
经常使用数据类型
Java C#
整型 int int
浮点型 float float
字符串 String string
布尔型 boolean bool
2.C#中的变量
语法:
数据类型 变量名称;
C#的变量命名规则:
C#的变量命名规则与Java也基本相同,只是“$”符号在C#中是不能使用的,所以变
量的命名规则能够简单总结为如下三条。
1.组成:52个英文字母(A~Z,a~z),10个数字(0~9),下划线(_),除此之
外不能含有其余的字符。
2.开头:只能以字母或下划线开头。
3.不能使用的:不能是C#中的关键字。
C#的变量的命名规范:
1.变量的名称要有意义
2.避免使用单个字符做为变量名
3.当使用多个单词组成变量名时,应该使用骆驼(Camel)命名法。
★6.为何使用常量
下面代码的输出结果是什么?
static void Main(string[] args)
{
int dayMax = 7;
int today = 1;
Console .WriteLine("一周有几天:" );
Console .WriteLine(dayMax );
Console .WriteLine("今天是周:" );
dayMax = dayMax +1;
Console .WriteLine(dayMax );
}
语法正确可逻辑错误如何避免?
使用常量能够很容易的避免这种错误
★7.什么是常量
const 数据类型 常量名称 = 值;
常量命名规则:
1.有意义
2.均大写
3.长度不宜长
何时使用常量?
1.多处用到(用于在程序中被常常引用的值)
2.其值不易理解(例如一个程序中屡次用到的值0或1)
3.其值不变(用于在程序中一旦设定就不容许被修改的值)
★8.Console类
向控制台输出:
Console.WriteLine()方法——输出后换行
Console.Write()方法——输出后不换行
从控制台读入:
Console.ReadLine();
返回值为string类型
向控制台输出的几种方式
Console.WriteLine();// 至关于换行
Console.WriteLine(要输出的值);// 输出一个值
Console.WriteLine("格式字符串", 变量列表);
string course = "C#"; //课程名称
……
Console.WriteLine( "个人课程名称是:" + course);
Console.WriteLine( "个人课程名称是:{0}" , course );
Console.ReadLine();
{0}:占位符
依次使用{0}、{1}、{2}…与变量列表中的变量对应
能够在字符串中使用 \n 、 \t 来控制换行或制表
读取一行并返回字符串( string) 类型
Console.ReadLine( );
读取整数
int.Parse (Console.ReadLine());//表示将字符串转换为整数
★9.类和对象
什么是方法?使用方法有什么好处?
类的行为,便于修改、增长可读性、可重用、封装…
访问修饰符 返回类型 方法名 ( 参数列表 )
{
// 方法的主体…
}
注释类型
Java C#
行注释 // … // …
块注释 /*… /*…
*/ */
文档注释 /**… /// …
*/ /// …
经验
将每一个方法都折叠成一句并提供说明,作法是:把方法的代码写在
#region和#endregion之间。在#region后面就能够添加说明。
规范
1.关键性的语句要使用注释,如变量声明、条件判断、循环等。
2.类名前应使用文档注释,说明类的简单功能和使用方法。
3.方法前应使用注释,说明方法的功能、参数的含义、返回值等。
★10.Visual Studio调试技巧
▲1.设置断点(断点:breakpoint)
小技巧
程序调试时经常使用快捷键以下
1.F5--开始调试
2.Shift+F5--中止调试
3.F9--设置或删除断点
4.Ctrl+F9--取消断点
5.F10--单步执行
6.F2--转到所调用过程或变量的定义。
7.Ctrl+F2--将焦点转移到类的下拉框。
▲2.监视变量值
将变量添加到监视窗口的二种方法
1.选中并右击须要关注的变量,如对象student的成员,选择快捷菜单占的
"添加监视"命令。
2.在监视1窗口中单击名称下的空白单元格,输入"student",按Enter键。
小技巧
若是在你的Visual Studio中没有出现监视窗口或者不当心把它关闭了,怎么办?
在Visual Studio的菜单栏中经过选择“调试”→“窗口”→“监视”→“监视1”选
项,能够打开一个监视窗口,也能够经过这种方式打开多个监视窗口。
本章总结
★1.使用Visual Studio建立和运行C#控制台应用程序的步骤以下。
1.启动Visual Studio 2010。
2.新建项目
3.生成可执行文件
4.开始运行
★2.C#采用命名空间组织程序,引入其余命名空间用using关键字。
★3.C#中使用控制台类Console的ReadLing()和WriteLine()方法输入和输出信息。
★4.C#中Main()方法的首字母大写,根据返回值和参数的不一样Main()方法有四种形式。
★5.C#中布尔类型使用bool关键字。
★6.C#中使用const关键字声明常量。
★7.C#中有三种注释类型,其中文档注释使用///表示。
★8.类是建立对象的模板,对象是类的一个具体实例。
★9.调试程序的步骤以下。
1.设置断点:按F9快捷键。
2.启动调度:按F5快捷键。
3.在监视窗口中查看变量的当前值。
第二章
C#语法快速热身
1.掌握C#中的条件结构
2.掌握C#中的循环结构
3.掌握C#中的数组用法
4.掌握冒泡排序算法
★1.条件结构
1.if结构
2.switch结构
经验
switch结构中case子句的摆放是没有顺序的,能够把default子句放在最前面,
但要注意任何两个case语句不能具备相同的值。
case中的值必须是常量表达式,不容许使用变量。
★2.数组与循环
1.一维数组
经验
若是在程序中须要获得数组的长度,应该使用“数组名.Length”语句得到,而不
是用数组定义的长度。这样一旦数组长度发生变化,能够及时得到数组当前的元素
个数。
2.循环结构
while do-while for foreach
经验
1.while循环是先判断条件表达式是否成立。若成立则执行循环体;不然结束循环。
2.do-while循环先执行一次循环体再判断条件表达式是否成立。若成立则继续循
环;不然结束循环。
3.for循环必须使用整型变量作循环计算器,经过条件表达式限定计数器变量值来控制循环。
4.foreach()自动遍历给定集合的全部值。
5.break语句
除了在switch语句中可使用break语句退出某个case语句外,也能够把它用于for、
while、do-while、foreach循环结构。break语句将使程序跳出当前循环结构,并继续执行
该循环后面的语句。
6.continue语句
continue语句与break语句相似,它必须出如今for、while、do-while、foreach的循环结构
中。但continue语句的做用是退出当前循环结构的本次循环,并开始执行当前循环结构
的下一次循环,而不是退出当前循环结构。
★3.二重循环
★4.冒泡排序
▲1.冒泡排序算法
1.当i=0时,是第一轮比较,数组中全部的元素都参与比较。
2.当i=1时,由于scores[4]已是最大的数了,因此不参加比较。
3.当i=2时,scores[3]也不参与比较,只须要比较到scores[2],这轮一共比较2次。
4.当i=3时,scores[2]不参与比较,只须要比较scores[0]和scores[1],一共比较1次。
经验
冒泡排序速记口决(升序):
1.N个数字来排队,两两相比小靠前。
2.外层循环N-1,内层循环N-1-i。
3.若是要降序排序,只要把程序中的大于号换成小于号就好了。
本章总结
1.C#一维数组的声明和初始化与Java略有不一样,声明时不能将数组名放在数据类型
和方括号之间。
2.C#中有四种循环结构:while、do-while、for、foreach、其中foreach用来遍历集合
或者数组中的每一个元素。
3.二重循环就是在一个循环中嵌套另外一个循环,必须将内层循环完整地包含在外层循
环的循环体内。
4.break和continue语句用在内层循环时,只对内层循环的执行有影响,并不影响外层
循环。
5.使用二重循环能够实现冒泡排序算法,排序的过程是比较相邻的两个数并交换,直
到全部的数都比较过并排好顺序。
第三章
本章技能目标
1.掌握C#中的访问修饰符
2.掌握C#中的属性
3.掌握C#中的值传递和引用传递
★1.private访问修饰符
1.生活中的访问级别
2.访问修饰符
访问修饰符 访问权限 访问级别
public 不受任何限制 最高
private 只有类的内部可使用 最低
注意
若是在成员定义以前没有指定访问修饰符,那么这个类成员的访问权限默认为
internal,它只能在本项目内访问。
★2.this关键字
private string _name;
public void SetName(string _name)
{
//this就是当前对象的自己
this._name = _name;//前对象自己的名字等于方法传进来的自己
}
this关键字能够区分局部变量和成员变量。
★3.C#中属性
1.用方法保证数据安全
2.用属性实现字段封装
class Student
{
private string _name = "灰太狼";
private int _age;
public string _cardID;
public int Age
{
get
{
return _age;
}
set
{
if(value<0||value>100)
{
_age = 19;
}
else
{
_age = value;
}
}
}
}
class Program
{
static void Main(string[] args)
{
Student student = new Student();
//执行Age属性的set访问器代码
student.Age = -20;
//执行Age属性的get访问器代码
Console.WriteLine("年龄是{0}",student.Age);
student.Age = 40;
Console.WriteLine("年龄是{0}",student.Age);
}
}
2.属性的数据类型
定义类中的一个属性时,属性的数据类型必须与它所访问的字段类型一致。
3.属性的访问类型
属性除了能够约束数据访问外,还能够设置读,写属性来限定它的访问类型。属性的访
问类型分为如下三种。
1.只读属性,只包含get访问器。
2.只写属性,只包含set访问器。
3.读写属性,包含get和set访问器。
4.在编码中如何快速地建立属性
选中这个字段,右击鼠标,在弹出的快捷菜单中,选择“重构”→“封装字段”命令,
选择“封装字段”选项后,Visual Studio 会弹出一个窗口。你能够修改属性的名称,在
单击“肯定”
小技巧
封装字段的快捷键是Ctrl+R+E。
1:C#中,字段和属性的区别是什么?
答案:一般将字段指定为private,在类内部使用。将属性指定为public,对外部公
开,经过get或set访问器对字段提供安全,有效范围的保护。
2:C#中,属性和方法的区别是什么?
答案:C#中的属性set访问器和get访问器后不使用"()",由于访问器没有返回
值,因此也不须要指定void。
面向对象的特征这————封装
顾名思义,封装表示将东西打包,使其以新的完整的形式出现。
封装能够为咱们带来以下这些好处。
第五章
指导学习:库存管理
1.使用类和属性封装货品信息
2.使用对象数组存储货品信息
3.使用输入输出语句获取、显示货品信息
4.使用类型转换获取用户输入的货品做息
5.使用条件结构实现菜单管理
6.使用循环结构实现菜单管理
7.使用自定义方法完成特定的功能
8.使用String类方法实现字符串处理
★1.C#基本语法
1.变量、方法
2.Console类
3.数组
★2.流控制
1.条件语句
2.循环
★3.类和对象
1.属性、方法
2.值传递和引用传递
值传递把值复制到里面,原来的值没有改变。
引用传递是把地址复制到里面,原来的值会改变。
★4.属性
1.不会直接访问类中的字段,经过get和set访问器访问
2.get返回相应的私有字段的值
3.set设定相应的私有字段的值
5
ERP--企业资源管理器
1.掌握数据库的基本概念
2.掌握SSMS的基本操做
3.掌握如何建立和配置SQL Server数据库
数据库(Database,简称DB)技术是程序开发人员必须掌握的技术之一,在前面学习的
C#语言中,数据都是使用变量保存承内存中,一旦程序运行完毕,内存中的这些数据
信息也会随之消失。
1.使用数据库的必要性
使用数据库能够高效且条理分明地存储数据,它令人们可以更加迅速和方便地管理数
据,主要体如今如下几个方面。
1.能够结构化存储大量的数据信息,方便用户进行有效的检索和访问。
2.能够有效地保持数据信息的一致性、完整性、下降数据冗余。
3.能够知足应用的共享和安全方面的要求。
4.数据库技术可以方便智能化地分析,产生新的有用信息。
第六章
程序数据集散地:数据库
本章技能目标
1.掌握数据库的基本概念
2.掌握SSMS的基本操做
3.掌握如何建立和配置SQL Server数据库
数据库(Database,简称 DB)技术是程序开发人员必须掌握的技术之一,在前面学习的
C#语言中,数据都是使用变量保存在内存中,一旦程序运行完毕,内存中的这些数据
信息也会随之消失。
第七章
用表组织数据
★1.表相关的几个基本概念
数据完整性
1.实体完整性约束
实体完整性要求表中的每一行数据都反映不一样的实体,不能存在相同的数据行。
经过索引,惟一约束,主键约束或标识列属性。
2.域完整性约束
域完整性指的是给定列输入的有效性。
经过限制数据类型,检查约束,输入格式,外键约束,默认值,非空约束等多种方法,
能够实现表的域完整性。
3.引用完整性约束
在输入或删除数据时,引用完整性约束用来保持表之间已定义的关系。
4.自定义完整性约束
用户自定义完整性用来定义特定的规则。
★2.主键和外键
1.主键Primary Key
2.外键Foreign Key
★3.建立数据库表
1.在SQL Server Management Studio 中创建数据库表
2.肯定列的数据类型
Unicode是一种在计算机上使用的字符编码,它为每种语言中的每一个字符设定了统一
而且惟一的二进制编码,以知足跨语言,跨平台进行文本转换,处理的要求。
3.保存数据库表
★4.完善表的设计结构
1.是否容许为空值
2.创建主键
3.默认值
4.标识列
★5.向表中插入数据
★6.创建表间关系
1.如何创建表间关系
2.创建数据库关系图
★7.创建检查约束
1.如何创建检查约束
★8.删除数据库表
第八章
用SQL语句操做数据
本章技能目标
1.使用T-SQL向表中插入数据
2.使用T-SQL更新表中数据
3.使用T-SQL删除表中数据
★1.SQL简介
1.SQL能作什么
SQL是针对数据库而言的一门语言,它能够建立数据库,数据表,能够针对数据库的数
据进行增、删、改、查等操做,能够建立视图,存储过程,能够赋予用户权限等。
2.SQL和T-SQL
SQL全称是“结构化查询语言(Stuctured Query Language)”
SQL语言不一样于C#这样的程序设计语言,它是只能被数据库识别的指令,可是在程序
中,能够利用其余编程语言组织SQL语句发送给数据库,数据库再执行相应的操做。
3.SQL的组成
DML(Data Manipulation Language,数据操做语言,也称为数据操纵语言):用来插
入,修改和删除数据库中的数据,如INSERT,U
第九章
数据查询基础
本章技能目标
1.理解查询的机制
2.使用SELECT语句进行条件查询
3.掌握查询排序
4.使用表达式、运算符和函数实现查询
★1.T-SQL查询基础
1.查询机制简介
查询是针对表中已经存在的数据行而言的,能够简单地理解为“筛选”,将必定条件的
数据抽取出来。
数据表在接受查询请求的时候,能够简单地理解为“它将逐行判断”,判断是否符合查
询条件。若是符合查询条件就提取出来,而后把全部被选中的行组织在一块儿,造成另外
一个相似于表的结构,构成查询的结果,一般叫作记录集(RecordSet)。
因为记录集的结构实际上和表的结构相似,都是由行组成的,所以在记录集上依然能够
进行再次查询。
★2.使用SELECT语句进行查询
查询使用SELECT语句,最简单的查询语句的格式能够表示为:
★语法
SELECT<列名>
FROM<表名>
[WHERE <查询条件表达式>]
[ORDER BY <排序的列名>[ASC或DESC]]
其中,WHERE的条件是可选的,若是不限制,则查询返回全部行的数据项。ORDER BY 是
用来排序的,后续内容将会详细介绍。
经验
查询语句能够分为多个子句部分,例如,上面的查询语法能够划分为SELECT……
FROM……WHERE……ORDER BY……四个子句,对于复杂多行的SQL语句,能够将每一个
子句单独写成一行,以方便调试和查找错误。
1.查询全部的数据行和列
把表中的全部行和列都列举出来比较简间,这时候可使用“*”表示全部的列:
SELECT * FROM Students
2.查询部分行或列
查询部分列须要列举不一样的列名,而查询部分行须要使用WHERE子句进行条件限制,
查询地址为“河南新乡”的学生,而且只显示编号,姓名和地址列。
SELECT Scode,SName,SAddress
FROM Students
WHERE SAddress = '河南新乡'
3.在查询中使用列的别名
AS子句能够用来改变结果集列的名称,也能够为组合或者计算出的列指定名称。
SELECT Scode AS 学生编号,SName AS 学生姓名,SAddress AS 学生地址
FROM Students
WHERE SAddress <> '河南新乡'
假设在某数据库的雇员表Employees存在FirstName列和LastName列,如今须要将这两列
合并成一个叫作“姓名”的列,可使用如下查询语句:
SELECT FirstName+'.'+LastName AS 姓名
FROM Employees
从新命名列名还有一种方法,就是采用“=”来命名,例如:
SELECT 姓名 = FirstName+'.'+LastName
FROM Employees
4.查询空值
第十章
模糊查询和聚合函数
本章技能目标
1.使用LIKE、BETWEEN、IN进行模糊查询
2.使用聚合函数统计和汇总查询信息
★1.模糊查询
模糊查询提取的数据不必定是确切的,查询者对查询条件也是模糊的,大概的,不特别
明确的。
前面章节学习过的IS NULL查询严格说也是一种模糊查询。
★2.通配符
简单地讲,通配符是一类字符,它能够代替一个或多个真正的字符,查找信息时做为替
代字符出现。T-SQL中的通配符必须与LIKE关键字一块儿使用,以完成特殊的约束或要求。
通配符 解释
_ 一个字符
A LIKE 'C_'
CS、Cd等
% 任意长度的字符串
B LIKE 'CO_%'
CONST、COKE等
[ ] 括号中所指定范围内的一个字符
C LIKE '9W0[1-2]'
9W01或9W02
[^] 不在括号中所指定范围内的一个字符
D LIKE '%[A-D][^1-2]'
9W03或9W07等
★3.使用LIKE进行模糊查询
LIKE运算符用于匹配字符串或字符串的一部份(称为子串)。因为该运算符只用于字符
串,因此仅与字符数据类型(char或varchar等)联合使用。
查找姓张的学生信息
SELECT * FROM Students WHERE SName LIKE '张%'
或者查询住址包含“北京”字样的学生信息
SELECT * FROM Students WHERE SAddress LIKE '%北京%'
★4.使用BETWEEN在某个范围内进行查询
使用关键字 BETWEEN 能够查找那些介于两个已知值之间的一组未知值。要实现这种查
找,必须知道查找的初值和终值,而且初值小于等于终值,初值和终值用单词 AND 分
开,例如:
查询分数在60(含)到80(含)之间的信息以下:
SELECT * FROM SCore WHERE Score BETWEEN 60 AND 80
若是写成以下形式;
SELECT * FROM Score WHERE Score BETWEEN 80 AND 60
则不会报语法错,但也不会查询到任何信息。
查询不在2010年1月1号2010年8月1号之间订购的图书列表
SELECT * FROM Sales WHERE ord_date NOT BETWEEN '2010-1-1' AND '2010-8-1'
★5.使用IN在列举值内进行查询
查询的值是指定的某些值之一,可使用带列举值的IN关键字来进行查询。将列举值
放在小括号里,用逗号分开,例如:
查询北京,广州或者上海的学生姓名:
SELECT SName AS 学生姓名
FROM Students
WHERE SAddress IN ('北京','广州','上海')
ORDER BY SAddress
一样能够把 IN 关键字和 NOT 关键字合起来使用,这样能够获得全部不匹配列举值
的行。
★6.T-SQL中的聚合函数
聚合函数可以基于列进行计算,将多个值合并为一个值,其做用是对一组值进行计算
,并返回计算后的值。
1.SUM()
SUM()返回表达式中全部数值的总和。
SUM()只能用于数字类型的列,不可以汇总字符,日期等其余数据类型。
查询学生编号为23的学生总分。
SELECT SUM(Score) AS 学号为23的学生总分
FROM Score
WHERE StudentID=23
注意这种查询只返回一个数值,所以,不可以直接与可能返回多行的列一块儿使用来进行
查询
SELECT SUM(Score) AS 学号为23的学生总分,CourseID AS 科目编号
FROM Score
WHERE StudentID=23
2.AVG()
AVG()函数返回表达式中全部数值的平均值。
AVG()函数也只能用于数字类型的列。
查询及格线以上学生的平均成绩。
SELECT AVG(Score) AS 平均成绩
FROM Score
WHERE Score>=60
3.MAX()和MIN()
MAX()返回表达式中的最大值,MIN()返回表达式中的最小值,
它们均可以用于数字型、字符型以及日期/时间类型的列。
查询平均成绩,最高分,最低分。
SELECT AVG(Score) AS 平均成绩,MAX(Score) AS 平均成绩,MIN(Score) AS 最低分
FROM Score
WHERE Score >=60
4.COUNT()
COUNT()返回提供的组或记录集中的计数。COUNT()能够用于数字和字符类型的列。另
外,也可使用星号(*)做为COUNT的表达式,使用星号能够没必要指定特定的列而计算
全部的行数。
查询及格人数的语句
SELECT COUNT(*) AS 及格人数
FROM Score
WHERE Score>=60
本章总结
1.通配符是一类字符,它能够代替一个或多个真正的字符,查找信息时做为替代字符
出现。
2.“_”和“%”分别匹配一个字符和多个字符。
3.使用LIKE、BETWEEN、IN关键字,可以进行模糊查询。
4.聚合函数可以对列进行计算,对于分析和统计很是有用。
5.经常使用的聚合函数如SUM()、AVG()、MAX()、MIN()、COUNT()。
第十一章
联接查询和分组查询
本章技能目标
1.使用GROUP BY 进行分组查询
2.掌握多表联接查询
★1.分组查询
1.使用GROUP BY进行分组查询
采用分组查询实现的T-SQL语句以下:
SELECT CourseID,AVG(Score) AS 课程平均成绩
FROM Score
GROUP BY CourseID
1.查询男女学生的人数各是多少
SELECT COUNT(*) AS 人数,SSex FROM Students
GROUP BY SSex
2.查询每一个年级的总人数
SELECT COUNT(*) AS 年级人数,SGrade FROM Students
GROUP BY SGrade
3.查询每一个科目的平均分,而且按照由低到高的顺序排列显示
对比
思路同前面的同样,按照科目进行分组。
分数由高到低进行排序,须要用到ORDER BY子句,问题是这个ORDER BY子句
放在哪一个位置?GROUP BY 子句以前仍是以后?如今来仔细想一下,进行排序时,
应该是对分完组后的平均分进行一个排序,这样想来应该放在GROUP BY子句之
完整的T-SQL语句以下。
SELECT CourseID,AVG(Score) AS 课程平均成绩 FROM Score
GROUP BY CourseID
ORDER BY AVG(Score) DESC
★2.多列分组查询
分组查询有时候可能还要按照多个列来进行分组。例如,学生信息表Students中记录了
每一个学生的信息,包括所属年级和性别等。
若是要统计每一个学期的男女学生人数,则理论上先把每一个学期分开,而后针对每一个学
期,把男女学生人数各自统计,也就是须要按照两个列进行分组,所属年级和性别。
SELECT COUNT(*) AS 人数,SGrade AS 年级,SSex AS 性别 FROM Students
GROUP BY SGrade,SSex
ORDER BY SGrade
不难理解,使用GROUP BY 关键字时,在SELECT列表中能够指定的列是有限制的,仅
容许如下几项。
1.被分组的列。
2.为每一个分组返回一个值的表达式,例如聚合函数计算出的列。
★3.使用HAVING子句进行分组筛选
1.查询年级总人数超过15的年级
首先能够经过分组查询获取每一个年级的总人数。
SELECT COUNT(*) AS 人数,SGrade AS 年级 FROM Students
GROUP BY SGrade
可是还有一个条件:人数超过15的年级。这个时候,牵扯到分组统计后的条件限制。
限制条件为COUNT(*)>15。这时候使用WHERE子句是不能知足查询要求的,由于
WHERE子句只能对没有分组统计前的数据行进行筛选。对分组后的条件的筛选必须使用
HAVING子句,简单地说,HAVING子句用来对分组后的数据进行筛选,将“组”看作
“列”来限定条件。
SELECT COUNT(*) AS 人数,SGrade AS 年级 FROM Students
GROUP BY SGrade
HAVING COUNT(*)>15
2.查询平均分及格的课程信息。
在查询每一个科目平均分的基础上,增长了一个条件:平均分及格的科目。这样按照科目
进行分组后,使用AVG(Score)>=60控制及格件便可。
SELECT CourseID AS 课程编号,AVG(Score) AS 课程平均成绩
FROM Score
GROUP BY CourseID
HAVING AVG(Score)>=60
HAVING和WHERE子句能够在同一个SELECT语句中一块儿使用,使用顺序应以下。
WHERE→GROUP BY→HAVING
在SELECT语句中,WHERE,GROUP BY,HAVING子句和聚合函数的执行次序
以下:WHERE子句从数据源中去掉不符合其搜索条件的数据:GROUP BY 子句搜
集数据行到各个组中,统计函数为各个组计算统计值:HAVING子句去掉符合其
组搜索条件的各组数据行。
3.查询每门课程及格总人数和及格学生的平均分
分析
经过需求了解到所查询的信息,都是要求及格的统计,这样就首先从数据源中将不
及格的进行滤除,而后对符合及格要求的数据再进行分组处理。
SELECT COUNT(*) AS 人数,AVG(Score) AS 平均分,CourseID AS 课程 FROM Score
WHERE Score>=60
GROUP BY CourseID
4.查询每门课程及格总人数和及格平均分在80分以上的记录
分析
同上一个查询需求思路一致,只是加了一个对分组后数据的条件:及格平均分在80
分以上,增长HAVING子句便可
SELECT COUNT(*) AS 人数,AVG(Score) AS 平均分,CourseID AS 课程 FROM Score
WHERE Score>=60
GROUP BY CourseID
HAVING AVG(Score)>=80
5.在按照部门分类的员工表中,查询“有多个员工的工资不低于2000的部门编号”
分析
利用WHERE子句首先滤除工资低于2000的记录,而后再按照部门进行分组,最后
对分组后的记录进行条件限定。
SELECT 部门编号,COUNT(*) FROM 员工信息表
WHERE 工资 >= 2000
GROUP BY 部门编号
HAVING COUNT(*) > 1
★4.多表联接查询
▲1.多表联接查询的分类
多表联接查询其实是经过各个表之间共同列的关联性来查询数据的,它是关系数据库
查询最主要的特征。
如下是几种经常使用的联接:内联接,外联接。
1.内联接
内联接是最典型,最经常使用的联接查询,它根据表中共同的列来进行匹配。特别是两个表
存在主外键关系时一般会使用到内联接查询。
2.外联接
外联接是至少返回一个表中的全部记录,根据匹配条件有选择性地返回另外一张表的记录。
外联接能够是左外联接,右外联接。
★5.内联接查询
内联接查询一般会使用像“=”或“<>”等比较运算符来判断两列数据值是否相等。
上面所说的根据学生学号来判断出学生姓名的联接就是一种内联接。
内联接使用INNER JOIN…ON关键字或WHERE子句来进行表之间的关联。内联接查询可
以经过两种方式实现。
1.在WHERE子句中指定联接条件
例如查询学生姓名和成绩
SELECT Students.SName,Score.CourseID,Score.Score
FROM Students,Score
WHERE Students.SCode = Score.StudentID
2.在FROM 子句中使用INNER JOIN…ON
SELECT S.SName,C.CourseID,C.Score
FROM Students AS S
INNER JOIN Score AS C ON (S.SCode = C.StudentID)
在上面的内联接查询中:
INNER JOIN 用来联接两个表。
INNER 能够省略。
ON 用来设置条件。
AS 指定表的“别名”。若是查询的列名在用到的两个或多个表中不重复,则对这
一列的引用没必要用表名来限定。
查询科目编号为1的及格学生的姓名和分数。WHERE子句用来限定查询条件。
SELECT S.SName,C.CourseID,C.Score
FROM Students AS S
INNER JOIN Score AS C ON (S.SCode=C.StudentID)
WHERE C.Score>=60 AND C.CourseID=1
内联接查询一般不只仅联接两个表,有时候还会牵涉到三个表或者更多表。
例如,除了学生信息表,学生成绩表以外,还存在课程名称表。上面的查询不只仅
要显示学生姓名,分数,并且要经过课程编号来显示课程名称表中对应课程的名称。
可使用如下三表联接查询。
SELECT S.SName AS 学生姓名,CS.CourseName AS 课程名称,C.Score AS 考试成绩
FROM Students AS S
INNER JOIN Score AS C ON (S.SCode=C.StudentID)
INNER JOIN Course AS CS ON (CS.CourseID=C.CourseID)
★6.外联接查询
内联接的结果是从两个或两个以上表的组合中挑选出符合联接条件的数据,
若是数据没法知足联接条件则将其丢弃。在内部联接中,参与联接表的地位是平等的。
与内部联接相对的方式称为外部联接。在外部联接中参与联接的表有主从之分,以主表
的每行数据匹配从表的数据列,将符合联接条件的数据直接返回到结果集中,对那些不
符合联接条件的列,将被填上NULL值(空值)后再返回到结果集中。
1.左外联接查询
左外联接的结果集包括LEFT JOIN子句中指定的左表的全部行,而不只仅是联接列所匹
配的行。若是左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的全部选
择列均为空值。
左外联接使用LEFT JOIN…ON或LEFT OUTER JOIN…ON关键字来进行表之间的关联。
SELECT S.SName,C.CourseID,C.Score
FROM Students AS S
LEFT OUTER JOIN Score AS C ON S.SCode = C.StudentID
有部分学生可能没有参加过任何科目的考试,因此成绩表中没有相关的考试记录,对应
的科目编号和成绩以NULL(空值)填充。
SELECT CS.CourseName,C.StudentID,C.Score
FROM Course AS CS
LEFT OUTER JOIN Score AS C ON CS.CourseID=C.CourseID
2.右外联接查询
右外联接查询与左外联接查询相似,只不过要包含右表中全部匹配的行。若是右表中有
的项在左表中没有对应的项,则以NULL值填充。
右外联接使用RIGHT JOIN…ON 或RIGHT OUTER JOIN…ON关键字来进行表之间的关联。
本章总结
1.分组查询是针对表中不一样的组分类统计和输出的,GROUP BY 子句一般会结合聚合
函数一块儿来使用。
2.HAVING子句可以在分组的基础上,再次进行筛选。
3.多个表之间一般使用联接查询。
4.最多见的联接查询是内联接(INNER JOIN…ON),一般会在相关表之间提取引用
列的数据项。
第十三章
项目案例:QQ数据库管理
本章技能目标
1.掌握建立数据库并为数据表添加约束
2.掌握建立数据表之间的关系
3.使用T-SQL语句对数据进行综合管理
4.使用管理器进行数据库的管理
▲1.用例1:建立QQ数据库及登陆名
使用管理器建立QQ数据库,并为其建立登陆名QQMaster,要求以下。
1.数据文件初始大小为10MB,文件按15%自动增加,最大文件大小不受限制。
2.日志文件初始大小为5MB,文件按1MB自动增加,最大文件大小为50MB。
QQMaster权限等同管理员权限,自动建立关联数据库用户QQMaster。
★提示
注意保存到本地磁盘的位置
▲2.用例2:建立表结构
在管理器中根据以上分析的QQ数据库的表结构建立用户表QQUser,用户基本信息表
BaseInfo和用户关系表Relation
★提示
根据实际状况,注意设置主键,数据类型长度,不容许为空的列等基本表结构要求。
▲3.用例3:添加约束
根据问题分析,概括总结三个表全部的约束条件以下。
1.QQ密码不得少于6位。
2.在线状态的值必须为0,1,2, 0表示在线,1表示离线,2表示隐身。
3.用户等级默认值为0。
4.性别容许为空值,但若是输入值就必须为0或1,0表示男,1表示妇。
5.年龄必须是在1~100之间的整数。
6.用户关系只能是数字0,1, 0表示好友,1表示黑名单人物。
▲4.用例4:创建关系
1.用户表和基本信息表是--对应的关系,一个QQ号码对应着一个用户记录和一个
基本信息记录。
2.关系表中存在的QQ必然是在用户表中存在的用户QQ,而且一个QQ能够有多个
好友,多个黑名单人物,也能够是别人的好友,黑名单人物。
--▲5.用例5:插入数据
--请根据表提供的信息要求,在查询窗口中使用T-SQL语句把表中的数据
--插入到对应的数据表中。
INSERT INTO QQUser (
[QQID]
,[PassWord]
,[LastLogTime]
,[Online]
,[Level])
SELECT '54789625','add512#&','2008-02-16 17:01:35',2,1 UNION
SELECT '88662753','admin0219','2008-02-19 21:08:50',0,5 UNION
SELECT '8855678','guest0221','2008-02-21 16:28:20',1,6
INSERT INTO BaseInfo ([QQID]
,[NickName]
,[Sex]
,[Age]
,[Province]
,[City]
,[Address]
,[Phone])
SELECT '54789625','蝴蝶飞飞',1,16,'北京','朝阳区','亚运村','37547388157668' UNION
SELECT '88662753','秋芙蓉',0,20,'河南省','南阳','方城博望','88715783657725' UNION
SELECT '8855678','双眼皮の潴',1,38,'北京','海淀区','双榆树东里','65794968876143'
INSERT INTO Relation ([QQID]
,[RelationQQID]
,[RelationStatus])
SELECT '54789625','88662753',0 UNION
SELECT '88662753','8855678',1 UNION
SELECT '8855678','8855678',0
SELECT * FROM QQUser
SELECT * FROM BaseInfo
SELECT * FROM Relation
--利用导入/导出向导将提供的文本文件中用户信息,用户基本信息,用户关系信息的数
--据导入到相对应的数据表中。
--★提示
--导入用户关系数据时,必定要注意三个QQ用户已经使用T-SQL语句插入成功,因
--为其中的数据用到了这三个用户。
--▲6.用例6:查询数据
--编写T-SQL语句按如下要求查询数据。
--1.查询QQ号码为88662753的用户的全部好友信息,包括QQ号码(QQID),昵称
--(NickName),年龄(Age)。
--★提示
--利用内联接实现。
SELECT R.RelationQQID AS 好友QQ号码,B.NickName AS 昵称,B.Age AS 年龄
FROM BaseInfo AS B
INNER JOIN Relation AS R ON (B.QQID=R.RelationQQID)
WHERE R.QQID='88662753' AND R.RelationStatus=0
--2.查询当前在线用户的信息。
SELECT *
FROM BaseInfo AS B
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE Q.Online=0
--3.查询北京的,年龄在18至45岁之间的在线用户的信息。
SELECT *
FROM BaseInfo AS B
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE Q.Online=0 AND B.Province ='北京市' AND Age>=18 AND Age<=45
--4.查询昵称为“小笨猪”的用户信息。
SELECT *
FROM BaseInfo AS B
WHERE B.NickName='小笨猪'
--5.查询QQ号码为54789625的用户的好友中每一个省份的总人数,而且按总人数由大
--到小排序。
--★提示
--利用SELECT…FROM…WHERE…GROUP BY…ORDER BY…实现,其
--中内联接条件WHERE的T-SQL语句可参考以下。
--WHERE(Relation.QQID=54789625 AND Relation.RelationStatus=0 AND
--Relation.RelationQQID=BaseInfo.QQID)
SELECT B.Province AS 省份,COUNT(*) AS 好友总人数
FROM BaseInfo AS B,Relation AS R
WHERE(R.QQID='54789625' AND R.RelationStatus=0 AND
R.RelationQQID=B.QQID)
GROUP BY B.Province
ORDER BY COUNT(*) DESC
--6.查询至少有150天未登陆QQ帐号的用户信息,包括QQ号码,最后一次登陆时
--间,等级,昵称,年龄,并按时间的降序排列。
--★提示
--利用日期函数DATEDIFF()计算出超过150未登陆过的QQ号码,再利用联接查询获
--取相应的信息。
SELECT B.QQID AS QQ号码,LastLogTime AS 最后一次登陆时间,Level AS 等级
,NickName AS 昵称,Age AS 年龄
FROM BaseInfo AS B
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE DATEDIFF(DD,Q.LastLogTime,GETDATE())>=150
--7.查询QQ号码为54789625的好友中等级为10级以上的“月亮”级用户信息。
--★提示
--利用三表联接查询。
SELECT B.QQID AS 好友QQ号码,B.NickName AS 昵称,B.Age AS 年龄,Q.Level AS 等级
FROM BaseInfo AS B
INNER JOIN Relation AS R ON (B.QQID=R.RelationQQID)
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE R.QQID='54789625' AND Q.Level>=10 AND R.RelationStatus=0
ORDER BY B.QQID
--8.查询QQ号码为54789625的好友中隐身的用户信息。
SELECT B.QQID AS 好友QQ号码,B.NickName AS 昵称,B.Age AS 年龄
FROM BaseInfo AS B
INNER JOIN Relation AS R ON (B.QQID=R.RelationQQID)
INNER JOIN QQUser AS Q ON (Q.QQID=B.QQID)
WHERE R.QQID='54789625' AND Q.Online=2 AND R.RelationStatus=0
--9.查询好友超过20个的用户QQ号码及其好友总数。
--★提示
--利用分组查询,而且增长分组条件HAVING COUNT(*)>=20。
SELECT R.QQID AS 超过20个的用户QQ号码,COUNT(*) AS 好友总数
FROM Relation AS R
WHERE R.RelationStatus=0
GROUP BY R.QQID
HAVING COUNT(*)>=20
--10.为了查看信誉度,管理员须要查询被当作黑名单人物次数排名前20的用户。
--★提示
--利用分组查询,注意需求,按照关系用户QQ号码RelationQQID进行分组。
SELECT TOP 20 (R.RelationQQID) AS 黑名单人物次数排名前20的用户,COUNT(*) AS 黑名单次数
FROM Relation AS R
WHERE R.RelationStatus=1
GROUP BY R.RelationQQID
ORDER BY COUNT(*) DESC
--▲用例7:修改数据
--编写T-SQL语句使其按如下要求修改数据。
--1.假设个人QQ号码为8855678,今天我隐身登陆。
UPDATE QQUser
SET Online=2
WHERE QQID='8855678'
--2.假设个人QQ号码为8855678,修改个人昵称为“被淹死的鱼”,地址为“解放中
--路6号院106室”。
UPDATE BaseInfo
SET NickName='被淹死的鱼',Address='解放中路6号院106室'
WHERE QQID='8855678'
--3.假设个人QQ号码为8855678,将个人好友“248624066”拖进黑名单。
UPDATE Relation
SET RelationStatus=1
WHERE QQID='8855678' AND RelationQQID='248624066'
--4.为了提升QQ用户的聊天积极性,把等级小于6级的用户等级都升升1个级别。
UPDATE QQUser
SET Level=Level+1
WHERE Level<6
--5.管理员将超过365天没有登陆过的QQ锁定(即将等级值设定为-1)。
UPDATE QQUser
SET Level=-1
WHERE DATEDIFF(DD,LastLogTime,GETDATE())>365
--6.为了奖励用户,将好友数量超过20的用户等级提高1个级别。
--★提示
--首先,获取好友超过20个的用户QQ号码结果集,参考用例7的须要9。
--其次,利用IN关键字模糊匹配结果集中的QQID进行更新。
--UPDATE QQUser SET…WHERE QQID IN (SELECT QQID FROM Relation…)
UPDATE QQUser
SET Level=Level+1
WHERE QQID IN (
SELECT QQID
FROM Relation AS R
WHERE R.RelationStatus=0
GROUP BY R.QQID
HAVING COUNT(*)>=20)
--7.把QQ号码为286314的用户的好友“嘟嘟鱼”拖进黑名单中。
--★提示
--完成思路参考需求6,使用IN关键字进行模糊匹配。
UPDATE Relation
SET RelationStatus=1
WHERE QQID='286314' AND RelationQQID IN (
SELECT B.QQID
FROM BaseInfo AS B,Relation AS R
WHERE R.RelationStatus=0 AND B.NickName='嘟嘟鱼')
--▲用例8:删除数据
--1.把QQ号码为54789625的用户的黑名单中的用户删除。
DELETE FROM Relation WHERE QQID='54789625' AND RelationStatus=1
--2.QQ号码为622009019用户屡次在QQ中发布违法信息,形成了很坏的影响,所以
--管理员决定将其删除。
--★提示
--此需求须要从三张表中删除相关信息,注意从各表删除的前后次序。
DELETE FROM Relation WHERE QQID='622009019' OR RelationQQID='622009019'
DELETE FROM BaseInfo WHERE QQID='622009019'
DELETE FROM QQUser WHERE QQID='622009019'
--3.管理员将超过1000天没有登陆过的QQ删除。
--★提示
--实现此需求,须要分四步走。
--第一步:查询超过1000天没有登陆过的QQID集。
SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000
--第二步;删除Relation表中的数据,利用IN关键字模糊匹配QQID集。参孝以下的
--T-SQL语句。
--DELETE FROM Relation
--WHERE QQID IN(…) OR RelationQQID IN(…)
DELETE FROM Relation
WHERE QQID IN(SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000)
OR RelationQQID IN(SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000)
--第三步:删除BaseInfo表中的数据,同理利用IN关键字模糊匹配QQID集。
DELETE FROM BaseInfo
WHERE QQID IN(SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000)
--第四步;删除QQUser 表中的数据。
DELETE FROM QQUser
WHERE QQID IN(SELECT QQID FROM QQUser WHERE DATEDIFF(DD,LastLogTime,GETDATE())>=1000)
--▲用例9:分离数据库
第十四章
使用ADO.NET 访问数据库
本章技能目标
1.了解ADO.NET的功能和组成
2.会使用Connection对象链接数据库
3.会使用Command对象查询单个值
4.会捕获和处理程序中的异常
★1.ADO.NET概述
在信息系统中,经常使用的数据库有不少种,好比有SQL Server、Access、Oracle等。为了
使客户端可以访问数据库服务器上的数据,就须要用到数据库访问的方法和技术,
ADO.NET(ActiveX Data Objects)就是这种技术之一。
1.ADO.NET简介
ADO.NET是,NET Framework中不可缺乏的一部分,它是一组类。经过这些类,NET应
用程序就能够访问数据库了。ADO.NET的功能很是强大,它提供了对关系数据库。XML
以及其余数据存储的访问。应用程序能够经过ADO.NET技术与这些数据源进行链接。
对数据进行增、删、改、查等操做。
ADO.NET技术的一个很是大的优势是,它与数据源断开链接时也可使用数据。
ADO.NET能够把从数据源检索到的数据保存在本地一个叫作“数据集”的地
方,这样应用程序就能够直接操做本地的数据,而数据源能够为更多的应用程序提供服
务。这就是ADO.NET的断开链接模型。
★2.ADO.NET的主要组件
ADO.NET提供了两个组件,用来访问和处理数据:NET Framework数据提供程序和
DataSet(数据集)
.NET Framework数据提供程序是专门为数据处理以及快速地只进、只读访问数据而
设计的组件。使用它能够链接数据源、执行命令和检索结果,直接对数据源进行操
做。
DataSet是专门为独立于任何数据源的数据访问而设计的。使用它,能够没必要直接
和数据源打交道,能够大批量地操做数据,也能够将数据绑定在控件上。
ADO.NET 的主要组件
.NET Framework 数据提供程序--用于链接到数据库、执行命令和检索结果
DataSet(数据集)--独立于数据源的数据访问
.NET 数据提供程序类型
.NET Framework 数据提供程序
SQL Server .NET 数据提供程序
说 明
Microsoft SQL Server 数据源
System.Data.SqlClient 命名空间
OLE DB .NET 数据提供程序
说 明
OLE DB 公开的数据源
System.Data.OleDb 命名空间
ODBC .NET 数据提供程序
说 明
ODBC 公开的数据源
System.Data.Odbc 命名空间
Oracle .NET 数据提供程序
说 明
Oracle 数据源
System.Data.OracleClient 命名空间
★3..NET Framework数据提供程序的四个核心对象
1.Connection--创建与特定数据源的链接
2.Command--对数据源执行命令
3.DataReader--从数据源中读取只进且只读的数据流
4.DataAdapter--用数据源填充DataSet并解析更新
★4.使用Connection对象
当应用程序要访问数据的时候,怎样可以找到数据库呢?这就须要Connection对象。它
就像是车间到仓库的一条路,有了Connection对象,应用程序就可以与数据库创建连
接,完成数据访问操做。
★5.认识Connection对象
不一样命名空间的 Connection 对象
命名空间对应的 Connection 对象
System.Data.SqlClient
SqlConnection
System.Data.OleDb
OleDbConnection
System.Data.Odbc
OdbcConnection
System.Data.OracleClient
OracleConnection
Connection 主要成员
属性名称
ConnectionString
说 明
链接字符串
方法 说 明
Open() 打开数据库链接
Close() 关闭数据库链接
链接数据库步骤
一、定义链接字符串
★语法
Data Source=服务器名;Initial Catalog=数据库名; User ID=用户名;Pwd=密码
二、建立 Connection 对象
★语法
SqlConnection connection = new SqlConnection(connString);
三、打开与数据库的链接
★语法
connection.Open( );
使用Visual Studio 的服务资源管理器得到链接字符串。方法以下。
1.在Visual Studio 中,选择菜单中的“视图”→“服务器资源管理器”命令,或按快
捷键Ctrl+Alt+S。
2.在打开的服务器资源管理器中,用鼠标右键单击“数据链接”,选择“添加链接”
命令,
3.在弹出的“添加链接”对话框中,选择数据源,输入服务器名,选择身份验证,选
择要链接的数据库,肯定后,就在服务器资源管理器中添加了一个数据链接。
4.选中新添加的链接,在“属性”窗口中就可以找到链接字符串了,能够将它选中复
制到代码中。
★注意
打开数据库链接,执行命令后,要确保关闭数据库链接。
★6.链接数据库示例
string strConn = "Data Source=R0OM9WXPH5ENXXY;Initial Catalog=MySchoolBase;User ID=sa;Password=123";
★7.常见错误
1.数据库链接字符串中各参数之间的分隔符错误
string strConn = "Data Source=R0OM9WXPH5ENXXY,Initial Catalog=MySchoolBase,User ID=sa,Password=123";
2.数据库链接字符串中参数名称拼写错误
string strConn = "DataSource=R0OM9WXPH5ENXXY;Initial Catalog=MySchoolBase;User ID=sa;Password=123";
3.数据库链接字符串中引号出现的位置不正确
string strConn = "Data Source=R0OM9WXPH5ENXXY;Initial Catalog=MySchoolBase;User ID="sa";Password="123";
在拼写数据库链接字符串时注意引号出现的位置。若是在数据库链接字符串中须要用
到单、双引号时,可使用"+"符号实现字符串的链接。
★8.异常处理
程序员编写应用程序不免会发生错误。有的错误是在编译时产生的,这就是编译错误。
有的错误是在程序运行的过程当中出现的,这种错误就是异常。有些异常可能没法避免但
是能够预知,好比咱们的程序正要读取数据库,网络忽然断了,程序没法控制网络是否
畅通,但能够预测到可能会有这种状况出现。为了保证应用程序正常运行,程序员要对
程序运行中可能发生的错误进行编码处理,这就是异常处理。
★9.如何处理异常
.NET提供了try-catch语句块来捕获和处理异常。
★语法
try
{
//包含可能出现异常的代码
}
catch(处理的异常类型)
{
//处理异常的代码
}
try-catch语句是把可能出现异常的代码放在try块中。若是在程序运行过程当中发生了异
常,就会跳转到catch块中进行错误处理,这个过程叫作捕获了异常。若是程序执行没
有发生异常,那么将会正常执行try块中的所有语句,但不会执行catch块中的语句。
异常也有不少种类型,本课程咱们只需关注Exception类。这是.NET提供的一个异常类,
表示应用程序在运行时出现的错误。
try
{
conn.Open();
//……省略其余操做
conn.Close();
}
catch(Exception ex)
{
//处理异常的代码
}
前面强调过。数据库链接必须显式关闭。可是,若是在数据库链接关闭以前就出现了异
常,程序就会跳转到catch块当中,那么try块当中的数据库链接关闭方法就不会执行。
这时应该怎么办呢?这个问题.NET早就想到了,它提供了一个finally块,不管是否发
生异常,出如今finally块中的语句都会执行。这样就能够把关闭数据库链接的语句写在
finally块中。
try
{
conn.Open();
//……省略其余操做
}
catch(Exception ex)
{
//处理异常的代码
}
finally
{
conn.Close();
}
这样就确保了不管程序是否发生异常,在程序结束运行以前都会关闭数据库链接。
★注意
程序在执行了try块或catch块以后总会将控制权传递给finally块,与try块的退出方
式无关。
★10.处理数据库操做异常示例
★技巧
使用Visual Studio的“外侧代码”功能来添加try块。方法很简单,在Visual Studio
的代码编辑器中,选中可能会出现异常的代码,单击鼠标右键,选择“外侧代码”
在出现的外侧代码选择器中找到try。
★11.使用Command对象
咱们已经知道了如何创建应用程序和数据库的链接,那么打开数据库链接后,应该怎样
操做数据呢?这就须要Command对象。Command对象能够对数据库执行增、删、改、
查的操做。
1.认识Command对象
.NET数据提供程序及相应的命令类
SQL数据提供程序
包括在System.Data.SqlClient命名空间中
链接类
SqlCommand
OLE DB数据提供程序
包括在System.Data.OleDb 命名空间
链接类
OleDbCommand
ODBC数据提供程序
包括在System.Data.Odbc 命名空间
链接类
OdbcCommand
Oracle数据提供程序
包括在System.Data.OracleClient 命名空间
链接类
OracleCommand
★Command 的主要成员
属性名称 说 明
Connection Command对象使用的数据库链接
CommandText 执行的SQL语句
方法 说 明
ExecuteNonQuery 执行不返回行的语句,如UPDATE等
ExecuteReader 返回DataReader对象
ExecuteScalar 返回单个值,如执行COUNT(*)
本章主要介绍Command对象ExecuteScalar()方法的用法。ExecuteScalar()方法只返回查
询结果中第一行第一列的值。当查询结果只有一个数值时,一般调用这个方法,好比使
用聚合函数完成查询时。通常状况下,这个方法的返回值须要进行显式类型转换后才能
使用。
要使用Command对象,必须有一个可用的Connection对象,使用Command对象的步骤
包括如下几步。
1.建立数据库链接。
按照前面进过的步骤建立一个Connection对象。
2.定义执行的SQL语句。
将对数据库执行的SQL语句赋给一个字符串。
3.建立Command对象。
使用已有的Connection对象和SQL语句字符串建立一个Command对象。
4.执行SQL语句。
使用Command对象的某个方法执行命令。
★11.数据库查询示例
★12.常见错误
1.没有打开或关闭数据库链接
在使用Command对象执行命令前,若是没有执行connection.Open()语句,将会发生如
常见错误4所示的异常。
2.ExecuteScalar()方法的返回值没有进行类型转换
int num=comm.ExecuteScalar();
应该改为
int num=(int)comm.ExcuteScalar();
由于ExecuteScalar()方法的返回值是Object类型的,因此用该方法的返回值为其余变量
作赋值操做时,必须进行显式的类型转换。
本章总结
本章介绍了ADO.NET的结构,利用ADO.NET技术能够实现应用程序对数据库的访问操做。
1.ADO.NET是.NET Framework中的一组容许应用程序与数据库交互的类。
2.ADO.NET的两个主要组件是.NET Framework数据提供程序和DataSet。
3.NET 数据提供程序包括四个核心对象:Connection,Command,DataAdapter,DataReader。
4.Connection 对象用于创建应用程序和数据库之间的链接,须要定义链接字符串,必
须显式打开和关闭数据库链接。
5.Command对象容许向数据库传递请求,检索和操做数据库中的数据。
6.Command对象的ExecuteScalar()方法能够检索数据库并返回一个值。
7.数据库操做过程当中可能出现异常,可使用try-catch-finally语句处理异常。程序员