.net学习中遇到的知识点集锦

 .netFramework
是微软公司的最新开发工具;
支持最新的开发技术;
支持最新的软件设计思想;
拥有全面的中文技术文档系统。

C#的特点:
1:注释有两种形式,第一个是//,第二个是/* */;
2: 区分大小写;
3:每一句话的结尾要用“;”;
4:有特定的入口方法。

主函数提供可执行程序的入口点。C#程序中只能有一个入口点。主函数必须为静态方法这将循序C#不必创建实例对象即可运行程序。主函数的第一个字母要大写,否则将不具有入口点的语义。C#是大小写敏感的语言。主函数的返回值只能是无类型或者整数类型。

最后我们一起来了解一下C#中的控制台I/O,console对象为我们提供了两种函数用来进行输入和输出的控制,用来进行输出的是write和writeline,将内容输出到输出设备上,这个输出设备一般是显示器。这些函数有一个共同的特点,它们支持很多类型的参数。无论是int还是 float还是其他函数类型都可以直接使用这个函数输出。write和 writeline的区别在于,writeline再完成输出内容之后会换行而write则不会.用来输入的函数是read和readline,主要是从键盘获得数据并且将这些数据保存再内存里面,它们的区别与WRITE和WRITELINE的区别是类似的。再C#语言中,从键盘获得数据都将作为字符串来进行处理。若我们要的不是字符串类型,则需要用相应的函数进行转化以后再使用的过程中会给大家更多的介绍。

设置断点是F9,或者用鼠标点击程序行对应左边灰色长框的位置。
F1是调入帮助文档。

算术运算符包括+,-,*,/,% 。 %是一个双目运算符。
关系运算符的结果要么是真要么是假。
运算符还可以分位单目,双目和三目运算符。单目主要是取反,非。三目运算符只有一个就是条件运算符“?:”

运算符的结合性分为从右往左运算和从左往右运算,一般单目运算符都属于前者其他的运算符都属于后者。

基本控制语句分为四类:顺序,分支,循环和跳转。

ctrl+alt+w可以用来添加监视窗口。

跳转语句主要有break,continue,return,goto.


break会直接退出循环体去运行循环体以外的语句,continue的作用的系统会跳过continue后面的语句而进行下一次循环。

switch后面的表达式必须是整型,字符型或者字符串型,case后面的必须是常量或者常量表达式不能是变量,每一个语句块后面都必须有break,如果语句块为空则后面的break可以省略。

变量的产生有两种方式。一种是只要程序一开始运行,变量的内存空间就开始进行分配了,而且最后变量内存的回收必须等到程序结束才进行。变量存在的时间是从程序开始进行到程序结束。
另外一种是变量的内存分配空间,是程序运行到变量所占据的内存空间的时候才分配内存空间的,等到域执行结束以后,相应的内存空间就被回收掉了。
这里的域主要有三种,分别是类域,函数域和块域。因此这两种变量的存活时间是有区别的。
虽然有区别但并不是在任何地方都可以任意使用存活的变量。因为只有在相应的域里面被定义的变量才可以被使用。如果希望一个变量从程序开始运行直到程序运行结束,这个变量一般是静态变量,定义静态变量时我们一般要加上关键字static。如果我们想要变量存活在程序运行的整个过程中,我们必须再这个变量前面加上一个static才行。

数组和字符串都属于引用类型。引用类型只是给引用类型变量名分配了内存空间,而真正的数据内存空间是用其他的方式分配的。

为什么要使用数组?
将相同的数据分配到一个连续的内存空间里面,然后将这段内存取一个名字,以后访问的时候我们可以使用同一个名字对所有的方式来进行访问。

数组是一组具有相同数据类型的值。
数组有两种定义方式,第一种实例化方式,例子:
    Internet[]ArrayName=new int[5]
这里给数组分配了5个内存空间。
第二种是实例化并同时初始化数组,
例子:
int []ArrayName=new int[5]{0,1,2,3,4}
这里给数组分配了5个内存空间且将0,1,2,3,4放到了数组中。

再给数组分配内存空间的时候一般都是用6分配的,用new分配的内存空间一般是再堆区分配的。如果我们要用new分配内存以后,内存的大小就不能再进行改变。

例:int []nArray1=new int[3]{1,2,3};
我们定义了一个名为nArray1的数组,我们来看下这个内存是怎么分配的?实际上系统会在两大内存区域里分配内存。第一块内存就是首先再栈区里面给这个数组的变量名nArray去分配一个内存空间,这是第一块内存空间。第二块内存空间就是在堆区里面给这个数组本身的1,2,3分配内存空间,最后我们将这个数组在堆区里所占据的内存空间的地址或者说是编号就存储在这个数组名所占据的这个内存空间里面。
例2:int []nArray1;
在这句话后面并没有带上new,因此这句话
仅仅是再栈区给数组的名字分配了内存空间,并没有在其他区里面去给这个数组分配内存。
例子:nArray2=nArray1;
那么这个结果就是将nArray1内存空间里面的值存储在nArray2这个所占据内存空间里面。


数组的遍历
length属性是用来存储数组的长度的,同时我们再打印这个数组的时候可以用for或者foreach来进行打印。
为什么数组是引用类型的数据?

面向对象是一种以人类自然理解食物的方式,来知道人们对软件西戎的分析,设计和实现。
面向对象的三大特性:封装,多态和继承。
 过程化的程序设计思想实际上是对代码的累加。

面向对象有两大好处:使得描述现实世界更加容易,使得程序后面的维护和扩充更加方便。

类是抽象的,对象是具体的。
一切皆对象。
属性是类公共拥有的一些特征。
行为(方法)是类里面的公共的描述。
类是一种自定义数据类型包括常量,变量和方法。

五种成员访问修饰符:
public 不受限制
private 在该类内部使用
protected 在该类内部和子类中进行访问
internal 可以被本组合体内的所有类存取
protected internal 可以被本组合体内的所有类和该类的子类所存取

UML是一种图表示的语言,用来描述类。
使用一个类定义的变量前,需要为改变量分配资源,这个过程叫做实例化。
类经过实例化为对象才可以正常使用。

构造函数当类实例化时,系统会自动调用构造函数。一个类里面可能有多个构造函数,但一次实例化中使用的构造函数只能有一个。
构造方法的的多个不同版本是通过方法重载来实现的,方法重载的方式如下:
传递不同个数的参数;传递个数相同但类型不同的刹那数;返回值不能用于区分。

析构方法与类同名,前面多了一个“~”,无参数,无返回值。

析构函数是类再释放资源的时候调用的一个方法。
析构函数的特点:
一个类可以有多个构造函数只能有一个析构函数;
析构函数不由人为控制,而有framework垃圾回收站控制;
一个类哪怕有多个构造函数,但是再类实例化到释放的过程中,只执行一次构造函数和一次析构函数。


属性器用于控制对成员变量的读和写,由set访问器和get访问器构成。
set访问器只能写不能读,get访问器只能读不能写。
属性控制器是用来对private字段的访问。

索引器用于控制对数组等类型字段的读和写。只能作用再实例对象上不能用于static类型。
this表示当前对象,不能在静态方法中使用。

命名空间提供了对类的管理和组织。命名空间最大的好处在于,在开发大型项目时,可以很好的解决类命名冲突的问题。
引用命名空间使用using命名空间名称。定义新的命名空间使用namespace命名空间名称。

 

数据库是表,视图,存储过程,触发器等数据库对象的集合,是数据库管理系统的核心内容。

创建数据库就是确定数据库名称,文件名称,数据文件大小,数据库的字符集是否自动增长以及如何自动增长等信息的过程。
创建数据库的两种方法:
1,用Microsoft SQL Server Management Studio工具创建数据库
2,用CREATE DATABASE语句创建

更改数据库主要有一下几种操作:
1,扩充数据库
2,收缩数据库
3,扩展事务文件
4,分离和附加数据库(用得最多的)
5,修改数据库名称

如何分离和附加数据库?
可以分离数据库的数据文件和事务日志文件,然后将它们重新附加到另一台服务器或者同一台服务器上。
附加数据库可以将其重置为分离时的状态。附加数据库时所偶遇的数据文件必须都是可用的。再附加数据库过程中,如果没有日志文件,系统将创建一个新的日志文件。

