摘要: 或多或少都做过树状目录、产品分类之类的二级或三级菜单,如果遇到更多级的分类,就一般使用递归了。在程序中使用递归或多或少会增加一些性能上的开销。之前我用ASP.net在程序中实现过非递归的无限级分类目录,但考虑到移植性不强,就改成了存储过程,发出来大家共同研究一下,到目前为止,测试过程中还没发现问题,另外,代码方面没经过什么优化。通常情况下,我们更多的操作是读取目录,所以,在下面的实现中,读取我们只需要一Select语句就够了,不使用递归,理论上无限级~!======================================================================表 阅读全文
posted @ 2011-11-01 20:59 星月磊子 阅读(277) 评论(1) 推荐(0) 编辑
摘要: 开始事务:begin transaction提交事务:commit transaction回滚事务:rollback transaction例子:begin transactiondeclare @errorSum int --定义局部变量set @errorSum=0 --初始化临时变量update bank set currentMoney=currentMoney-1000 where customerName='张三'set @errorSum=@errorSum+@@error --累计是否有错误update bank set currentMoney=current 阅读全文
posted @ 2011-11-01 18:07 星月磊子 阅读(149) 评论(0) 推荐(0) 编辑
摘要: SQL Server函数大全--聚合函数use pubsgoselect avg(distinct price) --算平均数from titleswhere type='business'use pubsgoselect max(ytd_sales) --最大数from titlesuse pubsgoselect min(ytd_sales) --最小数from titlesuse pubsgoselect type,sum(price),sum(advance) --求和from titlesgroup by type order by typeuse pubsgosel 阅读全文
posted @ 2011-11-01 18:05 星月磊子 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 概述 和其他高级语言一样,T-SQL中也有用于控制流程的语句。T-SQL中的流程控制语句进一步扩展了T-SQL的力量……使得大部分业务逻辑可以在数据库层面进行。但很多人对T-SQL中的流程控制语句并没有系统的了解,本篇文章会系统的对T-SQL语句中的流程控制语句进行系统讲解。基本概念 在没有流程控制语句的情况下,T-SQL语句是按照从上到下的顺序逐个执行: 使用流程控制语句可以让开发人员可以基于某些逻辑进行选择性的跳转,实现了类似高级语言的跳转结构: 流程控制语句的使用范围和GO关键字 流程控制语句只能在单个批处理段(Batch),用户自定义函数和存储过程中使用。不能跨多个批处理段或者用户自. 阅读全文
posted @ 2011-11-01 18:02 星月磊子 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 触发器实际上就是一种特殊类型的存储过程,其特殊性表现在:它是在执行某些特定的T-SQL语句时自动的。11.1 触发器简介触发器实际上就是一种特殊类型的存储过程,它是在执行某些特定的T-SQL语句时自动执行的一种存储过程。在SQL Server 2005中,根据SQL语句的不同,把触发器分为两类:一类是DML触发器,一类是DLL触发器。11.1.1 触发器的概念和作用在SQL Server 2005里,可以用两种方法来保证数据的有效性和完整性:约束(check)和触发器(Trigger)。约束是直接设置于数据表内,只能现实一些比较简 单的功能操作,如:实现字段有效性和唯一性的检查、自动填入默认值 阅读全文
posted @ 2011-11-01 18:01 星月磊子 阅读(223) 评论(0) 推荐(0) 编辑
摘要: 表操作create table t_person1(id int not null,name nvarchar(50),age int null)drop table t_person1alter table t_person1 add department vchar(20)数据更新update Student set Name='李鹏' where Id=5update a set a.Bonus=500 from Student a inner join Gender b on a.Gender=b.Id where b.GenderName='男'upd 阅读全文
posted @ 2011-11-01 17:53 星月磊子 阅读(146) 评论(0) 推荐(0) 编辑
摘要: --SQLSERVER2000取第几行到第几行的方法--(第一种方法)效率最差selecttop5*fromcustomerswhereCustomerIDnotin(selecttop5CustomerIDfromcustomers)--(第二种方法)效率最好, 这里先执行的是Order by 然后才执行Topselectb.*from(selecttop5a.*from(selecttop10*fromcustomersorderbyCustomerIDasc)aorderbya.CustomerIDdesc)borderbyb.CustomerID--(第三种方法)利用临时表和ident 阅读全文
posted @ 2011-11-01 17:38 星月磊子 阅读(303) 评论(0) 推荐(0) 编辑
摘要: sql语句判断方法之一 Case具有两种格式。简单Case函数和Case搜索函数。 --简单Case函数 CASE sex WHEN '1' THEN '男' WHEN '2' THEN '女' ELSE '其他' END --Case搜索函数 CASE WHEN sex = '1' THEN '男' WHEN sex = '2' THEN '女' ELSE '其他' END这两种方式,可以实现相同的功能。简单Case函数的写法相对比较 阅读全文
posted @ 2011-11-01 17:36 星月磊子 阅读(265) 评论(0) 推荐(0) 编辑
摘要: -- =============================================-- Author: 流逝在夏天-- Create date: 2011年8月30日20:55:27-- Update Date: 2011年9月2日3:44:51-- Description: 简单复习存储过程-- =============================================USE ReviewSql--用户表CREATE TABLE Users (ID INT PRIMARY KEY IDENTITY(1,1),UserName VAR... 阅读全文
posted @ 2011-11-01 17:35 星月磊子 阅读(192) 评论(0) 推荐(0) 编辑
摘要: SQL Server 存储过程详解存储过程的优缺点 ◆优点: 执行速度更快。存储过程只在创造时进行编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程执行速度更快。 存储过程用于处理复杂的操作时,程序的可读性更强、网络的负担更小。 使用存储过程封装事务性能更佳。 能有效的放注入,安全性更好。 可维护性高,在一些业务规则发生变化时,有时只需调整存储过程即可,而不用改动和重编辑程序。 更好的代码重用。 ◆ 缺点: 存储过程将给服务器带来额外的压力。 存储过程多多时维护比较困难。 移植性差,在升级到不同的数据库时比较困难。 调试麻烦,SQL语言的处理功能简单。 总... 阅读全文
posted @ 2011-11-01 17:33 星月磊子 阅读(1523) 评论(0) 推荐(0) 编辑
摘要: 当我们在用SQL Server数据库开发系统的时候,经常会遇到系统需要权限控制,然而根据权限的控制程度不同有不同的设计方案。1. 基于角色的权限设计这种方案是最常见也是比较简单的方案,不过通常有这种设计已经够了,所以微软就设计出这种方案的通用做法,这种方案对于每一个操作不做控制,只是在程序中根据角色对是否具有操作的权限进行控制;这里我们就不做详述2. 基于操作的权限设计这种模式下每一个操作都在数据库中有记录,用户是否拥有该操作的权限也在数据库中有记录,结构如下:但是如果直接使用上面的设计,会导致数据库中的UserAction这张表数据量非常大,所以我们需要进一步设计提高效率,请看方案33. 基 阅读全文
posted @ 2011-11-01 17:30 星月磊子 阅读(241) 评论(0) 推荐(0) 编辑
摘要: 1. 用一条SQL语句 查询出每门课都大于80分的学生姓名name kechengfenshu 张三 语文81张三 数学75李四 语文76李四 数学90王五 语文81王五 数学100王五 英语90思路:这里不能直接用 分数>80这样的比较条件来查询的到结果,因为要求没门成绩都大于80。我们可以反过来思考,如果有一门成绩小于80,那么就不符合要求。先找出成绩表中成绩<80的多有学生姓名,不能重复,然后再用not in找出不再这个集合中的学生姓名。create table #成绩(姓名varchar(20),课程名称varchar(20),分数int)insert into #成绩va 阅读全文
posted @ 2011-11-01 17:28 星月磊子 阅读(493) 评论(1) 推荐(1) 编辑
摘要: 题外话:因为类六有关索引器的内容比较复杂,我想精心准备出经典实例和通俗易懂的讲解内容再发表博客,所以我先跳过索引器,接着学习继承。 本节课我们来学习一下类的继承,在面向对象二 中我已经讲述了继承的概念、优点,但是没有举出具体的代码实例讲解,在这篇博客中,不会再次细致的讲解继承的原理,建议同学们最好是先阅读面向对象二系列后,再学这篇博客,我们现在来回忆一下继承的概念。继承 继承是面向对象理论中最重要的一项机制,通过继承一个现有的类,新创建的类可以不需要再写任何代码,就可以按照继承来的父类中的合适的访问权限直接拥有所继承的类的功能,同时还可以创建自己的专门功能。 就向我在面向对象二中提到的,继承的 阅读全文
posted @ 2011-11-01 17:07 星月磊子 阅读(358) 评论(0) 推荐(0) 编辑
摘要: 今天我们来学习抽象类和接口,因为他们在很多方面有相似的用法,所以放到一堂课中讲解,看到这个标题的时候,一定有的同学会说接口,没类字呀,它也是类吗?从本质上接口也是类,和抽象类一样,接口也是一种特殊的类。 作为编程设计者在程序的开发中,设计抽象类和接口就是为了让他们用来被继承的,当一个项目经过需求分析后,一般正规的软件开发公司会由项目经理或经验丰富的开发人员,先根据需求和要实现的大部分功能来设计抽象类和接口,然后再将项目功能分发到开发人员或小组,具体来实现这些抽象类和接口,这样做的好处就是,规范了成员的命名和参数类型,合并代码时减少错误同时方便修改,代码的可读性更强,充分利用面向对象中的三大特性 阅读全文
posted @ 2011-11-01 17:06 星月磊子 阅读(153) 评论(0) 推荐(0) 编辑
摘要: 本节课我们来学习索引器,索引器的功能类似于属性,它也有一对get和set访问器,只不过属性是用来封装字段的,而索引器是利用访问器来有条件的来控制类中的数组类成员如数组和集合,get和set访问器的用法与属性一致,这里不做过多的讲解,首先我们定义一个int类型的数组a,观察一下索引器的具体语法: int [] a={1,2,3};//类中的数组也应该定义为私有变量,对外只提供索引器进行对数组的访问publicintthis[int index] //注意在定义索引器时要与所封装的数组类型一致。 { get { return a[index];//通过get访问器,在外部类通过索引器访问数组时,直 阅读全文
posted @ 2011-11-01 17:05 星月磊子 阅读(198) 评论(0) 推荐(0) 编辑
摘要: 本篇博客我们来学习面向对象的多态性,多态性主要的表现形式就是在继承中当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。当父类和子类的成员签名相同的时候,我们可以定义让子类的这个同名成员以何种形式显示出来,父类的这个的成员在子类中又用何种方式存在,这种多面的表现方法我们称为多态。如果我们要更改基类的数据和功能时,也就是说子类中可以以自己的方式去实现父类的功能,有两种方式:1.我们还在子类中可以使用override关键字重写基类中用virtual关键字修饰的虚拟的基成员;2.可以在子类中使用new关键字让派生成员替换基成员,此时基类成员只是被有意的隐藏掉了。 举一个现实生活的例子,我 阅读全文
posted @ 2011-11-01 17:05 星月磊子 阅读(187) 评论(0) 推荐(0) 编辑
摘要: 本节课我们来学习类的扩展分类,看我的标题中就罗列出了类的分类,类按照声明方式和功能定义共分为这六种类,实例类就是我们一直在用的类,class关键字前没有其他的修饰符,之前已经有很多实例类的使用方法了,我们今天主要是学习其他五种类。静态类 静态类就是在class关键字前加入了static关键字,基本语法是static Class ClassName{} 。静态类有几个特点:1.静态类只能包括静态成员2.类本身无法被实例化,也就是不能创建静态类的对象3.静态类无法被继承4.无法包含实例构造方法所以我们在创建静态类的时候,必须注意到以上四点,下面的实例是简单的静态类的使用。静态类实例Code hig 阅读全文
posted @ 2011-11-01 17:04 星月磊子 阅读(258) 评论(0) 推荐(0) 编辑
摘要: 这节课我们来学习方法中的参数传递,在面向对象二中,我曾说过,参数也属于变量的一种,在c语言的学习时,同学们都学习过参数这个概念和用法,方法使用参数列表来传递变量的基本语法如下:returnType FunctionName(paraType1 paraName1,paraType2 paraName2,……){ Function body;}其中的returnType是指方法的返回值,FunctionName指方法的标识符,paraType1指参数1的数据类型,paraName1是参数1的标识符,调用这种类型的方法的时候,必须传入与类型paraType1相符的参数值,并且传入的参数个数也必须相 阅读全文
posted @ 2011-11-01 17:03 星月磊子 阅读(255) 评论(0) 推荐(0) 编辑
摘要: 今天这节课我们来学习类的构造方法和析构方法,同学们现在回忆一下在类一系列中,学习到创建一个类ClassName的实例,也就是对象ObjName时基本语法为:ClassName ObjName=new ClassName();我说过,new后面的ClasName()实际上指的是这个类的构造方法,而且我也说过,这个()中可以有参数,这个有参数,就是指构造方法可以有参数,那么什么是类的构造方法呢?构造方法 构造方法又叫构造函数,也有人叫做构造器,其实就是对类进行初始化。构造方法是一种特殊的方法,在类实例创建之前执行,用来初始化对象,完成对象创建前所需的相关设定,构造方法允许将类实例初始为有效状态的特 阅读全文
posted @ 2011-11-01 17:03 星月磊子 阅读(247) 评论(0) 推荐(0) 编辑
摘要: 上节课我把属性形容成是一个进入房间的窗户或通道,关闭着的房间就是封装好的类,那么属性用代码要如何解释呢?其实这个问题,在我刚学习属性时也是很不理解,如果需要对字段的值进行判断,就写我上面的两段代码(17-38行)不就可以了吗?但是随着我们学习的不断深入,属性是必须掌握的一个知识点,现在同学们只需要会定义属性,同时会访问属性就可以了,日后深入学习(如windowsform)时,我们就理解属性的用法和好处了。在我们这个例子中属性机制就要做到如同守门员一样,限制住非海、陆、空的三种军种,下面把按照刚才军种的例子我来单独写一段代码,同时使用属性,在看代码前,我们先来看一下如何定义一个属性,它的基本语. 阅读全文
posted @ 2011-11-01 17:02 星月磊子 阅读(231) 评论(0) 推荐(0) 编辑