《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()    关闭数据库连接

连接数据库步骤
1、定义连接字符串
★语法
Data Source=服务器名;Initial Catalog=数据库名; User ID=用户名;Pwd=密码

2、创建 Connection 对象
★语法
SqlConnection connection =  new SqlConnection(connString);

3、打开与数据库的连接
★语法
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语句处理异常。

《C#语言和数据库技术基础》单词必备的更多相关文章

  1. c#和数据库技术基础之程序设计集散地-数据库

    数据库,不明觉厉,今天我们就来数据库的神秘面纱 1.使用数据库的必要性 随着互联网技术的高速发展,截止到2013年我国网民的数量已接近6亿,网民数量的增长同事带动网上购物,微博,网络视频等新产业的发展 ...

  2. 《数据库技术基础与应用(第2版)》学习笔记——第7章~

    从这章开始,操作的内容开始增多,概念的东西越来越少,可能跟学校的教学目的有关,但是跟我的学习目的不匹配,就不再继续整理. 总结:这本书适合大学本科生学习和了解数据库的相关知识以及Access和SQL ...

  3. C#语言和数据库基础

    第一章 第一个C#程序 Vs2012密钥 RBCXF-CVBGR-382MK-DFHJ4-C69G8 01..net和C#的区别 大概在2000年,微软推出了一种革命性的产品--.NET(战略) 目标 ...

  4. 数据库MySQL技术-基础知识

    数据库技术: SQL,关系数据库标准 注意: 环境编码:  cmd客户端是固定的gbk编码  而php网页中,是该网页文件的编码(现在主流都是utf8). mysql> set names gb ...

  5. Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)

    day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库:    简称:DataBase ---->DB    数据库即存放数据的仓库, ...

  6. 数据库技术丛书:SQL Server 2016 从入门到实战(视频教学版) PDF

    1:书籍下载方式: SQL Server2016从入门到实战 PDF 下载  链接:https://pan.baidu.com/s/1sWZjdud4RosPyg8sUBaqsQ 密码:8z7w 学习 ...

  7. .NET基础拾遗(6)ADO.NET与数据库开发基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基 ...

  8. 浅谈数据库技术,磁盘冗余阵列,IP分配,ECC内存,ADO,DAO,JDBC

    整理-----数据库技术,磁盘冗余阵列,IP分配, ECC内存,ADO, DAO,JDBC 1.MySQL MySQL是最受欢迎的开源SQL数据库管理系统,它由 MySQL AB开发.发布和支持.My ...

  9. JavaWeb开发技术基础概念回顾篇

    JavaWeb开发技术基础概念回顾篇 第一章 动态网页开发技术概述 1.JSP技术:JSP是Java Server Page的缩写,指的是基于Java服务器端动态网页. 2.JSP的运行原理:当用户第 ...

随机推荐

  1. UILable添加事件

    原文:http://blog.sina.com.cn/s/blog_9e8867eb0101dk6t.html 先需要声明的是:UILabel或UIImageView的 userInteraction ...

  2. 译者序(Core Data 应用开发实践指南)

    Core Data 是数据管理框架. 该书用Grocery Dude 购物管理程序来贯穿整个学习过程. 本书共分三个部分: 前7章为基础篇.从基础知识.迁移方式及扩展方式来讲解托管对象模型.怎么用图形 ...

  3. Spring mvc系列一之 Spring mvc简单配置

    Spring mvc系列一之 Spring mvc简单配置-引用 Spring MVC做为SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块 ...

  4. 浅谈tomcat的配置及数据库连接池的配置

    1.如何修改tomcat的端口 在某些情况下,可能需要修改tomcat监听的端口8080,比如: a.需要启动两份tomcat服务器 b.某个服务占用了8080端口(1433,1521,3306... ...

  5. JavaScript的核心

    对象 ECMAScript做为一个高度抽象的面向对象语言,是通过对象来交互的.即使ECMAScript里边也有基本类型,但是,当需要的时候,它们也会被转换成对象. 一个对象就是一个属性集合,并拥有一个 ...

  6. ASP.Net数据库如何存取图片

    当我们有大量的图片或者图片比较大时,我们常规的做法可能是保存图片路径,但是也不排除需要将图片直接存放到数据库的情况,此时就需要保存图片到数据库了.这篇文章我会向大家介绍: 如何通过FileUpLoad ...

  7. [html5] 学习笔记-响应式布局

    1.响应式布局介绍 响应式布局是2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是每一个终端做一个特定的版本.这个概念是为了兼容移动互联网浏览而诞生的,其目的是为用户提供 ...

  8. HTML5中的WebSocket

    在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法 ...

  9. 一个想法(续三):一份IT技术联盟创业计划书,开启众筹创业征程

    写在创业计划书之前的话: 昨天在闪存里我@了dudu,说:我要借钱,不久dudu回了我:傍个富婆. 当然,dudu以为我是玩笑,其实,我的确是开玩笑的,哈. 不过我正在执行一个创业计划,如果启动,我会 ...

  10. ArcGIS制图表达Representation-制图表达原理

    ArcGIS制图表达技术-制图表达原理 by 李远祥 在讲述原理之前,需要对上一章内容进行一些必要的补充说明.既然制图表达有很多优势,是不是什么情况下都可以使用制图表达技术呢?如果有以下的一些特殊的要 ...