使用DROP DATABASE删除数据库
删除数据库的两种方法:
1,用SQL Server Management Studio
2,用DROP DATABASE语句删除数据库


添加数据(insert)要注意:
1,对于具有char,varchar,datetime数据类型的列,相应的值要用单引号括起来;
2,对具有bainry数据类型的列,相应的值要加上前缀0x。

 数据完整性就是保证在数据库中存储数据的一致性和正确性。

数据库完整性分类:
实体完整性(保证每一行都能由被称为主键的属性来标识),
域完整性(保证再有效范围内的值才能存储到相应列中),
引用完整性(又称为参照完整性,确保外键的值必须与相关的主键相匹配),
用户定义完整性(由用户制定的一组规则)。

实现数据完整性的主要方式是约束。
约束的分类:
主键约束primary key确保字段值不重复不为NULL
唯一约束unique确保字段值不重复
外键约束forcign key确保字段值必须来自指定表
检查约束check确保字段值的取值范围
缺省约束default给相应字段提供默认值
创建约束的层次:列层,表层
注意:约束即可在创表时创建也可在已存在的表上添加。

一个表上只能创建一个主键约束,但是一个主键可以是多个字段的组合。
use SuperMarket(选择数据库)
creat table product(创建主键约束)

    PID int primary key,
    PName varchar(50)
 )
创建外键约束
use SuperMarket
go

creat table ProductClass

    ClassID int primary key
    ClassName varchar(50)
 )

creat table Product

    PID int primary key
    ProductName varchar(50)
    ClassID int foreign key references ProductClass(ClessID)
 )

删除约束 Alter table 表名drop constraint约束名

面向对象的特征  封装 多态 继承
类是一种自定义数据类型  包括常量变量和方法
【类的修饰符】 class 类名 【:基类名,一个或多个接口名]
  {
      成员定义:
              方法、构造方法、析构方法

   class Person
     {
          private:
                 string szName;
                  int nAge;
             public:
            void ShowInfo();
      }
 

类的实例化  Person wang=new Person();

构造函数名跟类名相同

析构函数由由framework垃圾回收站控制
~Person

public 字段是可以任意访问的,属性控制器是用来对private字段的访问


public 类名
{
  private string 字段1;
  public string 属性名
    {
          get
          {
           return 字段1; 
          }
            set
            {
             字段1=value;
             }
}
为了让外界程序不能直接调用私有成员变量才使用属性器

this表当前字段  静态方法中不能使用this

某一个时刻,计算机中只有一个类的对象在被使用  正在被使用或正在被cpu描述的对象就用this

class person
{
 string [] Name =new string[3];
 public string this[int index]
{
get {return Name[index];}
set {Name[index]=value;}
}
}

 

 

DateTime   dt=new   DateTime();  
  dt=System.DateTime.Now;

 

更改数据库主要有一下几种操作
扩充数据库  收缩数据库 扩展事务文件
分离和附加数据库  修改数据库名称

基本数据类型   整数类型  浮点  字符类型   时间日期类型  二进制
创建数据库  create database 数据库名
删除数据库  drop database 数据库名
基本数据类型 ;整数类型 bit int samllint tinyint bigint
浮点类型 decimal numeric money smallmoney float  Real
字符类型 char varchar text nchar nvarchar ntext uniqueidentifier
时间日期 datetime  smalldatetime
二进制 binary  varbinary image  timestamp

创建表 create table  
修改表 alter table  表名
add 字段名(增加)
drop  column  price(删除)
删除表 drop table

向表中添加数据  insert【into】 表名
(表中字段名)
values(值数据 )
对于具有char  varchar  datatime数据类型用单引号
  bianry 类型前加0x

修改表中数据(表中一条记录)
updata 表名
set  字段名=表达式,……
where 条件表达式

删除表中数据
delete from 表名
where 条件表达式
truncate table 表名  删除所有记录

sp_renameb'old_name','newname'    重命名数据库
  

分离数据库 exec sp detach db ‘数据库名',’true‘

 

 

 

 

数据完整性的分类  实体 域 引用 用户完整性

实现数据完整性的主要方式是约束
约束分为 主键约束 唯一约束  外键约束 检查约束 缺省约束
创建约束的层次 列层 表层

实现数据完整性的工具有
规则、缺省值、约束和触发器
 


主键约束:
  格式:create table 表名
          (字段名 类型 constraint 约束名 primary key,..)
         alter table 表名
         add constraint 约束名 primary key(字段名)
一个表上只能创建一个主键约束,但一个主键可以是多个字段的组合


主键约束
use SuperMarket
 go
creat table Product
(
  PID int primary key;
  PName varchar(50)
)

 


外键约束

classid  int foreign key references product(classid)
alter table 表名
add foreign key (字段名1) references 表名 (字段名2)
注:字段名2 上必须有主键或唯一约束

删除约束
alter table 表名 drop constraint  约束名  

 


第四讲

 select type from Product

select * from product 

select type from product
where productname='乐事薯片'

 

select * from Product where classid in (2,3)


查询时会遇到重复的数据,如果要去掉重复的,可以使用distinct

 

模糊查询使用关键字 like

常用通配符有
        %  代表0个或多个字符
        _代表一个字符
        []代表某一范围的字符 [a-z]


select  top 3 * from product order by pid asc  升序
 降序为desc


select classid from product group by classid  having count (classid)=3

 

 

 

聚合函数又称基本函数或集函数,通过它能快捷的对数据进行统计,分析
常用的统计函数有:
avg()  求平均值
count() 统计数目
max()求最大值
min()求最小值
sum()求和
常用的字符串函数:
ASCII()得到最左边一个字符的ascii码值
char()将 ascll码转换成字符
lower()将字符串全部转为小写
left()用于得到从左边开始的部分字符串
right()用于得到从右边开始的部分字符串
charindex()得到字符串中,某个制定的字符最早出现的位置
patindex()得到字符串中,某个制定的字符最早出现的位置
reverse()将字符串的字符排列顺序颠倒

日期函数:
getdate()得到系统当前的时间
day()得到一个日期中的天数
month()得到一个日期中的月份
year()得到一个日期中的年份
datediff()得到2个时间之间的差

select sum(price) as 总合 from 表名

去左空格
select ltrim() [as ]  from 表名
去右空格
select rtrim()[ as ]  from 表名
isnull (字段名,替代符号)  将字段名 中的null 替代为替代符号
replace(字段名,需要替代的字符,替代的字符)
select 
dateadd(day【 hour year month】,1,productdate)
getdate()
day('日期')
datediff(day[hour year month],‘起始时间’,‘现在时间’)
连接查询
内连接是指:
当且仅当连接条件成立时,才在结果集中产生一条连接记录。
当左表中某记录根据连接条件在右表中没有匹配的记录时,
该记录便被忽略。
内连接可分为:等值连接,不等值连接,自连接
在内连接中,可以使用等号“=”作为比较运算符,此时称作等值连接;
也可以使用非等值运算符,此时为不等值连接,如“>”,"not","or"等

内连接
select
product.pid,product.classid,productclass.classname
from product inner join productclass
on product.classid=productclass.classid


外连接
select
from product left jion productclass
on product.classid=productclass.classid


right join


full join


第6讲
子查询
将一个select语句嵌套在另一个select语句的where子句中的查询形式,称为子查询
子查询中嵌套在where子句里的select语句称为内部查询,相对的,包含内部查询的
select语句被称为外部查询。子查询要求服务器先计算内部查询并
形成结果,然后外部查询根据内部查询的结果产生最终查询结果


in引入的子查询
操作符In,用来确定某个列值是否在内部查询的结果集中。

 

 


第三部分winform
基于事件的编程
windows应用程序的编程机制:事件驱动
事件驱动
1,应用程序的执行流程是由外界发生的事件所确定
2,当某个事件(一般由用户操作来引发)发生时,
应用程序会接收到相应的消息,并作出相应的处理

所见即所得
windows应用程序界面由可视化的窗体和控件组成
决定一个应用程序的好坏,首先是看应用程序界面
设计是否合理。同一个应用程序,应该保持不同窗
口界面具有一致的风格

Label(标签控件)
Label控件是Windows窗体控件中最常用,也最简单
的一个控件,主要用于显示一些描述性的文字。
Label控件最常用的几个属性
Font  显示的文本内容的字体格式
Name 获取或设置控件的名称
Text 在Label控件上显示的文本内容
TextAlign 在Label控件上显示文本内容的对齐模式
AutoSize 获取或设置一个值,该值指示是否根据显示
内容的大小自动调整控件的大小
Location 获取或设置该控件的左上角相对于其容器
的左上角的坐标

TextBox(文本框控件)
TextBox控件提供了基本的文本输入和编辑功能,用户
可以在其中输入文本
TextBox控件可以用作单行文本框和多行文本框,还
可用于接受密码和其他敏感信息
TextBox控件最常用的几个属性
AcceptsButton  获取或设置一个值,该值指示在多行
TextBox控件中按Enter键时,是在控件中创建一行行文本
还是激活窗体的默认按钮
AcceptsTab 获取或设置一个值,该值指示在多行文本框
控件中按Tab键时,是在控件中键入一个Tab字符,还是按
Tab键顺序将焦点移动到下一个控件
Multline  指示该文本框是否为多行文本框,默认值是false
Passwordchar 设置或获取一个字符,该字符用于屏蔽单行TextBox
控件中的密码字符
ReadOnly 如果设置为true,TextBox中的内容不可修改
Name 获取或设置控件的名称
Text TextBox的内容,string类型
与布局相关的两个属性:Dock和Anchor
Dock用来设置控件的边框停靠到父容器的边框上,并且随父容器一起变化
Anchor 用来设置控件绑定到容器边缘并确定控件如何随其父级一起调整大小
TextBox控件的主要事件是:TextboxChanged

CheckBox(复选框控件)
CheckBox控件为用户提供可复选的选项按钮
CheckBox控件的常用属性和事件
Appearance 获取或设置确定CheckBox控件外观的值
Checked获取或设置一个值,该值指示CheckBox是否处于选中状态
CheckState 获取或设置一个值,该值指示此CheckBox是否允许三种
复选状态而不是两种使用CheckState 枚举型:checked Unchecked
Indetemninate
Name 获取或设置控件的名称
text 按钮的内容显示

事件                    描述
CheckedChanged   当checked属性的值更改时发生
CheckStateChanged  当checkState属性的值更改时发生


RadioButton(单选框控件)
RadioButton控件为用户提供只可单选的选项按钮
RadioButton控件的常用属性和事件
属性            描述
Checked  获取或设置一个值,该值指示是否已选中控件
Name 获取或设置控件的名称
Text 按钮的显示内容

事件         描述
CheckedChanged 当Checked属性的值更改时发生

 

ComboBox(组合框控件)
ComboBox对TextBox控件进行扩充,使用一个下拉列表
显示数据,且允许用户进行选择
属性                         描述
DropDownStyle   获取或设置指定组合框样式的值
Items 获取一个对象,该对象表示该ComboBox中所包含项的集合
MaxDropDownItems 获取或设置要在ComboBox的下拉部分中显示的最大项数
SelectedIndex 获取或设置指定当前选定项的索引
SelectedItem 获取或设置ComboBox中当前选定的项
Name 获取或设置控件的名称


事件                    描述
SelectedIndexChanged  当SelectedIndex属性更改后发生

ListBox(项列表控件)
ListBox控件与ComboBoX类似,用来显示一个选项列表
在ListBox控件的选项列表中可以选择一个或多个,而
ComboBox中只能选择一个


ListBox控件中的常用属性:
属性                          描述
Items       获取ListBox的选项集合
MultiColumn 获取或设置一个值,该值显示ListBox是否支持多列
SelectedIndex 获取或设置ListBox中当前选定项的索引
SelectedIndices 获取一个集合,该集合包含ListBox中所有当前选定的索引
SelectedItem 获取或设置ListBox中的当前选定项
SelectedItems 获取包含ListBox当前选定项的集合
SelectionMode 获取或设置在ListBox中选项所用的方法
Sorted 获取或设置一个值,该值指示ListBox中项是否按字母顺序排序
ScrollAlwaysVisible获取或设置一个值,该值指示是否任何时候都显示垂直滚动条
Name 获取或设置控件的名称

ListBox控件的常用方法和事件
方法                     描述
ClearSelected    取消在ListBox中选择的所有项
GetSelected      返回一个值,该值指示是否选定了指定的项
SetSelected      选择或消除对ListBox中指定项的选定
 

事件                 描述
SelectedIndexChanged 在SelectedIndex属性改变后发生


NumericUpDowm控件
NumericUpDowm控件包含单个数值,通过单击该控件的向上
或向下按钮可使该数值递增或递减
NumericUpDowm控件的常用属性
属性                     描述
Minimum  获取或设置数字显示框的最小允许值
Maximum 获取或设置数字显示框的最大值
Increment 获取或设置单击向上或向下按钮时,数字显示框递增或
递减的增量值
Name   获取或设置控件的名称
Value 获取或设置数字显示框的当前值

 

PictureBox(图片框控件)
PictureBox控件用于显示位图,元文件,图标,JPEG,GIF或PNG文件
中的图形
PictureBox不是可选的控件,这意味着该控件不能接收输入焦点
属性                        描述
Image   获取或设置PictureBox显示的图像
SizeMode 指示如何显示图像
ImageLocation 获取或设置要在PictureBox中显示的图像的路径
Name  获取或设置控件的名称


ADO.NET
ADO.NET是一组用于和数据源进行交互的面向对象类库
ADO.NET的基本特性
DaraSet集成
无连接特性(最重要的特性)
XML集成
ADO.NET的五大对象
Connection 建立与特定数据源的连接
Command 对数据源执行命令
DataReader从数据源中读取只进且只读的数据流
DataAdapter用数据源填充dataset并解析更新
dataset是支持ADO.NET的断开式,分布式数据方案的核心对象
dataset是数据的内存驻留表示形式,无论数据源是什么,他
都会提供一致的关系编程模型。他可以用于多个不同的
数据源,用于XML数据,或用于管理应用程序的本地的数据
dataset表示包括相关表,约束和表间关系在内的整个数据集

Connection
在ADO.NET对象模型中,Connection对象代表了与数据源之间的
连接
.NET框架中有两个Connection对象:一个是OLeDbConnection,
用于大多数的数据库连接,一个是SqlConnection,是MS开发的
专门用于针对SQL Server的连接。
在创建Connection对象之前,你必须先引用System.Data.OleDb
或者System.Data.SqlClient和System.Data三个命名空间。

SqlConnection的用法
SqlConnection con=new SqlConnection("Server=localhost;
Database=Northwind;UserID=sa;PWD=sa");


OleDbConnection con=new
    OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0;DataSource=
D:/MyAccessDB.mdb");


Command
建立了数据源的连接和设置了命令之后,Command对象执行SQL命令有三种方法:
ExecuteNonQuery
执行后不返回结果集,只返回受影响的行数
ExecuteReader
执行后返回结果集
ExecuteScalar
返回值是Object类型,通常是返回查询结果的第一行,第一列的值

DataAdapter
用来操作DataSet与数据源之间的数据交互
SelectCommand
DeleteCommand
InsertCommand
UpdataCommand
DataAdapter注意事项一
在使用SelectCommand时,如果数据连接没有打开,那么在调用Fill方法时会自动打开连接,并在结束时关闭。
如果数据连接已经打开了,那么在调用Fill方法结束时,依然会保持这一打开状态。所以有时我们需要手动关闭连接。
DataAdapter注意事项二
如果在同一个Connection上有一系列的连续操作,列如执行多个Fill操作,你应该在最开始时使用Connection的Open()方法打开连接,避免使用Fill方法时执行额外的打开连接/关闭连接操作,从而提高了程序的性能,节省系统开销。
DataAdapter注意事项三
在使用SqlDataAdapter中的SqlCommand对象时,你可以重复的使用同一个SqlCommand去多次执行相同类型的操作,比如说执行多次查询,但是不要使用同一个SqlCommand去执行不同类型的操作,如先查询后修改等。


DataGridView控件介绍
DataGridView控件是Windows窗体控件中最常用的数据绑定控件,主要用于显示一些DataSet中的数据。
DataGridView控件最常用的几个属性:
属性                     描述
Name 获取或设置控件的名称
columns 设置DataGridView列的集合
DataSource设置DataGridView的数据源
Size设置DataGridView高度和宽度
Anchor定义DataGridView与容器的边缘
Dock定义要绑定的容器的控件边框

MVC
1,模型(Model)
模型表示业务数据,或者业务逻辑。
2,视图(View)
视图是应用程序中用户界面相关的部分,是用户看到并与之交互的界面。
3,控制器(controller)


多线程
线程可以被描述为一个微进程,它拥有起点,执行的顺序序列和一个终点

计算机最大的作用就是将内存中的数据直接取出并发送到CPU中去处理。

内存的分类:全局变量及常量数据区,栈区,堆区和代码区。
变量的内存空间放在栈区,用new分配的内存空间放在堆区。


所谓变量就是像系统申请使用某一段内存,这段内存是有编号的,由于内存的编号都是很大的数,记忆肯定不是很方便,就给这个数取一个别名。这个别名就是变量名,因此编号名和内存编号是等价的。变量名使用起来比内存编号简单。
例如:int nA=1,这是一句代码,变现再内存级别的含义就是系统在栈区分配了一块内存并将数据1存放在这块内存中。由于记住变量名比内存编号简单所以我们一般就只记住了其变量名。

常量顾名思意就是不能修改的量,常量占据的内存区与变量占据的内存区不同。变量在栈区,常量在全局变量及常量数据区。例如:const int nA=1,由于使用了const关键字,所以系统就在全局变量及常量数据区分配了一块内存空间并将1放在这里,nA就是这块内存空间编号的别名。例子:
Console.WriteLine("Hello"),其中Hello所占据的内存空间也在全局变量及常量数据区。
不管是变量还是常量内存里存储的都是数据。

数据分类如下:值类型和引用类型。
两者本质的区别是:值类型在内存中存储的是数据本身,而引用类型在内存中存储的是这个数据存储在内存空间的位置也可以说是这个内存的编号。

引用类型的分类:delegata,class,interface。

值类型包括整数类型,浮点类型,字符类型,布尔类型和结构类型。按照存储数据的长度整型可以分为byte,short,int,long。它们表示的长度分别为8位,16位,32位和64位。按照有无符号可以分为无符号类型和有符号类型。byte是无符号类型,他可以逐个占据8个二进制的内存单元。最大值是255最小值是0。整数是有位数概念的,因此应该选择适合的数据类型来定义变量。
浮点类型分为float,double前者的精度没有后者大。float是32位,double是64位。在二者都具有十进制指数的时候,float可以保留到小数点厚第七位,double可以保留到小数点后15-16位。由于二者后面都是小数。通常随便书写一个小数的时候它将默认为double类型,如果想将一个小数表示成float类型的时候,则必须再这个小数后面加上一个f来表示这个一个单精度浮点型的小数。

布尔型的值只有两种true,flase表示真和假。它们一般参与逻辑运算用来表示真与假。

程序里面存储的只有数字。计算机最大的特点就是对数字进行操作。
例子:定义一个字符型变量,char chDict='A',字符型变量的长度是8位,由于A是有符号的数,表示有一位表示符号,实际存储的值只能有7位。因此它的最小值是0最大值是127.当我们将一个字符赋值给一个变量的时候,实际上存在于这个变量里面的应该是这个字符的索引是一个数值。每个字符对应那个的值是多少大家可以查找相关的表。A的索引值应该是65,这句代码的实质就是将65这个值存储到变量所占据的内存空间里面去了,以后我们可以将这个数从内存里取出来。

很重要的一个概念:内存里存储的是数而不是图形。

如果我们想将一个字符打印出来只要知道其索引值就行。
例子:Console.WriteLine(65)
      Console.WriteLine((char)65)
前者是直接存储65这个值,后者是将65进行一个强制的转换。第一句话打印出来的是65,第二句打印出来的是字符A。

枚举型和int型是差不多的,int型可以存储整型数,枚举型和整型是差不多的。在枚举型的类型里面所占据的内存空间里,它存储的也是整型数。以byte为例,由于byte是一个数,它的最小值是0最大值是255,0和255之间的数字我可以给它定义一个别名,枚举型的优势就可以将数值定义别名,当我们用这个数的时候不是用这个数的本身而是用这个数的别名。原因是这个别名的记忆比记忆这个数简单。
例子:比如说绿色,我们如果要是用12218这个数来表示的话,只要记住绿色就比较方便。

数据类型的转换包括隐式转换和显式转换。没有加转换符的都是隐式转换,加了的都是显式转换。隐式转换是由精度低的向精度高的转换,它可以自主转换没有必要加转换符。char,int,double,float的精度是依次变高的。

..面向对象的三大特性:封装,继承和多态。

..封装就是将数据或函数等集合在一个一个被我们称之为类的单元中,被封装的对象通常被称为抽象数据类型。
封装的作用在于保护或者防止数据被我们无意中修改或破坏。


继承是一个对象直接使用另一个对象的属性和方法。
..C#中类不支持多重继承,但是支持多重接口。一个类只能有一个父类。
实现的方式:
class 子类名:父类名
{
}
继承的好处:
通过继承,子类就获得了父类中的所有成员(不包括private修饰的成员)。

C#中类的继承规则
..可传递性:子类是对父类的扩展,只能添加新成员,不能除去已继承成员。
..除构造函数与析构函数外,其他成员都能被继承
..子类若定义了与继承而来的成员同名的新成员,就可覆盖已继承成员,但并不是说子类删除了这些成员,只是不能显式访问这些成员

构造函数和析构函数的调用顺序:
在继承体系中,构造时,先调用父类的构造函数,然后调用子类的构造函数。在析构的时候,析构函数的调用顺序证号与构造函数相反。


new 显式隐藏从父类继承的成员
base 派生类访问基类成员
..当父类,子类出现同名成员时,在子类中要使用从父类继承过来的同名成员,必须使用base
base.同名成员(但不能在static方法中使用)

Sealed
..密封类声明使用Sealed修饰符,表明该类不可被继承
public sealed class mybaseclass
密封方法
public sealed override void show()


多态:在运行的时候接口所匹配的对象能互相转换的能力。
通过继承,一个类可以用作多种类型:可以用作它自己的类型,任何基类型,或者在实现接口时用作任何接口类型。这称为多态性。

..当派生类从基类继承时,它会获得基类的所有方法,字段,属性和事件,若要更改基类的数据和行为,有两种选择:
1,可以使用新的派生成员替换基成员
2,可以重写虚拟的基成员。

虚方法
用virtual修饰
不允许再有static,abstract,override修饰符
如public virtual void show()
重写方法
用override修饰
不能再有new,static,virtual修饰符
如public override void show()

为了使派生类的实例完全接替来自基类的类成员,基类必须将该成员声明为虚拟的。
这是通过在该成员的返回类型之前添加virtual关键字来实现的。然后,派生类可以选择使用override关键字而不是new,将基类实现替换为他自己的实现。
当派生类重写某个虚拟成员时,即使该派生类的实例被当作基类的实例访问,也会调用该成员。
无论在派生类和最初声明虚拟成员的类之间继承了多少个类,虚拟成员都将永远为虚拟成员。
..派生类可以通过将重写声明为密封的来停止虚拟继承。
派生类中可以通过使用new关键字替换密封的方法。


接口(interface)
定义:定义一个协定。实现接口的类或结构必须遵守其协定。

接口的特性:
接口是独立于类来定义的
..接口和类都可以继承多个接口,而类可以继承一个基类,接口根本不能继承类。
..接口只能定义方法,事件,属性和索引器。

抽象类
..在类定义中添加abstract创建抽象类,子类可以实现抽象类中的所有或者部分的抽象方法,实现抽象方法使用override关键字
..抽象类是可以被继承,不可以被实例化的一种特殊类
抽象类用于为子类定义具体的功能要求或者基本的框架

抽象方法
..用abstract修饰
表示引入一个新的虚拟方法,但不提供该方法的实现
如public abstract void show();

抽象属性
必须在抽象类中使用
不能在静态属性上使用abstract才修饰符
..在派生类中,通过使用override修饰符的属性声明来实现对抽象属性的重写


接口和抽象类的区别
..抽象类是一种不能实例化而必须被继承的类,抽象类可以提供实现,也可以不提供实现。
子类只能从一个抽象类继承
抽象类主要用于关系密切的对象
如果要设计大的功能单元,则使用抽象类。
若果预计要创建组建的多个版本,则创建抽象类。

..接口是完全抽象的成员集合,不提供实现
..类或者结构可以继承几个接口
接口最适合为不相关的类提供通用功能
如果要设计小而简练的功能块,则使用接口
接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。

ArrayList
add方法的参数可以放简单类型,也可以放复杂类型,在取值的时候可以通过强制转化转化回相应的类型。

对于Hashtable,可以使用中括号,加上键值,获取或设置与指定的键相关联的值。

Hashtable的取值格式:Hashtable名[index]

注意:add方法的第二个参数可以放简单类型,也可以放复杂类型,在取值的时候可以通过强制转化转化回相应的类型。

Directory类:目录的创建,删除,移动和打开提供了静态方法。
DirectoryInfo类:为目录的新建,删除,移动和打开提供了实例方法。
如:
Directory.CreateDirectory(@"D:/temp");
DirectoryInfo myDir=new DirectoryInfo(@“d:/temp”);
myDir.Create();

文件操作类
File类:文件的创建,删除,移动和打开提供了静态fangf
FileInfo类:为单个文件的新建,删除,移动和打开提供了实例方法
File.copy(@“c:/temp/1.txt”,@“c:/text.txt”);
FileInfo myFile=new FileInfo(@"c:/temp/1.txt");
myFile.CopyTo(@"c:/text.txt");

 

文件的读取我们要掌握三个类:
FileStream,StreamResder,StreamWriter
它们的关系是FileStream定位到操作文件,再根据操作生成,StreamResder文件读取类,StreamWriter文件写入类。

GDI+

点Point
矩形Rectangle
椭圆Ellipse

Color(颜色)对象的获得
   Color.FromArgb(255,255,255);
   Color.颜色名(red,white)
Brush(画刷)对象的获得
   画刷分为多种,常用的有实心画刷Brush b=new SolidBrush(Color);
Pen(画笔)对象的获得
   Pen p=new Pen(brush(画刷),width(宽度));


BitMap是一个用来保存图像的类
BitMap对象的获得
   通过流文件的读取获得
   BitMap bit=new BitMap(stream)
   通过自定义大小获得
   BitMap bit=new BitMap(width,height)

Graphics对象的获得:
Graphics通常通过两种方式获得
   控件产生画布,这样的画布刷新后就消失,只是临时性的。Control.CreatGraphics,这里Control指大多数空间和窗体
   图象产生画布,这样的画布刷新后不会消失,不过要求对图象显示的控件重新赋值如:
     BitMap bit=new BitMap(10,10)
     Graphics gp=Graphics.FormImage(bit);
     gp.dispose();

注意:画布用完一定要释放

画布(Graphics gp)的画法:
直线gp.DrawLine(Pen,Point,Point)
矩形gp.DrawRectangle(Pen,Rectangle)
椭圆gp.DrawEllipse(Pen,Rectangle)


GDI+作图步骤
1,得到颜色->画刷+粗细->画笔
2,由控件或者图想得到Graphics对象
3,调用Graphics对象方法实现作图


创建视图:
create view V_product
as

select
a.*,b.classname
from product a inner join productclass b

on a.classid = b.classid


查询视图:
select * from v_product


概念:
视图是在基于查询所创建起来的数据库对象,在视图中可以引用一个或者多个表。
视图可以支持两个以上的表的查询结果。
视图是一个虚拟表,可以用来反映一个或者多个表的子集,其结果由一个查询语句来定义。是一个数据库的数据对象,它并不直接存储数据,只是存储了一个查询语句。被视图引用的表,我们称为基表。数据都来自于基表。使用视图实际上就是使用一个保存在视图中的查询语句。


更改视图:
alter view v_product
as

select
a.PID,a.productname,b.classname
from product a inner join productclass b

on a.classid = b.classid
强制视图修改数据必须满足定义视图时select语句中的条件。


删除视图:
drop view p_emp


注意:
只能在当前数据库中创建视图
视图名称应与表名近似,但是不得相同
视图名称应遵循标识符的命名规则
可以基于其他视图建立视图,最多允许嵌套32级
不能在视图上建立规则,默认,AFTER触发器和全文索引
不能创建临时视图
一个视图最多只能包含1024列

创建视图时不能使用临时表
即使表被删除,视图定义仍将保留
定义视图的查询不能包含以下语句:
order by
compute子句
compute by子句
into关键字


索引是数据库编排数据的内部方法。
作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。

索引类型:
聚集索引:数据被物理排序,索引顺序与物理顺序相同,按照索引字段值的大小顺序存储每个表只能有一个聚集索引(一般用在主键上)
非聚集索引:行的物理顺序不同于索引的顺序,索引顺序以逻辑顺序排序(只排序索引键),每个表可以有249个非聚集索引一般在用于连接和where子句所使用的列上创建(常用于外键上)

创建索引:
create index 索引名 on 表名(列名[,列名])

例子:
create index index_test on productbak(productname)

删除索引:
drop index index_test on productbak

选择索引的准则:
频繁使用在select列表和where子句中的列
用在group by 或order by子句中的列
用于联接的列
用于主关键字的列
用于外关键字的列


自动索引的创建
主键:聚集索引+唯一索引
唯一键:唯一索引

概念:
存储过程是一组编译好的,完成特定功能,方便程序员对实现特定功能的代码段反复调用以及使用的SQL语句。
是存储在服务器上的一个对象
可通过对象名来调用

使用存储过程的优点:
1.提高性能
2.减轻网络堵塞
3.可进行模块化程序编写
4.保证系统的安全性

类型
用户定义的存储过程
系统存储过程(名字以sp开头)
扩展存储过程(名字以xp开头)
 
创建存储过程:
create procedure 名字as 代码段
例子:
create procedure proc_searchprice
as
select max(price) as maxprice,min(price) as minprice from product

调用存储过程:
Execute 存储过程名


带参数的存储过程:
create procedure proc_getbyproductname
@productname varchar(50),
as
select * from productbak where
productname like '%+@product+%'

调用:
execute proc_getbyproductname '飘'

修改存储过程:
alter procedure proc_getbyproductname
@pid int,
as
select * from productbak where
pid = @pid

删除:
drop procedure proc_getbyproductname


系统存储过程:
sp_helptext proc_getbyproductname

概念:
触发器是一种用来保障参照完整性的特殊的存储过程。
用于维护不同表中数据间关系的有关规则。

触发器和存储过程的区别:
触发器主要是通过事件进行触发而被自动执行的
存储过程可以通过存储过程名称而被直接调用

注意:同类型的触发器在表上可以有多个。


触发器的作用:
能够实现由主键和外键所不能保证的负责的参照完整性和数据的一致性
强化约束
跟踪变化
级联运行
存储过程的调用

类型:
AFTER触发器,INSTEAD OF触发器

创建触发器:
create trigger trig_print
on productclass
for insert
as
print'操作成功'

 


create trigger trig_updateproductclass
on productclass
after update
as

declare @idbefore int
declare @idafter int

if update(classid)
    begin
        set @idbefore = (select classid from dileted)
        set @idafter = (select classid from inserted)

    end

update product set classid = @idafter where classid = @idbefore

修改触发器
alter trigger trigger_name
on (table|view)
[WITH ENCRYPTION]
(for|instead of)
[delete,insert,update]
as sql_statements

删除触发器
drop trigger 触发器名

利用系统存储信息查看触发器的信息:
sp_help '触发器名称':用于查看触发器的一般信息
sp_help '触发器名称'

sp_helptext '触发器名称':用于查看触发器的正文信息
sp_depends '触发器名称'

sp_depends '触发器名称/表名':用于查看指定触发器所引用的表或者指定的表涉及到的所有触发器
sp_depends '触发器名称'
sp_depends '表名'


游标存在的意义:
有些问题我们使用select语句不能完全解决,这时需要使用游标。

游标使用顺序:
定义游标 declare
打开游标 open
使用游标 fetch
关闭游标 close
释放游标 deallocate

游标的定义:
declare 游标名[scroll] cursor
for
select语句
(scroll可以全程使用游标,可以向前或者向后移动)


打开游标:
open [global]游标名

获取游标:
Fetch:与while配合使用,只有@@fetch_status=0时,获取命令成功才执行(-1失败,-2丢失)

FETCH [[Next | Pior | First | Last | Absolute n | Relative n ] Form 游标名 [into 变量]

注:
Absolute n 第n行
Relative n 当前位置开始的第n行
Into 变量 把当前行的个字段值赋值给变量
标准游标只能用于Next

关闭游标:
close 游标名
释放游标:
deallocate 游标名

定义游标
declare Cur_Product scroll cursor
for
select pid from product

打开游标
open cur_product

定义一个变量
declare @pid int

绝对移动
declare @pid int

fetch absolute 2 from cur_product into @pid
print @pid
向上移动
declare @pid int

fetch prior from cur_product into @pid
print @pid
向下移动
declare @pid int

fetch next from cur_product into @pid
print @pid
相对移动
declare @pid int

fetch relative 2 from cur_product into @pid
print @pid
回到首位
declare @pid int

fetch first from cur_product into @pid
print @pid

循环
declaer @pid int

fetch first from cur_product into @pid
while @@fetch_status = 0
    begin
        print @pid
        fetch next from cur_product into @pid
    end
关闭游标
close cur_product
释放游标
deallocate cur_product

 

 


可更新游标定义
declare 游标名
[scroll] cursor
for select语句
for update[of 列名['列名]]

定义可更新游标
declare cur_class scroll cursor
for
select classid from productclass
for update of classid

打开游标
open cur_class

declare @id int

fetch first from cur_class into @id

while @@fetch_status = 0
    begin
        print @id
        fetch next from cur_class into @id
    end


declare @id int
fetch first from cur_class into @id
update productclass set classid = (classid+10)
where current of cur_class

while @@fetch_status = 0
   begin
       print @id
       fetch next from cur_class into @id
   end

游标的概念
游标是一种数据访问机制,是一个在给定结果集中以行为访问和操纵数据的数据库对象
好处是可以逐行的处理数据
优点:
允许定位于结果集中的特定的行
从当前结果集中获取一行
能对结果集的当前行进行修改
类型:
静态游标(不检测数据行的变化)
动态游标(反映所有数据行的改变)
仅向前游标(不支持滚动)
键集游标(能反映修改,但不能准确反映插入,删除)


函数的定义:
函数是用于封装经常执行的逻辑的子例程
类型:
标量函数(返回单个数据值)
内嵌表值函数(返回一个结果集)
多语句表值函数(返回一个结果集)

标量函数格式:
creat function 函数名(@参数名 类型......)
returns 数据类型
as
   begin
       函数体
       return 返回值
   end
例子:
创建
create function funcount(@num int)
returns int
as
   begin
       declare @number int
       select @nunber = count(*) from product where classud = @num
       return @number
   end


调用
declare @count int

execute @count = funcount 4

print @count


内嵌表值函数格式:
create function 函数名(@参数名 类型......)
returns table
as
return select 语句


(返回select语句查询的结果)

例子:
创建
create function fun2(@num int)
returns table
as
return select * from product where classid = @classid
调用
select * from fun2(4)


多语句表值函数
create function 函数名(@参数名 类型.....)
returna @变量名 table(表定义)
as
    begin
        语句组
        return
    end

(返回table变量)

例子:
创建
create function fun3(@classid int)
returns @tab table
(
    pid int,
    productname varchar(50),
    classname carchar(50)
)
as
    begin
        insert into @tab
        select a.pid,a.productname,b.classname from product a inner join productclass b on a.classi = b.classid
        return       
    end

调用
select * from fun3(4)

事务产生的原因
事务的四个性质:
原子性:不可只完成部分操作
一致性:在处理成功后,所有数据都保持一致状态
独立性:禁止其它事务看到本事务的中间状态
持久性:一个已完成的事务对数据所做的任何变动在系统中是永久有效的

开始事务
begin transaction[事务名]
结束事务
commit transaction[事务名]
保存事务
save transaction[保存点名]
回滚事务
rollback transaction[保存点名]

注:
如果回滚到保存点,则并不结束事务
@@transaction存储当前的事务数量


begin transaction tran1
declare @count int
save transaction op1

Insert into productclass(classname) values('手机')

select @count =count(*) from productclass where classname ='手机'
if @count <> 1
rollback transaction op1

commit transaction tran1


事务的类型:
显示事务:由用户指定事务的开始和结束
自动事务:每个语句被视为一个事务
隐式事务:开始执行语句就视为一个事务的开始,但语句执行完后,事务并不结束(由用户显示提交)
set implicit_transactions{on|of}

实现事务的方式:事务日志,锁

事务日志:是专门记录我们操作步骤的一个日志文件
锁:在功能上避免用户访问正在被其他用户改变的信息,在多用户环境中,避免一些用户同时改变同样的数据。SQL Server使用锁来维护多用户环境下的数据一致性,SQL Server自动处理锁的行为。

Server实现了多粒度上锁,允许事务以不同级别对不同类型的资源上锁。
锁的分类:
行级别
页级别
范围级别
表级

锁定模式:
共享锁定(S):常用于读事务(如SELECT语句),允许一个资源上有多个共享锁定,防止其他事务修改资源。
排它锁定(X):用于写事务(如INSERT,UPDATE,DELETE语句)一个资源上只能有一个排它锁定,防止并发事务对资源进行访问。
更新锁定(U):用于防止死锁,一个资源上只能有一个更新锁定,且只有获得更新锁定的事务才能获得排它锁定。
意向锁定(I):让事务声明它将在龇牙unshang使用共享,独占,更新锁定。
模式锁定(S):1,结构模式修改锁定;2,结构描述固定锁定。

锁定提示符:with(提示符)
holdlock 持有共享锁知道事务完成(select)
nolock 不提交共享锁且不重视独占锁(select)
uplock 使用表更新锁而非共享锁
pagelock 采用页锁定
readpast 略过锁定的行
rowlock 使用行级锁
tablock 使用表级锁
tablockx 使用表级独占锁定
xlock 使用独占锁定


死锁的产生
当产生死锁时,SQL—Server会终止占用最少CPU时间的进程,终止的事务会自动回滚,别给出一个1205的错误
定制LOCK_TIMEOUT
(LOCK_TIMEOUT命令可被用来设置等待被阻塞资源语句的最长时间)

最小化锁定和避免死锁的提示
1,对包含where子句的update/delete语句创建索引,因为有索引则会创建行级锁,否则是表级锁
2,将一个大的insert语句转换成单个insert语句,减少了阻塞的可能(通过游标逐行插入)
3,保持了事务尽可能的短(将一个大的事务操作分解成多个小事务)
4,减少事务中的列数
5,对于大量数据操作的事务,应该在空闲时间运行
6,加大服务器内存

给定一个supermarket数据库
1. 如何修改登陆模式
2.创建一个Windows登陆用户
3.创建一个sql server账号
4.创建一个用户给定一个supermarket数据库
设置安全验证模式的步骤:
 1、打开SQL Server Management Studio,点击视图,选择已注册的服务器,在已注册的服务器窗口中右击一个服务器,点击属性,选择Windows身份验证或SQL Server身份验证,点击保存就可以了。
 2、打开SQL Server Management Studio,在对象资源管理器的窗口中右击已经注册好的服务器,点击属性弹出一个窗体,选择安全性这一项,然后可以在服务器身份验证下面选择Windows身份验证模式或选择SQL Server和Windows身份验证模式,最后点击确定就可以了。

创建登录账号的步骤:
 1、创建Windows登录账号:打开SQL Server Management Studio,在已注册好的服务器下面展开安全性这一项,反键点击登录名,选择新建登录名弹出一个窗体,在登录名下面选择Windows身份验证,点击搜索,然后可以输入已经建好的系统用户,如果不知道名字的话可以点击高级,再点击立即查找,选择一个账号后一直点击确定就可以了。
 2、创建SQL Server账号:打开SQL Server Management Studio,在已注册好的服务器下面展开安全性这一项,反键点击登录名,选择新建登录名弹出一个窗体,在登录名下面选择SQL Server身份验证,输入登录名和密码,把强制密码过期复选框前面的勾去掉,数据库选择SuperMarket,点击确定就可以了,也可以用create login sa with password = "sa"创建。

                sql高级编程第三讲
    触发器是一种用来保障参照完整性的特殊的存储过程,用于维护不同表中数据间关系有关的规则。

存储过程是在数据库上定义的,触发器是在表上定义的

    存储过程可以由用户直接调用执行,但触发器不能直接调用执行,而是由SQL Server自动触发执行。在表有改变的时候启动。
完成对表改变的关联数据的更改,或者一些逻辑检查的验证,保证数据的完整性。

触发器的作用
   1、强化约束
   2、跟踪变化   不允许未经指定的更改
   3、级联运行
   4、存储过程的调用

    触发器可以解决高级形式的业务规则或者复杂行为限制以及实现定制记录等一些方面的问题。

      AFTER触发器和INSTEAD OF触发器

create trigger trig_print
on productclass
for insert
as
print '操作成功'

虚拟表:    Inserted             Deleted
插入时     存放新增的记录       不存储记录
修改时    存放用来更新的新记录  存放更新前的记录
删除时     不存储记录            存放被删除的记录


create trigger trig_UpdateProductclass
on productclass
after update
as
declare @IDBefore int
declare @IDAfter int

if update (classid)
   begin
    set @IDBefore = (select classid from deleted)
    set @IDAfter = (select classid from inserted)
   end

update product set classid = @IDAfter where classid = @IDBefore

触发器加密: 在on后面加with encryption。

               sql高级编程第四讲

游标和自定义函数

  游标使用顺序
     定义游标 declare
     打开    open
     使用 fetch
     关闭 close
     释放 deallocate


declare 游标名[scroll] cursor
  for
 select 语句
注:scroll可全程使用游标,可向前或向后移动

打开  open[global]游标名


可更新游标
   declare 游标名[scroll] cursor
   for
   select语句
   for update[of 列名]
  
 
游标的概念:游标是一种数据访问机制,是一个在给定结果集中以行为单位访问和操纵数据的数据库对象

游标的好处是可以逐行的处理数据

优点:1、允许定位于结果集中的特定的行
     2、从当前结果集中获取一行
     3、能对结果集的当前行进行修改

游标的类型

 静态游标 不检测数据行的变化
 动态游标 反映所有数据行的改变
 仅向前游标  不支持滚动
 键集游标  能反映修改,但不能准确反映插入、删除


函数是用于封装经常执行的逻辑的子例程

类型
     标量函数  返回单个数据值
     内嵌表值函数  返回一个结果集
     多语句表值函数  返回一个结果集
    
标量函数格式
 create function 函数名(@参数名 类型....)
 returns 数据类型
 as
   begin

     函数体
     return 返回值
   end

内嵌表值函数格式:
   create function 函数名 (@参数名  类型...)
      returns   table
      as
         return  select 语句

返回select语句查询的结果

多语句表值函数
   create function 函数名(@参数名   类型....)
   returns    @变量名   table (表定义)
      as
         begin
              语句组
              return
          end
 
返回table 变量

                  sql高级编程第五讲
事务的四个性质:
 1、原子性:不可只完成部分操作
 2、一致性:在处理成功后,所有数据都保持一致状态
 3、独立性:禁止其它事务看到本事务的中间状态
 4、持久性:一个已完成的事务对数据所作的任何变动在系统中是永久有效的

实现方式:
  1、Begin Transaction  [事务名]
       开始事务
  2、Commit Transaction [事务名]
       结束事务
  3、Save Transaction  保存点名
  4、Rollback Transaction [保存点名]
       回滚事务
  注:如果回滚到保存点,则并不结束事务
  @@trancount 存储当前的事务数量

事例:

  begin transaction tran1
  declare @count int
  save transaction op1
 
  insert into productclass (classname)
  values ('手机')
  select @count = count(*) from productclass
  where classname = '手机'
  if @count <> 1
  rollback transaction op1
  commit transaction tran1

事务的类型
 1、显示事务:由用户指定事务的开始和结束
 2、自动事务:每个语句视为一个事务
 3、隐式事务:开始执行语句就视为一个事务的开始,但语句执行完后,事务并不结束(由用户显示提交)

实现事务的方式
   1、事务日志
   2、锁

事务日志:是专门记录我们操作步骤的一个日志文件。


  在功能上避免用户访问正在被其他用户改变的信息,在多用户环境中,避免一些用户同时改变同样的数据。 SQL Server 使用锁来维护多用户环境下的数据的一致性,SQL Server 自动处理锁的行为。

锁的级别:
  1、行级
  2、页级
  3、范围级
  4、表级

锁定模式
  1、共享锁定(S):常用于读事务 (如SELECT语句),允许一个资源上有多个共享锁定,防止其它事务修改资源
  2、排它锁定(X):用于写事务 (如INSERT、UPDATE、DELETE语句)一个资源上只能有一个排它锁定,防止并发事务对资源进行访问。
  3、更新锁定(U):用于防止死锁,一个资源上只能有一个更新锁定,且只有获得更新锁定的事务才能获得排它锁定
  4、意向锁定(I):让事务声明它将在资源上使用共享、独占、更新锁定。
  5、模式锁定(S): 1、结构模式修改锁定
                   2、结构描述固定锁定

锁定提示符:with(提示符)
holdlock  持有共享锁直到事务完成 (select)
nolock    不提交共享锁且不重视独占锁(select)
updlock   使用表更新锁而非共享锁
pagelock  采用页锁定
readpast  略过锁定的行
rowlock   使用行级锁
tablock   使用表级锁
tablockx  使用表级独占锁定
xlock     使用独占锁定


SET LOCK_TIMEOUT 命令可被用来设置等待被阻塞资源语句的最长时间

最小化锁定和避免死锁的提示
 1、对包含where子句的update/delete语句创建索引,因为有索引则会创建行级锁,否则是表级锁
 2、将一个大的insert语句转换成单个insert语句减少了阻塞的可能(通过游标逐行插入)
 3、保持事务尽可能的短 (将一个大的事务操作分解成多个小事务)
 4、减少事务中的列数
 5、对于大量数据操作的事务,应在空闲时间运行
 6、加大服务器内存

                   sql高级编程第六讲

    数据库的安全性是指保护数据库以防止不合法的使用造成的数据泄露、更改、或者是破坏。
   
    系统安全保护措施是否有效是数据库系统的重要指标之一。
   
    如何保证数据库自身的安全已成为现代数据库系统的主要评测指标之一。
   
     一个安全的系统需要数据库的安全、操作系统的安全、网络的安全、应用系统自身的安全共同完成。
   
     数据库领域的安全措施通常包括:身份识别和身份验证、自主访问控制和强制访问控制、安全传输、系统审计、数据库存储加密等。

     访问控制是系统获得禁止访问资源的过程。数据库根据权限决定谁可以访问什么,访问控制的基础是权限管理。

     数据库的权限通常被分为:系统权限和对象权限。对象权限根据对象的密度由大到小又分为:库级、表级、列级等。在给角色或着用户授权时,必须遵循最小权限原则。在确定不需要使用某种权限时,要及时收回角色和权限。将相关的权限封装成角色,将角色授予用户,角色作为权限和用户之间的桥梁而引用。角色的封装和继承大大的简化了权限管理,同时利用角色间约束能力还可以实现权力之间的制约。

    SQL Server 2005的身份验证、授权和验证机制可以保护数据免受未经授权的泄漏和篡改。

    SQL Server 2005的安全模型分为3层结构:
      1、服务器安全管理
      2、数据库安全管理
      3、数据库对象的访问权限管理
SQL Server 2005的身份验证模式有两种:
  1、Windows身份验证模式 (Windows Authentication mode ) 默认的身份验证模式,比混合模式要安全的多
  2、混合模式 (SQL Server and Windows Authentication mode )。

SQL Server 2005中,有两类登录账号:
  1、SQL Server 2005自身负责验证身份的登录账号
  2、Windows的用户账号

创建登录名:create login sa with password = "sa"
删除登录名:drop login sa

  SQL Server 2005数据库管理系统利用角色设置,管理用户的权限。这样只对角色进行权限设置便可以实现对该角色中所有用户权限的设置,大大减少了数据库管理员的工作量。

角色的类型:
1、固定服务器角色
2、固定数据库角色
3、用户自定义数据库角色
4、应用程序角色

固定数据库角色
db_accessadmin: 添加或删除Windows登录账户、Windows组和SQL Server 登录账户的访问权限。

db_backupoperator:备份数据库
db_datareader:读取所有用户表中的所有数据
db_datawriter:添加、删除或更改所有用户表中的数据
db_ddladmin:数据库中运行任何数据定义语言(DDL)命令
db_denydataread不能读取数据库内用户表中的任何数据
db_denydatawriter:不能添加、修改或删除数据库内用户表中的任何数据
db_owner:执行数据库的所有配置和维护活动
db_securityadmin:修改角色成员身份和管理权限

在一个用户可以访问数据库之前,管理员必须在数据库中为他建立一个用户名


SQL Server 2005中的权限分为3种:
1、对象权限:Select、Insert、Update、Delete、Execute
2、语句权限
3、隐含权限

授予权限:GRANT
拒绝权限:DENY
撤销权限:REVOKE

设置安全验证模式的步骤:
 1、打开SQL Server Management Studio,点击视图,选择已注册的服务器,在已注册的服务器窗口中右击一个服务器,点击属性,选择Windows身份验证或SQL Server身份验证,点击保存就可以了。
 2、打开SQL Server Management Studio,在对象资源管理器的窗口中右击已经注册好的服务器,点击属性弹出一个窗体,选择安全性这一项,然后可以在服务器身份验证下面选择Windows身份验证模式或选择SQL Server和Windows身份验证模式,最后点击确定就可以了。

创建登录账号的步骤:
 1、创建Windows登录账号:打开SQL Server Management Studio,在已注册好的服务器下面展开安全性这一项,反键点击登录名,选择新建登录名弹出一个窗体,在登录名下面选择Windows身份验证,点击搜索,然后可以输入已经建好的系统用户,如果不知道名字的话可以点击高级,再点击立即查找,选择一个账号后一直点击确定就可以了。
 2、创建SQL Server账号:打开SQL Server Management Studio,在已注册好的服务器下面展开安全性这一项,反键点击登录名,选择新建登录名弹出一个窗体,在登录名下面选择SQL Server身份验证,输入登录名和密码,把强制密码过期复选框前面的勾去掉,数据库选择SuperMarket,点击确定就可以了,也可以用create login sa with password = "sa"创建。

                             sql第七讲
一、数据模型是数据库中关于数据组织的描述。
    分为两种类型:
       1、基于对象的概念模型:集中于描述数据、数据间的关系。
       2、基于记录的物理模型:集中于描述数据结构和数据库系统中的访问技术。
二、实体-关系图是项技术,是数据库设计的图解表示,是基于对现实世界中所包含的一组对象或实体及它们之间关系的观察,是数据库设计的逻辑视图。
三、关系的类型:
     一对一
     一对多(多对一)
     多对多
                              sql第八讲
一、数据库设计的目标:
    1、满足应用功能的需求
    2、良好的数据库性能
二、数据库设计步骤
    1、需求分析:了解分析用户的信息及对应用处理的要求
       (1)、确定数据范围
       (2)、分析数据应用过程
       (3)、收集与分析数据
       (4)、整理文档
    2、概念设计(实体定义、属性分配、关系定义):对需求进行抽象和综合处理,并按特定的方法设计出满足需求的概念模型。采取自顶向下、先局部后整体的方法。
    3、物理设计:将概念设计的模型转换为等价的并为特定DBMS所支持的数据模型结构。
    4、实现、维护:这个过程是随着应用开发及部署的过程中不断持续更新的

                   第一讲

一、 HTML:
   即超文本标记语言,是一种用来制作超文本文档的简单标记语言。主要是通过标签的组合以及标签属性的设置,实现页面丰富的展示效果。

超文本文档分文档头和文档体两部分,在文档头里对这个文档进行了一些必要的定义,文档体中才是要显示的各种文档信息。

HTML中标签必须成对出现。

如果一个标签起始于某一个标签类,则应结束该标签类。

HTML中最基本的三个标签:
<HTML>
 <HEAD>头部信息</HEAD>
 <BODY>文档主体,正文部分</BODY>
</HTML> 
他们在一个页面中都只能出现一次。

二、页面的布局

所有页面都是三部分组成:头、身、尾。其中头和尾在页面不发生跳转的时候基本上是不变的。

处理布局的两种方式:
1、框架:<frameset><frame></frameset>
2、表格:<table></table>

Frameset和frmame的基本属性
<frameset cols=指定该窗体切的各个宽度,用逗号隔开 或rows=指定该窗体切的各个高度>

frame是用来设定划分好的窗体的名称及属性,划分了多少个窗体就有多少个frame.

<frame src="所指向页面的相对路径" name ="名称" scrolling="设置窗体的滚动条(Yes,No)>

注意:
Frameset是成对标记
Frame不是成对标记
Frameset和body不要同时存在

Table的基本属性
Table标签的结构
 <table ...><tr><td ...></td></tr></table>
 <table width=”宽度(百分比/绝对像素)”heigth=“高度(百分比/绝对像素)”align=“相对外部的水平对齐方式(left/center/right)”bgcolor=“背景颜色”backgroup=“背景图案”>

<td align=“内部水平对齐方式(left/center/right)”valign=“内部的垂直对齐方式(top/middle/button)”>

三、标题文本的控制

标题文本<h?></h?>?=1、2、3、4、5、6标题文本默认是黑体加粗通过控制数字控制字体的大小,数字越小字体越大

普通文本通过<font 属性></font>可以控制
大小属性:size="1、2、...、6、7、+1、+2、...、+6、+7、-1、-2、...、-6、-7"
颜色属性:color="颜色/#rrggbb" rrggbb就是红(r)绿(g)蓝(b)6位16进制数字组合,如白色:#ffffff

普通文本的特殊强调标签:
1、加粗:<b></b>
2、斜体:<i></i>
3、下划线:<u></u>
4、上标签:<sup></sup>
5、下标签:<sub></sub>
6、删除标记:<s></s>

换行标签
换行:<br>立即从新换一行
双段落标签:<p>文本</p>在文本后标签处换行并空1行
单段落标签:文本<p>立即换行、从第3行从新开始

特殊意义的字符
空格:&nbsp;
&:&amp;
<:&lt;
>:&gt;
”:&quot;

四、项目符号和编号的属性

1、无序列表:
<ul type = 圆 (disc)、方(square)>
 <li>...</li>
 <li>...</li>
</ul>

2、有序列表
<ol type=数字序号(1)、小写序号(a)、大写序号(A)、罗马小写序号(i)、罗马大写序号(I) start=”数字(开始的位置)“>
 <li>...</li>
 <li>...</li>
</ol>

超链接的属性
超链接的标签<a href=”链接的相对路径“></a> 它可以实现页面的跳转。

跳转的方式:target=新的窗口(_blank)、当前窗体(_self)

表单标记
<FORM>标记
<FORM>称为表单标记,用以宣告此为表单模式,属于一个容器标记其中要注意的是action属性,他代表提交的页面。

<INPUT>实现页面上所有的文本框
INPUT的种类:type=Text,Radio,Checkbox,Password,Submit/Reset,Image,File,Hidden,Button,SELECT,OPTION,TEXTAREA

图片的标签:<img src="相对路径" alt=“提示" border="边框宽度(绝对像素)”></img>

样式的使用
样式style是为了弥补html标签中无法实现的效果而产生的,是以属性的方式写在标签内,如字体<font style="font-size:12px;属性2:值;属性3:值;">
 
               第二讲
Request请求的两种方式
1、Get:<a href='1.aspx?a=1&b=1'>
2、Post:<form></form>

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值