Oracle 的十八般武艺 (转载)

来源:互联网 发布:章鱼直播软件下载 编辑:程序博客网 时间:2024/05/22 12:11
 
ORACLE的简单介绍
ORACLE公司是一家提供综合技术产品、方案、服务的数据库公司
ORACLE数据库设计成可大量存储数据,快速查询数据,保证数据的安全和一致性,
跨网络的分布式管理及客户-服务器的配置等。
ORACLE SQL语法符合ANSI 1986标准
SQL 和数据库交流的命令式语言
SQL*PLUS ORACLE的一种工具, 用来运行SQL和PL/SQL语句
PL/SQL ORACLE的过程化编程语言

 

一、选择行
1. 简单的SELECT 语句
SELECT [DISTINCT] {*,COLUMN [ALIAS], ……} FROM table_name;
字段的非唯一的结果集
DISTINCT 字段名1 [ ,字段名2]
数字类型字段名之间可以进行算术运算
+ - * / 等
例如: (字段名1*字段名2)/3
合并字段内容的连接字符 ||
字段名1 || 字段名2
字段可以有别名
SELECT 字段名1 [AS] '字段名1 解释' FROM table;

2. 处理NULL
NULL 未定义,不可操作,什么都不是
NULL != 0 NULL!='空格'
和NULL的任何运算都返回NULL
ORACLE里未定义的变量值都为NULL
NVL函数可把NULL转换成其它类型的符号
NVL(EXPR1, EXPR2)函数
解释: IF EXPR1=NULL RETURN EXPR2
ELSE RETURN EXPR1
编程技巧: NVL函数在多条件模糊查询的时候比较有用
nvl('+input_value+','0')='0' or filed_name like '%+input_value+%'
NVL函数可返回多种数据类型:
返回日期 NVL(start_date,'2002-02-01')
返回字符串 NVL(title,'no title')
返回数字 NVL(salary,1000)

3. 使用SQL*PLUS(1)
登录SQL*PLUS的方法
用户名,密码,数据库连接字符串
数据库连接字符串可以用net8 easy configuration建立本地网络服务名配置,
也可以手工编辑$ORACLE_HOME/network/admin/tnsnames.ora文件。
在UNIX系统下不要用
$sqlplus username/password@dbname
这样别的用户用$ps命令能看出用户的密码
SQL> desc table; 显示表结构
SQL> select * from tab; 查看用户下所有的表
SQL> set pause on; 可以使大量结果集在用户按“Enter”(回车)后翻页
SQL> set pagesize 100; 设定SQL语句返回结果集一页的行数100, 默认值是14
SQL> set linesize 100; 设定SQL语句返回结果集一行的宽度100, 默认值是80

3. 使用SQL*PLUS(2)SQL*PLUS里的编辑命令
最近一条SQL命令语句存在ORACLE内存(sql buffer)里,但SQL*PLUS命令却不会存进去。
SQL*PLUS里的编辑命令:
A[PPEND] text 把text增加到当前行后面
C[HANGE] /old/new/ 把当前行old符号替换成new符号,new为空,删除old符号
CL[EAR] BUFF[ER] 从sql buffer里删除所有的行
DEL n 删除sql buffer里第n行
I[NPUT] text 在sql buffer后面插入text
L[IST] n 显示sql buffer里第n行
n 使第n行为当前行
n text 第n行替换成text
0 text 在第一行前面插入一行

3. 使用SQL*PLUS(3) SQL*PLUS里的文件命令:
SAV[E] filename [REP[LACE] | APP[END] ]
把sql buffer里的SQL命令存到OS下一个文件filename,默认的文件名后缀为.sql.
REP[LACE]替换filename里的SQL命令
APP[END] 把sql buffer里的SQL命令添加到filename后
GET filename 从filename里把SQL命令读到sql buffer
STA[RT] filename 运行上次保存到文件filename里的SQL命令
@filename 运行上次保存到文件filename里的SQL命令
EDIT 打开编辑窗口,编辑sql buffer里的SQL命令
EDIT filename 打开编辑窗口,编辑文件filename里的SQL命令
SPO[OL] filename [OFF | OUT] 把SQL命令结果输出到OS下一个文件filename OFF结束输出到文件, OUT结束输出到文件并打印文件

4. SQL*PLUS里规定字段的显示格式
规定数字的显示格式
SQL>column 字段名 format 99999999999;
SQL>column 字段名 format 999,999,999,999;
规定字符串的显示宽度
SQL>column 字段名 format a数字 [word_wrapped];
说明: 一行只显示数字位的长度, 超过长度折行,加word_wrapped后, 单词不会折行
规定long字符的显示宽度
SQL>set long 200;
规定字段名的显示内容
SQL> column 字段名 heading '字段名显示内容';
SQL> set heading off; 查询时不显示字段名称
规定字段的对齐方向
SQL> column 字段名 justify [left | right | center];
清除字段的格式
SQL> column 字段名 clear;

5. SQL*PLUS里规定字段的显示格式例子
SQL> column last_name heading 'Employee|Name' format a15;
SQL> column salary justify right format $99,999.99;
SQL> column start_date format a10 null 'Not Hired';
说明:如果start_date为null, 显示字符串'Not Hired'

6. 判断题(T/F)
(1). SQL command are always held in sql buffer. [T]
(2). SQL*PLUS command assit with query data. [T]
SQL*PLUS命令只控制SELECT结果集的显示格式及控制文件.只有SQL命令能访问数据库.

二、限制选择行
1. 按指定的规则排序
SELECT expr FROM table [ORDER BY {column, expr} [ASC | DESC] ];
默认的排序是ASC升序(由小到大)
还可以ORDER BY 字段名的位置[1]| [2] ASC| DESC;
当字段名很复杂或者是算术表达式时用字段名显示的位置排序很方便.

2. 用WHERE限制选择行(1)
比较操作符 = > < >= <= != <> ^= 与NULL比较不能用上面的比较操作符 ANY SOME ALL
SQL操作符 BETWEEN … AND… IN LIKE IS NULL
NOT BETWEEN … AND… NOT IN NOT LIKE IS NOT NULL
逻辑操作符 AND OR NOT

3. 用WHERE限制选择行(2)
比较顺序(可以用括号改变它们的顺序)
(1). = < > >= <= in like is null between
(2). and
(3). Or
注意: char和varchar2的比较规则有不同:
char比较时会忽略字符串后面的空格. varchar2会计算字符串后面的空格

4. LIKE操作
% 零到任意多个字符 _ 一个字符
例如: 字段名 like 'M%' 字段名 like '%m%' 字段名 like 'job_'
如果要找含下划线的字符, 要加反斜线 例如:字段名 like '%X/_Y%' escape '/'

5. 日期字段的比较
举例:
日期字段 between to_date('2001-12-12','YYYY-MM-DD') and to_date('2002-02-01','YYYY-MM-DD')
日期字段> to_date('2001-12-12','YYYY-MM-DD') and日期字段<= to_date('2002-02-01','YYYY-MM-DD');

6. 不能用到索引的比较操作符
IS NULL
IS NOT NULL
LIKE '%m%'

三、单行函数
1. 数字函数
ABS 取绝对值 POWER 乘方 LN 10为底数取冪
SQRT 平方根 EXP e的n次乘方 LOG(m,n) m为底数n取冪
数学运算函数:ACOS ATAN ATAN2 COS COSH SIGN SIN SINH TAN TANH
CEIL 大于或等于取整数
FLOOR 小于或等于取整数
MOD 取余数
ROUND(n,m) 按m的位数取四舍五入值如果round(日期): 中午12以后将是明天的日期. round(sysdate,'Y')是年的第一天
TRUNC(n,m) 按m的位数取前面的数值如果trunc(日期), 确省的是去掉时间

2. 字符函数
CHR 按数据库的字符集由数字返回字符
CONCAT(c1,c2) 把两个字符c1,c2组合成一个字符, 和 || 相同
REPLACE(c,s,r) 把字符c里出现s的字符替换成r, 返回新字符
SUBSTR(c,m,n) m大于0,字符c从前面m处开始取n位字符,m等于0和1一样,
m小与0,字符c从后面m处开始取n位字符
TRANSLATE(c,f1,t1) 字符c按f1到t1的规则转换成新的字符串
INITCAP 字符首字母大写,其它字符小写
LOWER 字符全部小写
UPPER 字符全部大写
LTRIM(c1,c2) 去掉字符c1左边出现的字符c2
RTRIM(c1,c2)
TRIM(c1,c2) 去掉字符c1左右两边的字符c2
LPAD(c1,n,c2) 字符c1按制定的位数n显示不足的位数用c2字符串替换左边的空位
RPAD(c1,n,c2)

3. 日期函数
ADD_MONTHS(d,n) 日期值加n月
LAST_DAY(d) 返回当月的最后一天的日期
MONTHS_BETWEEN(d1,d2) 两个日期值间的月份,d1NEXT_DAY(d) 返回日期值下一天的日期
SYSDATE 当前的系统时间
DUAL是SYS用户下一个空表,它只有一个字段dummy
4. 转换函数(1)
TO_CHAR(date,'日期显示格式')
TO_CHAR(number) 用于显示或报表的格式对齐
TO_DATE(char,'日期显示格式')
TO_LOB 把long字段转换成lob字段
TO_NUMBER(char) 用于计算或者比较大小

4. 转换函数(2)
to_date里日期显示格式
YYYY 年 YEAR YYY YY Y
Q 季度
MM 月 MONTH MON
W 星期 (week of month) WW, IW (week of year)
(说明:周计是按ISO标准,从1月1日的星期数到后面七天为一周,不一定是从周一到周日)
DD 日 DAY DY
HH24 小时 HH12 HH
MI 分钟
SS 秒
如果想固定日期的显示格式可以在数据库的参数文件initorasid.ora里新写一行参数 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss可以在UNIX环境变量或者NT的注册表里的设置 NLS_DATE_FORMAT=yyyy-mm-dd hh24:mi:ss

4. 转换函数(3)
如果想固定日期的显示格式可以用alter session命令改变
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
它的作用顺序如下:
initialization parameter
Environment variable
ALTER SESSION command

4. 转换函数 (4)
to_char(number)里数字显示格式
9 数字位
0 数字前面补0 to_char(-1200,'00000.00')
. 小数点的位置
, 标记位置的逗号 用在数字显示格式的左边
L 根据数据库字符集加货币符号 to_char(-1200,'L9999.99')
B 把数字0显示为空格,用在数字显示格式的右边

MI 右边的负数标记 to_char(-1200,'9999.99MI')
PR 括起来的负数 to_char(-1200,'9999.99PR')
EEEE 用指数方式表示 to_char(-1200,'9999.99EEEE')

5. 输入字符,返回数字的函数
instr(c1,c2) 字符c2出现在c1的位置, 不出现, 返回0, 常用于模糊查询
length(c) 按数据库的字符集,算出字符c的长度,跟数据库的字符集有关, 一个汉字长度为1

6. 有逻辑比较的函数NVL(EXPR1, EXPR2)函数
解释: IF EXPR1=NULL RETURN EXPR2
ELSE RETURN EXPR1
DECODE(AA﹐V1﹐R1﹐V2﹐R2....)函数
解释: IF AA=V1 THEN RETURN R1
IF AA=V2 THEN RETURN R2
..…
ELSE
RETURN NULL
举例: decode(id,1,'dept sale',2,'dept tech')

四、从多个表里选取数据记录
1. 数据表间的连接
简单的连接语法:
SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……]
WHERE 表名1.字段名 = 表名2. 字段名 [ AND ……] ;
SELECT 字段名1, 字段名2, …… FROM 表名1, [表名2, ……]
WHERE 表名1.字段名 = 表名2. 字段名(+) [ AND ……] ;
有(+)号的字段位置自动补空值

连接的分类:
等于的连接 =
不等于的连接 != BETWEEN … AND … IN 注意IN和OR不能一起用
外连接 有一个字段名(+) , 没有满足的条件补空值
自连接 同一个表自己跟自己连接 例如找重复记录

2. 数据表间的连接例子
删除table_name表里字段名email重复的记录:
SQL>delete from table_name t1
where t1.rowid >
(select min(rowid) from table_name t2
where t1.email = t2.email
group by email
having count(email) > 1);

找到手机用户的服务区域:
SQL> select a.handphoneno,nvl(c.name,'null'),a.totalscore
from topscore a,chargeoperator cc,chargeoperatorinfo c
where substr(a.handphoneno,1,7)=cc.hpnohead(+)
and cc.chargetype=c.chargetype(+)
order by a.totalscore desc;

3. 数据表间的连接技巧
连接N个表, 需要N-1个连接操作
被连接的表最好建一个单字符的别名, 字段名前加上这个单字符的别名
BETWEEN .. AND.. 比用 >= AND <= 要好
连接操作的字段名上最好要有索引
连接操作的字段最好用整数数字类型
有外连接时, 不能用OR或IN的比较操作

4. 如何分析和执行SQL语句
写多表连接SQL语句时要知道它的分析执行计划的情况.
Sys用户下运行@/ORACLE_HOME/sqlplus/admin/plustrce.sql
产生plustrace角色
Sys用户下把此角色赋予一般用户 SQL> grant plustrace to &username;
一般用户下运行@/ORACLE_HOME/rdbms/admin/utlxplan.sql
产生plan_table
SQL> set time on; 说明:打开时间显示
SQL> set autotrace on; 说明:打开自动分析统计,并显示SQL语句的运行结果
SQL> set autotrace traceonly; 说明:打开自动分析统计,不显示SQL语句的运行结果
接下来你就运行测试SQL语句,看到其分析统计结果了。
一般来讲,我们的SQL语句应该避免大表的全表扫描。
SQL> set autotrace off; 说明:关闭自动分析统计

五、集合函数 经常和group by一起使用
1. 集合函数列表
AVG (DISTINCT | ALL | N) 取平均值
COUNT (DISTINCT | ALL | N | expr | * ) 统计数量
MAX (DISTINCT | ALL | N) 取最大值
MIN (DISTINCT | ALL | N) 取最小值
SUM (DISTINCT | ALL | N) 取合计值
STDDEV (DISTINCT | ALL | N) 取偏差值,如果组里选择的内容都相同,结果为0
VARIANCE (DISTINCT | ALL | N) 取平方偏差值

2. 使用集合函数的语法
SELECT column, group_function FROM table
WHERE condition GROUP BY group_by_expression
HAVING group_condition ORDER BY column;

3. 使用count时的注意事项
SELECT COUNT(*) FROM table;
SELECT COUNT(常量) FROM table;

都是统计表中记录数量,如果没有PK后者要好一些
SELECT COUNT(all 字段名) FROM table;
SELECT COUNT(字段名) FROM table;

不会统计为NULL的字段的数量
SUM,AVG时都会忽略为NULL的字段

4. 用group by时的限制条件
SELECT字段名不能随意, 要包含在GROUP BY的字段里
GROUP BY后ORDER BY时不能用位置符号和别名
限制GROUP BY的显示结果, 用HAVING条件

5. 例子
SQL> select title,sum(salary) payroll from s_emp
where title like 'VP%' group by title
having sum(salary)>5000 order by sum(salary) desc;

找出某表里字段重复的记录数, 并显示
SQL> select (duplicate field names) from table_name
group by (list out fields) having count(*)>1;

6. 判断题(T/F)
(1) Group functions include nulls in calculations [F]
(2) Using the having clause to exclude rows from a group calculation [F]
解释:
Group function 都是忽略NULL值的 如果您要计算NULL值, 用NVL函数
Where语句在Group By前把结果集排除在外Having语句在Group By后把结果集排除在外

7. 在SQL*PLUS里可使用的其它命令:

Ctrl^C 终止正在运行的SQL语句
remark /*...*/ -- 注释符号
HOST 可执行的操作系统下的命令 有些unix可以用 !

BREAK ON column_name SKIP n [ ON column_name SKIP n ]
按字段的名称column_name分隔显示,更清晰,SKIP n 是在分隔处空行的数量n
BREAK ON ROW SKIP n 每一行间隔都放n个空行

COMPUTE 集合运算符 OF 字段1 ON 字段2 按字段2对字段1进行集合运算
COMPUTE后面可以跟的集合运算符:
SUM MINIMUM MAXIMUM AVG STD VARIANCE COUNT NUMBER

8.在SQL*PLUS里可使用的其它命令举例:(scott用户)

BREAK ON REPORT
COMPUTE SUM LABEL TOTAL OF SAL ON REPORT 在全部结果集后面算合计
select ename,sal from emp where job='SALESMAN';

COMPUTE AVG LABEL avg OF SAL ON REPORT 在全部结果集后面算平均值
/ 再次执行上次的sql语句

break on DEPTNO skip 2 on JOB skip 1 在BREAK字段结果集后面算合计
COMPUTE SUM OF SAL ON DEPTNO
SELECT DEPTNO,JOB,ENAME,SAL FROM EMP ORDER BY DEPTNO,JOB;

SQL> CLEAR BREAKS; 清除设置的BREAK条件
SQL> CLEAR COMPUTES; 清除设置的COMPUTE条件

六、子查询
1. 查询语句可以嵌套
例如: SELECT …… FROM (SELECT …… FROM表名1, [表名2, ……] WHERE 条件) WHERE 条件2;

2. 何处可用子查询?
当查询条件是不确定的条件时
DML(insert, update,delete)语句里也可用子查询
HAVING里也可用子查询

3. 两个查询语句的结果可以做集合操作
例如:
并集UNION(去掉重复记录)
并集UNION ALL(不去掉重复记录)
差集MINUS,
交集INTERSECT

4. 子查询的注意事项
先执行括号里面的SQL语句,一层层到外面
内部查询只执行一次
如果里层的结果集返回多个,不能用= > < >= <=等比较符要用IN.

5. 子查询的例子(1)
SQL> select title,avg(salary) from s_emp
group by title Having avg(salary) =
(select min(avg(salary)) from s_emp
group by title);
找到最低平均工资的职位名称和工资

5. 子查询的例子(2)
子查询可以用父查询里的表名
这条SQL语句是对的:
SQL>select cty_name from city where st_code in
(select st_code from state where st_name='TENNESSEE' and
city.cnt_code=state.cnt_code);
说明:父查询调用子查询只执行一次.

6.取出结果集的80 到100的SQL语句
ORACLE处理每个结果集只有一个ROWNUM字段标明它的逻辑位置,
并且只能 用ROWNUM<100, 不能用ROWNUM>80。
以下是经过分析后较好的两种ORACLE取得结果集80到100间的SQL语句( ID是唯一关键字的字段名 ):
语句写法:
SQL>select * from (
( select rownum as numrow, c.* from (
select [field_name,...] from table_name where 条件1 order by 条件2) c)
where numrow > 80 and numrow <= 100 )
order by 条件3;

七、在执行SQL语句时绑定变量
1. 接收和定义变量的SQL*PLUS命令
ACCEPT
DEFINE UNDEFINE
&

2. 绑定变量SQL语句的例子(1)
SQL> select id, last_name, salary from s_emp where dept_id = &department_number;
Enter value for department_number: 10
old 1: select id, last_name, salary from s_emp where dept_id=&department_number;
new 1: select id, last_name, salary from s_emp where dept_id= 10
SQL> SET VERIFY OFF | ON;可以关闭和打开提示确认信息old 1和new 1的显示.

3. 绑定变量SQL语句的例子(2)
SQL> select id, last_name, salary
from s_emp
where title = '&job_title';
Enter value for job_title: Stock Clerk

SQL> select id, last_name, salary
from s_emp
where hiredate >to_date( '&start_hire_date','YYYY-MM-DD');
Enter value for start_hire_date : 2001-01-01

把绑定字符串和日期类型变量时,变量外面要加单引号
也可绑定变量来查询不同的字段名
输入变量值的时候不要加;等其它符号

4. ACCEPT的语法和例子
SQL> ACCEPT variable [datatype] [FORMAT] [PROMPT text] [HIDE]
说明: variable 指变量名 datatype 指变量类型,如number,char等 format 指变量显示格式 prompt text 可自定义弹出提示符的内容text hide 隐藏用户的输入符号
使用ACCEPT的例子:
ACCEPT p_dname PROMPT 'Provide the department name: '
ACCEPT p_salary NUMBER PROMPT 'Salary amount: '
ACCEPT pswd CHAR PROMPT 'Password: ' HIDE
ACCEPT low_date date format 'YYYY-MM-DD' PROMPT“Enter the low date range('YYYY-MM-DD'):”

4. DEFINE的语法和例子
SQL> DEFINE variable = value
说明: variable 指变量名 value 指变量值
定义好了变良值后, 执行绑定变量的SQL语句时不再提示输入变量
使用DEFINE的例子:
SQL> DEFINE dname = sales
SQL> DEFINE dname
DEFINE dname = “sales” (CHAR)
SQL> select name from dept where lower(name)='&dname';
NAME
-------------------------
sales
sales
SQL> UNDEFINE dname
SQL> DEFINE dname
Symbol dname is UNDEFINED

5. SQL*PLUS里传递参数到保存好的*.sql文件里
SQL> @ /路径名/文件名 参数名1[,参数名2, ….]
SQL> start /路径名/文件名 参数名1[,参数名2, ….]

注意事项:
一次最多只能获取9个&变量, 变量名称只能是从&1,&2到&9
变量名后不要加特殊的结束符号
如果在SQL*PLUS里要把&符号保存在ORACLE数据库里,要修改sql*plus环境变量define
SQL> set define off;

八、概述数据模型和数据库设计
1. 系统开发的阶段:
Strategy and Analysis
Design
Build and Document
Transition
Production

2. 数据模型
Model of system in client's mind
Entity model of client's model
Table model of entity model
Tables on disk

3. 实体关系模型 (ERM)概念
ERM ( entity relationship modeling)
实体 存有特定信息的目标和事件 例如: 客户,订单等
属性 描述实体的属性 例如: 姓名,电话号码等
关系 两个实体间的关系 例如:订单和产品等
实体关系模型图表里的约定
Dashed line (虚线) 可选参数 “may be”
Solid line (实线) 必选参数 “must be”
Crow's foot (多线) 程度参数 “one or more”
Single line (单线) 程度参数 “one and only one”

4. 实体关系模型例子
每个订单都必须有一个或几个客户
每个客户可能是一个或几个订单的申请者

5. 实体关系的类型
1:1 一对一 例如: 的士和司机
M:1 多对一 例如: 乘客和飞机
1:M 一对多 例如: 员工和技能

6. 校正实体关系的原则
属性是单一值的, 不会有重复
属性必须依存于实体, 要有唯一标记
没有非唯一属性依赖于另一个非唯一的属性
7. 定义结构时的注意事项
减少数据冗余
减少完整性约束产生的问题
确认省略的实体,关系和属性

8. 完整性约束的要求
Primary key 主关键字 唯一非NULL
Foreign key 外键 依赖于另一个Primary key,可能为NULL
Column 字段名 符合定义的类型和长度
Constraint 约束条件 用户自定义的约束条件,要符合工作流要求
例如: 一个销售人员的提成不能超过它的基本工资
Candidate key 候选主关键字 多个字段名可组成候选主关键字, 其组合是唯一和非NULL的

9. 把实体关系图映射到关系数据库对象的方法
把简单实体映射到数据库里的表
把属性映射到数据库里的表的字段, 标明类型和注释
把唯一标记映射到数据库里的唯一关键字
把实体间的关系映射到数据库里的外键

其它的考虑:
设计索引,使查询更快
建立视图,使信息有不同的呈现面, 减少复杂的SQL语句
计划存储空间的分配
重新定义完整性约束条件

10. 实体关系图里符号的含义
PK 唯一关键字的字段
FK 外键的字段
FK1,FK2 同一个表的两个不同的外键
FK1,FK1 两个字段共同组成一个外键
NN 非null字段
U 唯一字段
U1,U1 两个字段共同组成一个唯一字段

九、创建表
1. ORACLE常用的字段类型
ORACLE常用的字段类型有
VARCHAR2 (size) 可变长度的字符串, 必须规定长度
CHAR(size) 固定长度的字符串, 不规定长度默认值为1
NUMBER(p,s) 数字型p是位数总长度, s是小数的长度, 可存负数
最长38位. 不够位时会四舍五入.
DATE 日期和时间类型
LOB 超长字符, 最大可达4G
CLOB 超长文本字符串
BLOB 超长二进制字符串
BFILE 超长二进制字符串, 保存在数据库外的文件里是只读的.

数字字段类型位数及其四舍五入的结果
原始数值1234567.89
数字字段类型位数 存储的值
Number 1234567.89
Number(8) 12345678
Number(6) 错
Number(9,1) 1234567.9
Number(9,3) 错
Number(7,2) 错
Number(5,-2) 1234600
Number(5,-4) 1230000
Number(*,1) 1234567.9

2. 创建表时给字段加默认值 和约束条件
创建表时可以给字段加上默认值
例如 : 日期字段 DEFAULT SYSDATE
这样每次插入和修改时, 不用程序操作这个字段都能得到动作的时间

创建表时可以给字段加上约束条件
例如: 非空 NOT NULL
不允许重复 UNIQUE
关键字 PRIMARY KEY
按条件检查 CHECK (条件)
外键 REFERENCES 表名(字段名)

3. 创建表的例子
CREATE TABLE DEPT(
EPTNO NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY,
DNAME VARCHAR2(14),
LOC VARCHAR2(13)) ;

CREATE TABLE region(
ID number(2) NOT NULL PRIMARY KEY,
postcode number(6) default '0' NOT NULL,
areaname varchar2(30) default ' ' NOT NULL);

4. 创建表时的命名规则和注意事项
表名和字段名的命名规则:必须以字母开头,可以含符号A-Z,a-z,0-9,_,$,#
大小写不区分
不用SQL里的保留字, 一定要用时可用双引号把字符串括起来.
用和实体或属性相关的英文符号长度有一定的限制

注意事项:
建表时可以用中文的字段名, 但最好还是用英文的字段名
创建表时要把较小的不为空的字段放在前面, 可能为空的字段放在后面
建表时如果有唯一关键字或者唯一的约束条件,建表时自动建了索引
一个表的最多字段个数也是有限制的,254个.

5. 约束名的命名规则和语法
约束名的命名规则约束名如果在建表的时候没有指明,系统命名规则是SYS_Cn(n是数字)
约束名字符串的命名规则同于表和字段名的命名规则

6. 使用约束时的注意事项
约束里不能用系统函数,如SYSDATE和别的表的字段比较
可以用本表内字段的比较

想在事务处理后, 做约束的检查
SQL> alter session set constraints deferred.

7. 由实体关系图到创建表的例子 s_dept
前提条件:已有region表且含唯一关键字的字段id
SQL> CREATE TABLE s_dept
(id NUMBER(7)
CONSTRAINT s_dept_id_pk PRIMARY KEY,
name VARCHAR2(25)
CONSTRAINT s_dept_name_nn NOT NULL,
region_id NUMBER(7)
CONSTRAINT s_dept_region_id_fk REFERENCES region (id),
CONSTRAINT s_dept_name_region_id_uk UNIQUE(name, region_id));

8. 较复杂的创建表例子
SQL> CREATE TABLE s_emp
(id NUMBER(7)
CONSTRAINT s_emp_id_pk PRIMARY KEY,
last_name VARCHAR2(25)
CONSTRAINT s_emp_last_name_nn NOT NULL,
first_name VARCHAR2(25),
userid VARCHAR2(8)
CONSTRAINT s_emp_userid_nn NOT NULL
CONSTRAINT s_emp_userid_uk UNIQUE,
start_date DATE DEFAULT SYSDATE,
comments VARCHAR2(25),
manager_id NUMBER(7),
title VARCHAR2(25),
dept_id NUMBER(7)
CONSTRAINT s_emp_dept_id_fk REFERENCES s_dept(id),
salary NUMBER(11,2),
commission_pct NUMBER(4,2)
CONSTRAINT s_emp_commission_pct_ck CHECK
(commission_pct IN(10,12.5,15,17.5,20)));

8. 通过子查询建表
通过子查询建表的例子
SQL>CREATE TABLE emp_41 AS SELECT id, last_name, userid, start_date
FROM s_emp WHERE dept_id = 41;

SQL> CREATE TABLE A as select * from B where 1=2;
只要表的结构.

10. 用子查询建表的注意事项
可以关连多个表及用集合函数生成新表,注意选择出来的字段必须有合法的字段名称,且不能重复。
用子查询方式建立的表,只有非空NOT NULL的约束条件能继承过来, 其它的约束条件和默认值都没有继承过来.
根据需要,可以用alter table add constraint ……再建立其它的约束条件,如primary key等.

10. Foreign Key的可选参数ON DELETE CASCADE
在创建Foreign Key时可以加可选参数:
ON DELETE CASCADE它的含义是如果删除外键主表里的内容,子表里相关的内容将一起被删除.
如果没有ON DELETE CASCADE参数,子表里有内容,父表里的主关键字记录不能被删除掉.

12. 如果数据库表里有不满足的记录存在,建立约束条件将不会成功.

13. 给表创建和删除同义词的例子
SQL> CREATE SYNONYM d_sum
2 FOR dept_sum_vu;

SQL> CREATE PUBLIC SYNONYM s_dept
2 FOR alice.s_dept;

SQL> DROP SYNONYM s_dept;

十、ORACLE里的数据字典
1. 什么是数据字典ORACLE的数据字典是数据库的重要组成部分之一,它随着数据库
的产生而产生, 随着数据库的变化而变化, 体现为sys用户下所有的一些表和视图.

2. 数据字典里存了以下内容:用户信息
用户的权限信息
所有数据对象信息表的约束条件统计分析数据库的视图等
不能手工修改数据字典里的信息.

3. 常用的数据字典
Dictionary 存放所有数据表,视图,同义词名称和解释
Dict_columns 数据字典里字段名称的和解释
Dba_users 用户 Dba_tablespaces 表空间
Dba_data_files 数据库的文件 Dba_free_space 空闲表空间
Dba_rollback_segs 回滚段
User_objects 数据对象 User_constraints 约束条件
User_sequences 序列号 User_views 视图
User_indexes 索引 User_synonyms 同义词
Session_roles 用户的角色 User_role_privs 用户的角色权限
User_sys_privs 用户的系统权限 User_tab_privs 用户的表级权限
V$session 实时用户情况 V$sysstat 实时系统统计
V$sesstat 实时用户统计 V$sgastat 实时SGA使用
V$locked_object 实时锁 V$controlfile 控制文件
V$logfile 日志文件 V$parameter 参数文件

4. 数据字典的分类
数据字典四大类别
User_ 用户下所有数据库对象
All_ 用户权限范围内所有的数据库对象
Dba_ 所有的数据库对象
V$ 统计分析数据库的视图 赋于oem_monitor权限非DBA用户也可查询V$*视图

5. 查询数据字典
SQL> select * from dictionary where instr(comments,'index')>0;
SQL> select constraint_name, constraint_type,
2 search_condition, r_constraint_name
3 from user_constraints
4 where table_name = ‘&table_name';

十一. 控制数据
1 、INSERT(往数据表里插入记录的语句)
SQL> insert into 表名(字段名1, 字段名2, ……) values ( 值1, 值2, ……);
SQL> insert into 表名(字段名1, 字段名2, ……) select (字段名1, 字段名2, ……)
from 另外的表名 where 条件;
可以用&标记变量的方法多次输入记录

快速插入数据的方法, 一般用于大于128M的数据转移
SQL> insert /*+ append */ into 表名
select * from 另外的用户名 .另外的表名 WHERE 条件;
SQL> commit;

注意事项:
用INSERT /*+ APPEND */ 的方法会对target_tablename产生级别为6的独占锁,
如果运行此命令时还有对target_tablename的DML操作会排队在它后面,
对OLTP系统在用的表操作是不合适的。

2. 插入字符串类型的字段的注意事项:
字符串类型的字段值必须用单引号括起来, 例如: ’GOOD DAY’
如果字段值里包含单引号’ 需要进行字符串转换, 我们把它替换成两个 单引号’ ’
字符串类型的字段值超过定义的长度会出错, 最好在插入前进行长度校验
‘’ 标记是NULL, user 标明当前用户
日期字段的字段值可以用当前数据库的系统时间SYSDATE, 精确到秒
用字符串转换成日期型函数TO_DATE(‘2001-08-01’,’YYYY-MM-DD’)
TO_DATE( )还有很多种日期格式, 可以参看ORACLE DOC.
年-月-日 小时:分钟:秒 的格式YYYY-MM-DD HH24:MI:SS
INSERT时最大可操作的字符串长度小于等于4000个单字节,
如果要插入更长的字符串, 请考虑字段用CLOB类型, 方法借用ORACLE里自带的DBMS_LOB程序包.

3、UPDATE (修改数据表里记录的语句)
SQL> UPDATE 表名 SET 字段名1=值1, 字段名2=值2, …… WHERE 条件;
如果修改的值N没有赋值或定义时, 将把原来的记录内容清为NULL,
最好在修改前进行非空校验;
值N超过定义的长度会出错, 最好在插入前进行长度校验.
新功能,可以修改子查询后的结果集
例子:SQL> update (select * from s_dept) set id=50 where id=60;

4、DELETE (删除数据表里记录的语句)
SQL> DELETE FROM 表名 WHERE 条件;
注意:删除记录并不能释放ORACLE里被占用的数据块表空间. 它只把那些 被删除的数据块标成unused.
如果确实要删除一个大表里的全部记录, 可以用 TRUNCATE 命令, 它可以释放占用的数据块表空间
SQL> TRUNCATE TABLE 表名;
此操作不可回退.

5、 SQL语句的分类
数据定义语言(DDL):create、alter、drop(创建、修改结构、删除)(其他:rename)
数据操纵语言(DML):insert、delete、select、update(增、删、查、改)(其他:truncate)
数据控制语言(DCL):grant、revoke(授权、回收)、set role
事务控制:commit、rollback、savepoint(其他:lock table、set constraint(s)、set transaction)
审计控制:audit、noaudit
系统控制:alter system 会话控制:alter session
其他语句:comment(添加注释)、explain plan、analyze、validate、call

6、ORACLE里事务控制
Commit 提交事务
Rollback 回退事务
Savepoint 设置断点, 在事务中标记位置, 事务结束, 断点释放
事务结束的情况遇到commit或者rollback遇到DDL和DCL语句发现错误,如死锁用户退出SQL*PLUS系统重启或崩溃

6、事物控制和SAVEPOINT命令

7. DML操作的注意事项
以上SQL语句对表都加上了行级锁, 确认完成后, 必须加上事物处理结束的命令COMMIT 才能正式生效,
否则改变不一定写入数据库里.行级锁也未能得到释放.
如果想撤回这些操作, 可以用命令 ROLLBACK 复原.
在运行INSERT, DELETE 和 UPDATE 语句前最好估算一下可能操作的记录范围,
应该把它限定在较小 (一万条记录) 范围内,. 否则ORACLE处理这个事物用到很大的回退段.
程序响应慢甚至失去响应. 如果记录数上十万以上这些操作,
可以把这些SQL语句分段分次完成, 其间加上COMMIT 确认事物处理.
太过频繁的commit不好

十二、改变表和约束条件
1. 改变表的几种情况(1) 运行时会加表级锁
改变表的名称
SQL> RENAME 表名1 TO 表名2; SQL> ALTER TABLE 表名1 RENAME TO 表名2;
在表的后面增加一个字段
SQL> ALTER TABLE 表名 ADD 字段名 字段名描述 [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……];
修改表里字段的定义描述
SQL> ALTER TABLE 表名 MODIFY 字段名1 字段名1描述 [ DEFAULT expr ][ NOT NULL ][ ,字段名2 ……]; 记录为空时,可以减少字段长度,改变字段类型修改DEFAULT值只作用于修改后的INSERT和UPDATE的记录修改NOT NULL约束只对现存含非空记录的字段起作用

1. 改变表的几种情况(2) 运行时会加表级锁
删除表里的某个字段
SQL> ALTER TABLE 表名 DROP 字段名;
给表里的字段加上/禁止/启用约束条件
SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 PRIMARY KEY (字段名1[,字段名2 ……]);
SQL> ALTER TABLE 表名 ADD | DISABLE | ENABLE CONSTRAINT 约束名 UNIQUE (字段名1[,字段名2 ……]);
加唯一关键字或者唯一约束条件时自动建立索引
说明:禁止唯一关键字和唯一约束时索引仍然存在,可以被使用.

1. 改变表的几种情况(3) 运行时会加表级锁
删除表里的约束条件
SQL> ALTER TABLE 表名 DROP CONSTRAINTS 约束名 [CASCADE];
会把约束相关的索引一起删除. CASCADE能同时删去外键的约束条件.
把表放在或取出数据库的内存区
SQL> ALTER TABLE 表名 CACHE;
SQL> ALTER TABLE 表名 NOCACHE;
改变表存储的表空间
SQL> ALTER TABLE 表名 MOVE TABLESPACE 表空间名 ;
注意: 如果被转移表空间的表含有索引, 表转移后索引变得不可用.
我们要删除旧索引,建立新索引

2. 删除表及表里的数据
删除表
SQL> DROP TABLE 表名 [CASCADE CONSTRAINTS];
清空表里的记录
SQL> TRUNCATE TABLE 表名;
按时间清空日志表里的记录,使用重新命名的方法(应用程序可能有短暂出错, 可以选择在不繁忙的时间执行)
按原来表A的建表语句创建新表A1,
把表A重命名为A2(如果表A上有较频繁的DML操作,会对表加上行级锁,重命名过程用递归的方式循环做,直到DML操作结束,命名成功).
把创建新表A1重命名为A
历史记录表A2备份或删除

3. 删除表后应该注意的问题
删除表后把表里的索引一起删去.
删除表后会结束基于它的悬而未决的事物
删除表后根据表创建的views,synonym,stored procedure,stored function依然存在,但views,synonym变成非法的. 需要手工找出它们并删除.
如果用了CASCADE CONSTRAINTS会把与它相关的约束一起删除
此操作不可回退

4. 给表加注释
加注释的语法
SQL> COMMENT ON TABLE 表名 | COLUMN表名.字段名 IS ‘text‘
加注释的例子
SQL> comment on table s_emp is ‘Enployee information‘;
SQL> comment on column s_emp.last_name is ‘‘;
关于注释的数据库字典
ALL_COL_COMMENTS
USER_COL_COMMENTS
ALL_TAB_COMMENTS
USER_TAB_COMMENTS

十三、创建序列号
1. 创建序列号里各参数的解释
SQL> CREATE SEQUENCE name [INCREMENT BY n]
[START WITH n] [{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}]
[{CACHE n | NOCACHE}]
INCREMENT BY n 一次增长n 个数字
NOMAXVALUE 缺省值10E+27
NOMINVALUE 缺省值1
NOCYCLE 不循环, 常用于唯一关键字
CACHE n 在内存里缓存n个序列,出错回退时会丢失
oracle8i里默认的n是20

序列号的名称一般可以采用“表名_字段名”的命名规则

2. 插入自动增长序列号字段的方法
INSERT时如果要用到从1开始自动增长的数字做唯一关键字, 应该先建立一个序列号.
CREATE SEQUENCE 序列号的名称 (最好是表名+序列号标记) INCREMENT BY 1 START WITH 1 MAXVALUE 99999 NOCYCLE NOCACHE;
其中最大的值按字段的长度来定,比如定义的自动增长的序列NUMBER(6) , 最大值为999999
INSERT 语句插入这个字段值为: 序列号的名称.NEXTVAL
例子: SQL> insert into s_dept(id, name, region_id) values (s_dept_id.nextval, 'finance', 2);
1 row created.
只有运行了序列号的名称. nextval后序列号的名称. currval 才有效才有值.

3. 查询序列号的情况
SQL> select sequence_name, min_value, max_value, increment_by, last_number from user_sequences;
其中last_number指的是序列号的下一个值.

4. 改变序列号
SQL> ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}]
[{MINVALUE n | NOMINVALUE}]
[{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}];
注意: 不能改变它的起始值
如果要改变序列的起始值, 先把序列号删除掉, 再新建一个.

5. 删除序列号
SQL>DROP SEQUENCE sequence;

6. 不能用序列号的nextval和currval的地方

视图的查询
有distinct的查询
有group by,having,order by的查询
有子查询的查询
表里的缺省值

十四、创建视图
1. 视图的概念和优点
视图是基于一个或多个表及视图的一些查询语句, 它象显示数据的视窗, 它本身是不存储数据的.

视图可以限制数据库的访问, 更好的控制权限
使用户使用简单的查询语句
数据的非依赖性
同一数据的不同表现形式

2. 创建视图的语法
SQL> CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view[(alias[, alias]...)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]
参数解释:
FORCE 表不存在时,视图仍然可以创建成功
WITH CHECK OPTION 只有符合视图定义的记录才能被插入或修改
WITH READ ONLY 不允许DML操作

Oracle8i以后创建视图可以用order by

3. 创建修改视图的例子
SQL> CREATE OR REPLACE VIEW salvu41 AS SELECT id, first_name FIRST,
last_name LAST, salary MONTHLY_SALARY
FROM s_emp WHERE dept_id = 41;
SQL> CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) AS SELECT d.name, MIN(e.salary), MAX(e.salary), AVG(e.salary) FROM s_emp e, s_dept d WHERE e.dept_id = d.id GROUP BY d.name;
注意: 如果用select * from table_name创建的视图
table_name的结构改变后 view要重建或compile后才能显示新的字段内容

4. 查询视图的数据字典
SQL> set long 1600;
SQL> select view_name,text from user_views;
说明: 可以根据视图text_length来设置set long 数字;
User_updatable_columns视图能查询视图里能被修改的字段

5. 简单和复杂的视图对比
特 性 简单视图 复杂视图
表的数量 一个 多个
有函数吗? 没有 有
有分组操作吗? 没有 有
有基于视图的DML操作吗? 有 没有

6. 在视图上可以用DML命令吗?
可以, 但有一定的限制条件
没有下面的情况, 可以删除view里的记录. group function, group by, distinct
没有上面和下面的情况, 可以修改view里的记录. 字段表达式,
例如: salary*12 含rownum的view
没有上面两种情况, 且view里含基表里所有非空字段的情况, 可以往view里插入记录.

7. 在视图里使用 WITH CHECK OPTION约束条件
SQL> create or replace view empvu41
as select * from s_emp where dept_id = 41
with check option constraint empvu41_ck;
如果运行下面命令会出错ora-01402
SQL> update empvu41 set dept_id=42 where id=16;
原因: 视图empvu41里规定只能看部门号为41的记录 修改后会把记录排除在视图empvu41以外
与它的约束条件冲突

8. 删除视图
SQL> DROP VIEW view_name;

十五、创建索引

1.索引的概念
索引是数据库里的一种数据对象
它利用B*树, hash, bitmap结构直接快速地访问数据
它和表是分开存放的两个实体
索引创建好了后, 由系统自动调用和管理

2. 什么时候创建索引?
自动创建的索引:唯一关键字, 唯一的约束条件
手工需要创建的索引:大表查询时, sql语句where后经常用到的字段或字段组合
字段内容差别很大有大量NULL值表很大, 返回记录数较少

3. B*树索引的结构 每个索引由字段值和指针或ROWID组成

4.创建索引的语法
CREATE INDEX 索引名 ON 表名 ( 字段1, [字段2, ……] ) TABLESPACE 表空间名;

5.创建索引的注意事项
创建索引时会加行级独占锁
一个表的索引最好不要超过三个 (特殊的大表除外)
最好用单字段索引
索引最好和表分不同的表空间存放
结合SQL语句的分析执行情况, 也可以建立多字段的组合索引和基于函数的索引
大表的索引会占用很大的存储空间
不要建唯一的索引, 而应该加唯一的约束条件

6.查询索引的方法
查询数据字典user_indexes和user_ind_columns

例子:
SQL> SELECT ic.index_name, ic.column_name,
2 ic.column_position col_pos,ix.uniqueness
3 FROM user_indexes ix, user_ind_columns ic
4 WHERE ic.index_name = ix.index_name
5 AND ic.table_name = 'S_EMP';

注意: 数据字典里存放的字符都是大写的.

7. 不用索引的地方
表很小
where后不经常使用的比较字段
表被频繁修改
返回记录数很多
where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件

8. 重建索引的语法
ALTER INDEX 索引名 REBUILD TABLESPACE 原来表空间名 NOLOGGING;
定期重建索引可以减少索引的碎片, 更有效地使用表空间.

9. 删除索引
SQL> drop index 索引名;
SQL> alter table 表名 drop constraint 约束名;

十六、控制用户访问
1.权限的类别
系统级权限: 针对整个系统操作的权限
如: 用户名/密码, 使用表空间的限额等
对象级权限: 针对某个具体object操作的权限
如: 针对某个表, 视图, 表的某个字段的select, update, delete权限
2. 查看当前数据库的用户信息
SQL>select username,default_tablespace,temporary_tablespace from dba_users;
查看在线用户信息
SQL>select count(*) “number”,username “current username” from v$session group by username; 用户查看自己的缺省表空间SQL>select username,default_tablespace from user_users;

3. 创建新用户
SQL> create user username identified by password
default tablespace tablespace_name temporary tablespace temp
quota unlimited on tablespace_name
quota 1k on system
[quota 1k on other_tablespace_name ……] ;
给用户赋权限
SQL> grant connect, resource to username;
查看当前用户的权限角色
SQL> select * from user_role_privs;
查看当前用户的系统权限和表级权限
SQL> select * from user_sys_privs;SQL> select * from user_tab_privs;

4 、常用的角色及其权限
CONNECT 8 privs 连上Oracle,做最基本操作
RESOURCE 8 privs 具有程序开发最的权限
DBA 114 privs 数据库管理员所有权限
EXP_FULL_DATABASE 5 privs 数据库整个备份输出的权限
IMP_FULL_DATABASE 64 privs 数据库整个备份输入的权限
查看角色明细的系统权限
SQL> select * from role_sys_privs;

5、改变老用户 可以改变老用户的密码, 缺省表空间, 临时表空间, 空间限额.
SQL> alter user username identified by password
default tablespace tablespace_name
temporary tablespace temp
quota unlimited on tablespace_name
quota 1k on system
[quota 1k on other_tablespace_name ……] ;
撤销用户的角色或权限
SQL> revoke role_name or priv_name from username;
注意事项
撤消用户的角色dba时, 同时撤消了用户unlimited tablespace的系统权限, 切记要再次赋予resource角色给此用户
SQL> grant resource to username;

6、删除用户
如果用户下没有任何数据对象
SQL> drop user username;
如果用户下有数据对象
SQL> drop user username cascade;
注意事项
如果用户下有含clob,blob字段的表, 应该先删除这些表后,才能用cascade选项完全删除.

7、角色的概念和管理
角色是命名多个相关权限的组合. 能把它赋于其它的用户或角色我们能创建角色, 使权限管理更容易一些.

8、赋于系统的权限语法和例子
语法:
SQL> GRANT sys_priv TO {user|role|PUBLIC} [WITH ADMIN OPTION];
例子:
SQL> GRANT create session TO sue, rich;
SQL> GRANT create table To scott, manager;

注意: 如果用WITH ADMIN OPTION通过中间用户赋于的系统权限 中间用户删除后, 系统权限仍然存在.

9、赋于数据对象级的权限语法和例子
语法:
SQL> GRANT object_priv [(columns)] ON object TO {user|role|PUBLIC} [WITH GRANT OPTION];
例子:
SQL> GRANT select ON s_emp TO sue, rich;
SQL> GRANT update (name, region_id)
ON s_dept TO scott, manager;

注意: 如果用WITH GRANT OPTION通过中间用户赋于的对象权限 中间用户删除后,对象权限就不存在了.

 
台球常用术语解释以及英文对照

死角球(ANGLED

当角袋边缘挡住了主球,使主球不能直接击打台面上的目标球,被称为死角球。

手中球(BALL IN HAND

在美式台球规则中,手中球的概念是主球可以摆放在比赛台面的任何地方。

活球(BALL ON

在斯诺克台球中,运动员可合法打一个彩色球(没有红球情况下)入袋,这颗彩球叫活球。

开球(BREAK

在美式台球的开球中,要求必须使四球碰岸,方被认为是合法开球。

手桥(BRIDGE

用于架住球杆和调整杆头瞄准方法的手,称为手桥。

指球(CALLED BALL

在美式台球中,运动员在击球前必须向裁判员指明(口头或用杆指出)所要击打的目标球是哪一颗。

定袋(CALLED POCKET

在美式台球中,运动员在击球前必须向裁判员指明(口头或用杆指出)要击入哪个球袋。

联合击法(COMBINATION

主球撞击目标球后,被主球撞击的目标球又去撞击其它目标球,并以此方法来击球入袋。

主球(CVE BALL

主球在比赛中,经常被杆击打的球,它是白色的并且无号码。

手中球置在开球线后(CVE BALL IN HAND THE HEAD STRINC

在美式台球中,主球被放在开球线与顶岸之间的任何地方。

岸(CUSHION

一种用织物包住的橡胶制品在球台台边内边沿上,并和它外部周围的木质物一起构成。

连击(DOUBLE HIT
在一次击球中,主球被杆头两次击打,称为双击。

侧旋球(ENGLISH

通过球杆头部击打主球的左右侧,产生出侧旋球。

薄击球(FEATHE SHOT

主球仅仅擦碰目标球,被称为薄击球。

得分(COUNT

一分或是成功的一击。

入球点(CONTACT POINT

主球撞击目标球入袋时,相碰目标球的位置,叫做入球点。

球杆(CVE

一种由木质材料造成的锥形体,并用其击打主球。

缩球击法(DRAW SHOT

主球被击下击点时,会产生下旋,当主球全击目标球后,便会向后方缩回。

跟进球击法(FOLLOW SHOT HAROUGH

当主球被击上部时,会产生向前旋转,当主球全击目标球,主球便会向前滚动。

随势出杆(FOLLOWTHROUGH

随势出杆是球杆击打主球后,球杆穿过原来主球所占位置范围的继续运行路线。

力度(TORCE

力量通过球杆打击主球,并导致球在旋转、反射角、分离角等方向产生变化。

犯规(FOUL

比赛中的一切违犯规则的行为。

犯规击球(FOUL STROKE

在击球时,发生违反规则行为。

自由球(FREE BALL

  在斯诺克台球比赛中,因犯规所导致的主球被做成障碍球,没犯规方队员可指定任何一个球作为自由球来打,打指定自由球入袋后,记活球分值,将自由球和活球同时打入袋,只记活球分值。彩球作为自由球被击入袋中,应把彩球放回置球点上。自由球不能做障碍球,否则犯规。但当剩下粉球和黑球时除外。

(FRAME)
从开球开始,直至击落所有的球或打满规定的分数,称为一盘。

局(GAME

若干盘比赛构成一局。

场(MATCH

由若干局构成决定胜负的比赛,称为场。

跳击(JUMP SHOT

使主球或者目标球弹起台面的击球。

跳球(JUMPED BALL

球离开比赛台面或者球以跳起方式越过其它的球。

吻击(KISS SHOT

主球碰击多于一个目标球,这种击法叫吻击。

碰岸比近(LAG FOR BREAK
双方运动员将球从开球线后击出去碰对岸返回,并力图使返回的球尽可能地靠近岸边。通过比近来决定开球权。

冻结(FROZEN

一个球与其它球或台边相贴。

滑杆(MISCUE

球杆打主球时,由于打滑导致失误。通常由于没有打在主球击点安全区内,或由于杆头没有打滑粉所致。

空杆(MISS

在斯诺克比赛中,空杆是指击球手没有尽自己最大能力去击中台球。在一般台球赛中,空杆的意思是失误的一击。

自然侧旋(NATURAL ENGLISH

一个适度的侧旋的主球,便于有一个所需的行进路线。

自然上旋(NATURAL ROLL

主球不带着侧旋的运动。

目标球(OBJECT BALLS

被主球击打的球。

开局击球(OPENING BREAK SHOT

一盘比赛中第一杆击球。

落袋(POT

在斯诺克台球中,一个目标球进袋称为“落袋”。

推击(PUSH SHOT

杆头持续也碰击主球。

抢局

预先确定的决定比赛胜负所必需赢的局数。比如比赛定为2111胜制,便可称为抢11避。当一方赢得比赛的11局后,比赛便结束。

杆架(REST

一种由木与铜制成的架杆器具。

单循环赛(ROUND ROBIN

在一次比赛中,每一参赛队员互相之间均进行一次比赛。

得分(RUN

一个队员在一次击球中所赢得的积分。

安全球(SAFETY

被击主球落入球袋。

自落(SCRATCH

被击主球落入球袋。

击球(STROKE

所谓击球是指用杆头迅速击打主球,并以主球和比赛中所有的球停止滚动和旋转为结束。

SINGL ELIMINATION
比赛的一种方法,一位参赛选手输一场比赛后即被淘汰出局。

障碍球(SNOOKERED

在斯诺克台球比赛中,所谓障碍球是指主球不能以直线球去击打一个活球,其线路被非活球阻挡。

击球员(STROKER

运动员开始击球,在一击球或一杆球结束之前,即在裁判员宣布“失机”或“犯规”之前,此运动员保持着击球员的资格。

一击球(STROKE

运动员用杆头打主球,为一击球。

一杆球(BREAIC

在斯诺克比赛中,击球运动员从击球得分开始,直至击球因失机或犯规止,这一杆连续击分称之为一杆球。

占位(OCCUPIED

当被打球入袋或出界后,需要放回该球的置球点时,有其它球将此点占据。

失机(LOSS OF CHANGE

当运动员正常击球,但没有击球入袋或得分,即为“失机”。

扎杆(PRICK STROKE

将球杆斜向或几乎与台面垂直直击主球,称为“扎杆”。

定位球(STOP SHOT

当主球撞击目标球后,主球停在原目标球的位置上不动。

贴球(TOUCHING BALL台面上球完全静止后,主球与其它球相贴,即为贴球。

 
b/s开发常用javaScript技术
一、验证类
1、数字验证内
1.1 整数
1.2 大于0的整数 (用于传来的ID的验证)
1.3 负整数的验证
1.4 整数不能大于iMax
1.5 整数不能小于iMin
2、时间类
2.1 短时间,形如 (13:04:06)
2.2 短日期,形如 (2003-12-05)
2.3 长时间,形如 (2003-12-05 13:04:06)
2.4 只有年和月。形如(2003-05,或者2003-5)
2.5 只有小时和分钟,形如(12:03)
3、表单类
3.1 所有的表单的值都不能为空
3.2 多行文本框的值不能为空。
3.3 多行文本框的值不能超过sMaxStrleng
3.4 多行文本框的值不能少于sMixStrleng
3.5 判断单选框是否选择。
3.6 判断复选框是否选择.
3.7 复选框的全选,多选,全不选,反选
3.8 文件上传过程中判断文件类型
4、字符类
4.1 判断字符全部由a-Z或者是A-Z的字字母组成
4.2 判断字符由字母和数字组成。
4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
4.4 字符串替换函数.Replace();
5、浏览器类
5.1 判断浏览器的类型
5.2 判断ie的版本
5.3 判断客户端的分辨率

6、结合类
6.1 email的判断。
6.2 手机号码的验证
6.3 身份证的验证


二、功能类

1、时间与相关控件类
1.1 日历
1.2 时间控件
1.3 万年历
1.4 显示动态显示时钟效果(文本,如OA中时间)
1.5 显示动态显示时钟效果 (图像,像手表)
2、表单类
2.1 自动生成表单
2.2 动态添加,修改,删除下拉框中的元素
2.3 可以输入内容的下拉框
2.4 多行文本框中只能输入iMax文字。如果多输入了,自动减少到iMax个文字(多用于短信发送)

3、打印类
3.1 打印控件
4、事件类
4.1 屏蔽右键
4.2 屏蔽所有功能键
4.3 --> 和<-- F5 F11,F9,F1
4.4 屏蔽组合键ctrl+N
5、网页设计类
5.1 连续滚动的文字,图片(注意是连续的,两段文字和图片中没有空白出现)
5.2 html编辑控件类
5.3 颜色选取框控件
5.4 下拉菜单
5.5 两层或多层次的下拉菜单
5.6 仿IE菜单的按钮。(效果如rongshuxa.com的导航栏目)
5.7 状态栏,title栏的动态效果(例子很多,可以研究一下)
5.8 双击后,网页自动滚屏
6、树型结构。
6.1 asp+SQL版
6.2 asp+xml+sql版
6.3 java+sql或者java+sql+xml
7、无边框效果的制作
8、连动下拉框技术
9、文本排序

一、验证类
1、数字验证内
1.1 整数
/^(-|/+)?/d+$/.test(str)
1.2 大于0的整数 (用于传来的ID的验证)
/^/d+$/.test(str)
1.3 负整数的验证
/^-/d+$/.test(str)
2、时间类
2.1 短时间,形如 (13:04:06)
function isTime(str)
{
var a = str.match(/^(/d{1,2})(:)?(/d{1,2})/2(/d{1,2})$/);
if (a == null) {alert('输入的参数不是时间格式'); return false;}
if (a[1]>24 || a[3]>60 || a[4]>60)
{
alert("时间格式不对");
return false
}
return true;
}
2.2 短日期,形如 (2003-12-05)
function strDateTime(str)
{
var r = str.match(/^(/d{1,4})(-|//)(/d{1,2})/2(/d{1,2})$/);
if(r==null)return false;
var d= new Date(r[1], r[3]-1, r[4]);
return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]);
}
2.3 长时间,形如 (2003-12-05 13:04:06)
function strDateTime(str)
{
var reg = /^(/d{1,4})(-|//)(/d{1,2})/2(/d{1,2}) (/d{1,2}):(/d{1,2}):(/d{1,2})$/;
var r = str.match(reg);
if(r==null)return false;
var d= new Date(r[1], r[3]-1,r[4],r[5],r[6],r[7]);
return (d.getFullYear()==r[1]&&(d.getMonth()+1)==r[3]&&d.getDate()==r[4]&&d.getHours()==r[5]&&d.getMinutes()==r[6]&&d.getSeconds()==r[7]);
}
2.4 只有年和月。形如(2003-05,或者2003-5)
2.5 只有小时和分钟,形如(12:03)
3、表单类
3.1 所有的表单的值都不能为空
<input onblur="if(this.value.replace(/^/s+|/s+$/g,'')=='')alert('不能为空!')">
3.2 多行文本框的值不能为空。
3.3 多行文本框的值不能超过sMaxStrleng
3.4 多行文本框的值不能少于sMixStrleng
3.5 判断单选框是否选择。
3.6 判断复选框是否选择.
3.7 复选框的全选,多选,全不选,反选
3.8 文件上传过程中判断文件类型
4、字符类
4.1 判断字符全部由a-Z或者是A-Z的字字母组成
<input onblur="if(/[^a-zA-Z]/g.test(this.value))alert('有错')">
4.2 判断字符由字母和数字组成。
<input onblur="if(/[^0-9a-zA-Z]/g.test(this.value))alert('有错')">
4.3 判断字符由字母和数字,下划线,点号组成.且开头的只能是下划线和字母
/^([a-zA-z_]{1})([/w]*)$/g.test(str)
4.4 字符串替换函数.Replace();
5、浏览器类
5.1 判断浏览器的类型
window.navigat or.appName
5.2 判断ie的版本
window.navigat or.appVersion
5.3 判断客户端的分辨率
window.screen.height; window.screen.width;

6、结合类
6.1 email的判断。
function ismail(mail)
{
return(new RegExp(/^/w+((-/w+)|(/./w+))*/@[A-Za-z0-9]+((/.|-)[A-Za-z0-9]+)*/.[A-Za-z0-9]+$/).test(mail));
}
6.2 手机号码的验证
6.3 身份证的验证
function isIdCardNo(num)
{
if (isNaN(num)) {alert("输入的不是数字!"); return false;}
var len = num.length, re;
if (len == 15)
re = new RegExp(/^(/d{6})()?(/d{2})(/d{2})(/d{2})(/d{3})$/);
else if (len == 18)
re = new RegExp(/^(/d{6})()?(/d{4})(/d{2})(/d{2})(/d{3})(/d)$/);
else {alert("输入的数字位数不对!"); return false;}
var a = num.match(re);
if (a != null)
{
if (len==15)
{
var D = new Date("19"+a[3]+"/"+a[4]+"/"+a[5]);
var B = D.getYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
}
else
{
var D = new Date(a[3]+"/"+a[4]+"/"+a[5]);
var B = D.getFullYear()==a[3]&&(D.getMonth()+1)==a[4]&&D.getDate()==a[5];
}
if (!B) {alert("输入的身份证号 "+ a[0] +" 里出生日期不对!"); return false;}
}
return true;
}

3.7 复选框的全选,多选,全不选,反选
<f orm name=hrong>
<input type=checkbox name=All onclick="checkAll('mm')">全选<br/>
<input type=checkbox name=mm onclick="checkItem('All')"><br/>
<input type=checkbox name=mm onclick="checkItem('All')"><br/>
<input type=checkbox name=mm onclick="checkItem('All')"><br/>
<input type=checkbox name=mm onclick="checkItem('All')"><br/>
<input type=checkbox name=mm onclick="checkItem('All')"><br/><br/>

<input type=checkbox name=All2 onclick="checkAll('mm2')">全选<br/>
<input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
<input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
<input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
<input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>
<input type=checkbox name=mm2 onclick="checkItem('All2')"><br/>

</f orm>

<SCRIPT LANGUAGE="java script">
function checkAll(str)
{
var a = document.getElementsByName(str);
var n = a.length;
f or (var i=0; i<n; i++)
a[i].checked = window.event.srcElement.checked;
}
function checkItem(str)
{
var e = window.event.srcElement;
var all = eval("document.hrong."+ str);
if (e.checked)
{
var a = document.getElementsByName(e.name);
all.checked = true;
f or (var i=0; i<a.length; i++)
{
if (!a[i].checked){ all.checked = false; break;}
}
}
else all.checked = false;
}
</SCRIPT>

3.8 文件上传过程中判断文件类型
<input type=file onchange="alert(this.value.match(/^(.*)(/.)(.{1,8})$/)[3])">

画图:
<OBJECT
id=S
style="LEFT: 0px; WIDTH: 392px; TOP: 0px; HEIGHT: 240px"
height=240
width=392
classid="clsid:369303C2-D7AC-11D0-89D5-00A0C90833E6">
</OBJECT>
<SCRIPT>
S.DrawingSurface.ArcDegrees(0,0,0,30,50,60);
S.DrawingSurface.ArcRadians(30,0,0,30,50,60);
S.DrawingSurface.Line(10,10,100,100);
</SCRIPT>

写注册表:
<SCRIPT>
var WshShell = WScript.CreateObject("WScript.Shell");
WshShell.RegWrite ("HKCU//Software//ACME//F ortuneTeller//", 1, "REG_BINARY");
WshShell.RegWrite ("HKCU//Software//ACME//F ortuneTeller//MindReader", "Goocher!", "REG_SZ");
var bKey = WshShell.RegRead ("HKCU//Software//ACME//F ortuneTeller//");
WScript.Echo (WshShell.RegRead ("HKCU//Software//ACME//F ortuneTeller//MindReader"));
WshShell.RegDelete ("HKCU//Software//ACME//F ortuneTeller//MindReader");
WshShell.RegDelete ("HKCU//Software//ACME//F ortuneTeller//");
WshShell.RegDelete ("HKCU//Software//ACME//");
</SCRIPT>

TABLAE相关(客户端动态增加行列)
<HTML>
<SCRIPT LANGUAGE="JScript">
function numberCells() {
var count=0;
f or (i=0; i < document.all.mytable.rows.length; i++) {
f or (j=0; j < document.all.mytable.rows(i).cells.length; j++) {
document.all.mytable.rows(i).cells(j).innerText = count;
count++;
}
}
}
</SCRIPT>
<BODY onload="numberCells()">
<TABLE id=mytable b order=1>
<TR><TH>&nbsp;</TH><TH>&nbsp;</TH><TH>&nbsp;</TH><TH>&nbsp;</TH></TR>
<TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>
<TR><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>
</TABLE>
</BODY>
</HTML>

1.身份证严格验证:

<script>
var aCity={11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"}

function cidInfo(sId){
var iSum=0
var info=""
if(!/^/d{17}(/d|x)$/i.test(sId))return false;
sId=sId.replace(/x$/i,"a");
if(aCity[parseInt(sId.substr(0,2))]==null)return "Err or:非法地区";
sBirthday=sId.substr(6,4)+"-"+Number(sId.substr(10,2))+"-"+Number(sId.substr(12,2));
var d=new Date(sBirthday.replace(/-/g,"/"))
if(sBirthday!=(d.getFullYear()+"-"+ (d.getMonth()+1) + "-" + d.getDate()))return "Err or:非法生日";
f or(var i = 17;i>=0;i --) iSum += (Math.pow(2,i) % 11) * parseInt(sId.charAt(17 - i),11)
if(iSum%11!=1)return "Err or:非法证号";
return aCity[parseInt(sId.substr(0,2))]+","+sBirthday+","+(sId.substr(16,1)%2?"男":"女")
}

document.write(cidInfo("380524198002300016"),"<br/>");
document.write(cidInfo("340524198002300019"),"<br/>")
document.write(cidInfo("340524197711111111"),"<br/>")
document.write(cidInfo("34052419800101001x"),"<br/>");
</script>

2.验证IP地址
<SCRIPT LANGUAGE="java script">
function isip(s){
var check=function(v){try{return (v<=255 && v>=0)}catch(x){return false}};
var re=s.split(".")
return (re.length==4)?(check(re[0]) && check(re[1]) && check(re[2]) && check(re[3])):false
}

var s="202.197.78.129";
alert(isip(s))
</SCRIPT>



3.加sp1后还能用的无边框窗口!!
<HTML XMLNS:IE>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<IE:Download ID="include" STYLE="behavi or:url(#default#download)" />
<title>Chromeless Window</title>

<SCRIPT LANGUAGE="JScript">
/*--- Special Thanks F or andot ---*/

/*
This following code are designed and writen by Windy_sk <seasonx@163.net>
You can use it freely, but u must held all the copyright items!
*/

/*--- Thanks F or andot Again ---*/

var CW_width = 400;
var CW_height = 300;
var CW_top = 100;
var CW_left = 100;
var CW_url = "/";
var New_CW = window.createPopup();
var CW_Body = New_CW.document.body;
var content = "";
var CSStext = "margin:1px;col or:black; b order:2px outset;b order-style:expression(onmouseout=onmouseup=function(){this.style.b orderStyle='outset'}, onmousedown=function(){if(event.button!=2)this.style.b orderStyle='inset'});background-col or:buttonface;width:16px;height:14px;font-size:12px;line-height:11px;curs or:Default;";

//Build Window
include.startDownload(CW_url, function(source){content=source});

function insert_content(){
var temp = "";
CW_Body.style.overflow = "hidden";
CW_Body.style.backgroundCol or = "white";
CW_Body.style.b order = "solid black 1px";
content = content.replace(/<a ([^>]*)>/g,"<a onclick='parent.open(this.href);return false' $1>");
temp += "<table width=100% height=100% cellpadding=0 cellspacing=0 b order=0>";
temp += "<tr style=';font-size:12px;background:#0099CC;height:20;curs or:default' ondblclick=/"Max.innerText=Max.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();/" onmouseup='parent.drag_up(event)' onmousemove='parent.drag_move(event)' onmousedown='parent.drag_down(event)' onselectstart='return false' oncontextmenu='return false'>";
temp += "<td style='col or:#ffffff;padding-left:5px'>Chromeless Window F or IE6 SP1</td>";
temp += "<td style='col or:#ffffff;padding-right:5px;' align=right>";
temp += "<span id=Help onclick=/"alert('Chromeless Window F or IE6 SP1 - Ver 1.0//n//nCode By Windy_sk//n//nSpecial Thanks F or andot')/" style=/""+CSStext+"font-family:System;padding-right:2px;/">?</span>";
temp += "<span id=Min onclick='parent.New_CW.hide();parent.blur()' style=/""+CSStext+"font-family:Webdings;/" title='Minimum'>0</span>";
temp += "<span id=Max onclick=/"this.innerText=this.innerText=='1'?'2':'1';parent.if_max=!parent.if_max;parent.show_CW();/" style=/""+CSStext+"font-family:Webdings;/" title='Maximum'>1</span>";
temp += "<span id=Close onclick='parent.opener=null;parent.close()' style=/""+CSStext+"font-family:System;padding-right:2px;/" title='Close'>x</span>";
temp += "</td></tr><tr><td colspan=2>";
temp += "<div id=include style='overflow:scroll;overflow-x:hidden;overflow-y:auto; HEIGHT: 100%; width:"+CW_width+"'>";
temp += content;
temp += "</div>";
temp += "</td></tr></table>";
CW_Body.innerHTML = temp;
}

setTimeout("insert_content()",1000);

var if_max = true;
function show_CW(){
window.moveTo(10000, 10000);
if(if_max){
New_CW.show(CW_top, CW_left, CW_width, CW_height);
if(typeof(New_CW.document.all.include)!="undefined"){
New_CW.document.all.include.style.width = CW_width;
New_CW.document.all.Max.innerText = "1";
}

}else{
New_CW.show(0, 0, screen.width, screen.height);
New_CW.document.all.include.style.width = screen.width;
}
}

window.onfocus = show_CW;
window.onresize = show_CW;

// Move Window
var drag_x,drag_y,draging=false

function drag_move(e){
if (draging){
New_CW.show(e.screenX-drag_x, e.screenY-drag_y, CW_width, CW_height);
return false;
}
}

function drag_down(e){
if(e.button==2)return;
if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height)return;
drag_x=e.clientX;
drag_y=e.clientY;
draging=true;
e.srcElement.setCapture();
}

function drag_up(e){
draging=false;
e.srcElement.releaseCapture();
if(New_CW.document.body.offsetWidth==screen.width && New_CW.document.body.offsetHeight==screen.height) return;
CW_top = e.screenX-drag_x;
CW_left = e.screenY-drag_y;
}

</SCRIPT>
</HTML>

电话号码的验证

要求:
  (1)电话号码由数字、"("、")"和"-"构成
  (2)电话号码为3到8位
  (3)如果电话号码中包含有区号,那么区号为三位或四位
  (4)区号用"("、")"或"-"和其他部分隔开
  (5)移动电话号码为11或12位,如果为12位,那么第一位为0
  (6)11位移动电话号码的第一位和第二位为"13"
  (7)12位移动电话号码的第二位和第三位为"13"
  根据这几条规则,可以与出以下正则表达式:
  (^[0-9]{3,4}/-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^/([0-9]{3,4}/)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)

<script language="java script">
function PhoneCheck(s) {
var str=s;
var reg=/(^[0-9]{3,4}/-[0-9]{3,8}$)|(^[0-9]{3,8}$)|(^/([0-9]{3,4}/)[0-9]{3,8}$)|(^0{0,1}13[0-9]{9}$)/
alert(reg.test(str));
}
</script>
<input type=text name="iphone">
<input type=button onclick="PhoneCheck(document.all.iphone.value)" value="/blog/Check">

具有在输入非数字字符不回显的效果,即对非数字字符的输入不作反应。
function numbersonly(field,event){
var key,keychar;
if(window.event){
key = window.event.keyCode;
}
else if (event){
key = event.which;
}
else{
return true
}
keychar = String.fromCharCode(key);
if((key == null)||(key == 0)||(key == 8)||(key == 9)||(key == 13)||(key == 27)){
return true;
}
else if(("0123456789.").indexOf(keychar)>-1){
window.status = "";
return true;
}
else {
window.status = "Field excepts numbers only";
return false;
}
}

验证ip

str=document.RegExpDemo.txtIP.value;
if(/^(/d{1,3})/.(/d{1,3})/.(/d{1,3})/.(/d{1,3})$/.test(str)==false)
{
window.alert('错误的IP地址格式');
document.RegExpDemo.txtIP.select();
document.RegExpDemo.txtIP.focus();
return;
}
if(RegExp.$1<1 || RegExp.$1>254||RegExp.$2<0||RegExp.$2>254||RegExp.$3<0||RegExp.$3>254||RegExp.$4<1||RegExp.$4>254)
{
window.alert('错误的IP地址');
document.RegExpDemo.txtIP.select();
document.RegExpDemo.txtIP.focus();
return;
}
//剔除 如 010.020.020.03 前面 的0
var str=str.replace(/0(/d)/g,"$1");
str=str.replace(/0(/d)/g,"$1");
window.alert(str);

//一下是取数据的类
//Obj参数指定数据的来源(限定Table),默认第一行为字段名称行
//GetTableData类提供MoveNext方法,参数是表的行向上或向下移动的位数,正数向下移动,负数向上.
//GetFieldData方法获得指定的列名的数据
//S ort_desc方法对指定的列按降序排列
//S ort_asc方法对指定的列按升序排列
//GetData方法返回字段值为特定值的数据数组,提供数据,可以在外部进行其他处理
//Delete方法删除当前记录,数组减少一行
//初始化,Obj:table的名字,Leftlen:左面多余数据长度,Rightlen:右面多余数据长度,
function GetTableData(Obj,LeftLen,RightLen){
var MyObj=document.all(Obj);
var iRow=MyObj.rows.length;
var iLen=MyObj.rows[0].cells.length;
var i,j;

TableData=new Array();
f or (i=0;i< iRow;i++){
TableData[i]=new Array();
f or (j=0;j<iLen;j++){
TableStr=MyObj.rows(i).cells(j).innerText;
TableStr=TableStr.substring(LeftLen, TableStr.length-RightLen).Trim();
TableStr=TableStr.replace(/ /gi,"").replace(//r/n/ig,"");
TableData[i][j]=TableStr;
}
}

this.TableData=TableData;
this.cols=this.TableData[0].length;
this.rows=this.TableData.length;
this.rowindex=0;
}

function movenext(Step){
if (this.rowindex>=this.rows){
return
}

if (Step=="" || typeof(Step)=="undefined") {
if (this.rowindex<this.rows-1)
this.rowindex++;
return;

}
else{
if (this.rowindex + Step<=this.rows-1 && this.rowindex + Step>=0 ){
this.rowindex=this.rowindex + Step;
}
else
{
if (this.rowindex + Step<0){
this.rowindex= 0;
return;
}
if (this.rowindex + Step>this.rows-1){
this.rowindex= this.rows-1;
return;
}
}
}
}

function getfielddata(Field){
var colindex=-1;
var i=0;
if (typeof(Field) == "number"){
colindex=Field;
}
else
{
f or (i=0;i<this.cols && this.rowindex<this.rows ;i++){
if (this.TableData[0][i]==Field){
colindex=i;
break;
}
}
}
if (colindex!=-1) {
return this.TableData[this.rowindex][colindex];
}

}



function s ort_desc(){//降序
var colindex=-1;
var highindex=-1;
desc_array=new Array();
var i,j;
f or (n=0; n<arguments.length; n++){
Field=arguments[arguments.length-1-n];
f or (i=0;i<this.cols;i++){
if (this.TableData[0][i]==Field){
colindex=i;
break;
}
}
if ( colindex==-1 )
return;
else
{
desc_array[0]=this.TableData[0];
f or(i=1;i<this.rows;i++){
desc_array[i]=this.TableData[1];
highindex=1;
f or(j=1;j<this.TableData.length;j++){
if (desc_array[i][colindex]<this.TableData[j][colindex]){
desc_array[i]=this.TableData[j];
highindex=j;
}

}
if (highindex!=-1)
this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));
}
}


this.TableData=desc_array;
}
return;
}



function s ort_asc(){//升序
var colindex=-1;
var highindex=-1;
var i,j;
f or (n=0; n<arguments.length; n++){
asc_array=new Array();
Field=arguments[arguments.length-1-n];
f or (i=0;i<this.cols;i++){
if (this.TableData[0][i]==Field){
colindex=i;
break;
}
}
if ( colindex==-1 )
return;
else
{
asc_array[0]=this.TableData[0];
f or(i=1;i<this.rows;i++){
asc_array[i]=this.TableData[1];
highindex=1;
f or(j=1;j<this.TableData.length;j++){//找出最小的列值
if (asc_array[i][colindex]>this.TableData[j][colindex]){
asc_array[i]=this.TableData[j];
highindex=j;

}

}
if (highindex!=-1)
this.TableData=this.TableData.slice(0,highindex).concat(this.TableData.slice(highindex+1,this.TableData.length));

}
}


this.TableData=asc_array;
}
return;
}



function getData(Field,FieldValue){
var colindex=-1;
var i,j;

GetData=new Array();
if (typeof(Field)=="undefined" || typeof(FieldValue)=="undefined" ){
return this.TableData;
}

f or(j=0;j<this.cols;j++){
if (this.TableData[0][j]==Field){
colindex=j;
}
}
if (colindex!=-1){

f or(i=1;i<this.rows;i++){
if (this.TableData[i][colindex]==FieldValue){
GetData[i]=new Array();
GetData[i]=this.TableData[i];
}
}
}
return GetData;
}
function DeletE(){
this.TableData=this.TableData.slice(0,this.rowindex).concat(this.TableData.slice(this.rowindex+1,this.TableData.length));
this.rows=this.TableData.length;
return;
}
function updateField(Field,FieldValue){
var colindex=-1;
var i=0;
if (typeof(Field) == "number"){
colindex=Field;
}
else
{
f or (i=0;i<this.cols && this.rowindex<this.rows ;i++){
if (this.TableData[0][i]==Field){
colindex=i;
break;
}
}
}
if (colindex!=-1) {
this.TableData[this.rowindex][colindex]=FieldValue;
}

}
function movefirst(){
this.rowindex=0;
}
function movelast(){
this.rowindex=this.rows-1;
}
function String.prototype.Trim() {return this.replace(/(^/s*)|(/s*$)/g,"");}
GetTableData.prototype.MoveNext = movenext;
GetTableData.prototype.GetFieldData = getfielddata;
GetTableData.prototype.S ort_asc = s ort_asc;
GetTableData.prototype.S ort_desc = s ort_desc;
GetTableData.prototype.GetData = getData;
GetTableData.prototype.Delete = DeletE;
GetTableData.prototype.UpdateField = updateField;
GetTableData.prototype.MoveFirst = movefirst;

具体的例子:http://202.119.73.208/NetEAn/com/test/jsprint.htm

在每个文本框的onblur事件中调用校验代码,并且每个文本框中onKeyDown事件中写一个enter转tab函数

//回车键换为tab
function enterToTab()
{
if(event.srcElement.type != 'button' && event.srcElement.type != 'textarea'
&& event.keyCode == 13)
{
event.keyCode = 9;
}
}

有时候还需要自由编辑表格---
给大家一个自由编辑表格的小例子,写的有点乱,呵呵:)

//===============================start================================

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=gb2312">
<TITLE>测试修改表格</TITLE>
<STYLE>
/*提示层的样式*/
div
{
BORDER-RIGHT: #80c144 1px solid;
BORDER-TOP: #80c144 1px solid;
VISIBILITY: hidden;
BORDER-LEFT: #80c144 1px solid;
CURSOR: default;
LINE-HEIGHT: 20px;
BORDER-BOTTOM: #80c144 1px solid;
FONT-FAMILY: 宋体;
font-size:12px;
POSITION: absolute;
BACKGROUND-COLOR: #f6f6f6;
TOP:30px;
LEFT:30px;
}
/*tr的样式*/
tr
{
font-family: "宋体";
col or: #000000;
background-col or: #C1DBF5;
font-size: 12px
}
/*table脚注样式*/
.TrFoot
{
FONT-SIZE: 12px;
font-family:"宋体", "Verdana", "Arial";
BACKGROUND-COLOR: #6699CC;
COLOR:#FFFFFF;
height: 25;
}
/*trhead属性*/
.TrHead
{
FONT-SIZE: 13px;
font-family:"宋体", "Verdana", "Arial";
BACKGROUND-COLOR: #77AADD;
COLOR:#FFFFFF;
height: 25;
}
/*文本框样式*/
INPUT
{
BORDER-COLOR: #AACEF7 #AACEF7 #AACEF7 #AACEF7;
BORDER-RIGHT: 1px solid;
BORDER-TOP: 1px solid;
BORDER-LEFT: 1px solid;
BORDER-BOTTOM: 1px solid;
FONT-SIZE: 12px;
FONT-FAMILY: "宋体","Verdana";
col or: #000000;
BACKGROUND-COLOR: #E9EFF5;
}
/*button样式*/
button
{
BORDER-COLOR: #AACEF7 #AACEF7 #AACEF7 #AACEF7;
BACKGROUND-COLOR: #D5E4F3;
CURSOR: hand;
FONT-SIZE:12px;
BORDER-RIGHT: 1px solid;
BORDER-TOP: 1px solid;
BORDER-LEFT: 1px solid;
BORDER-BOTTOM: 1px solid;
COLOR: #000000;
}
</STYLE>
</HEAD>
<BODY>
<SCRIPT language = "java script">
<!--全局变量
//标志位,值为false代表未打开一个编辑框,值为true为已经打开一个编辑框开始编辑
var editer_table_cell_tag = false;
//开启编辑功能标志,值为true时为允许编辑
var run_edit_flag = false;
//-->
</SCRIPT>

<SCRIPT language = "java script">
<!--
/**
* 编辑表格函数
* 单击某个单元格可以对里面的内容进行自由编辑
* @para tableID 为要编辑的table的id
* @para noEdiID 为不要编辑的td的ID,比如说table的标题
* 可以写为<TD id="no_editer">自由编辑表格</TD>
* 此时该td不可编辑
*/
function editerTableCell(tableId,noEdiId)
{
var tdObject = event.srcElement;
var tObject = ((tdObject.parentNode).parentNode).parentNode;
if(tObject.id == tableId &&tdObject.id != noEdiId&&editer_table_cell_tag == false && run_edit_flag == true)
{
tdObject.innerHTML = "<input type=text id=edit_table_txt name=edit_table_txt value="/blog/+tdObject.innerText+" size='15' onKeyDown='enterToTab()'> <input type=button value=' 确定 ' onclick='certainEdit()'>";
edit_table_txt.focus();
edit_table_txt.select();
editer_table_cell_tag = true;
//修改按钮提示信息
editTip.innerText = "请先点确定按钮确认修改!";
}
else
{
return false;
}
}

/**
* 确定修改
*/
function certainEdit()
{
var bObject = event.srcElement;
var tdObject = bObject.parentNode;
var txtObject = tdObject.firstChild;
tdObject.innerHTML = txtObject.value;
//代表编辑框已经关闭
editer_table_cell_tag = false;
//修改按钮提示信息
editTip.innerText = "请单击某个单元格进行编辑!";
}

function enterToTab()
{
if(event.srcElement.type != 'button' && event.srcElement.type != 'textarea'
&& event.keyCode == 13)
{
event.keyCode = 9;
}
}

/**
* 控制是否编辑
*/
function editStart()
{
if(event.srcElement.value == "开始编辑")
{
event.srcElement.value = "编辑完成";
run_edit_flag = true;
}
else
{
//如果当前没有编辑框,则编辑成功,否则,无法提交
//必须按确定按钮后才能正常提交
if(editer_table_cell_tag == false)
{
alert("编辑成功结束!");
event.srcElement.value = "开始编辑";
run_edit_flag = false;
}
}
}

/**
* 根据不同的按钮提供不同的提示信息
*/
function showTip()
{
if(event.srcElement.value == "编辑完成")
{
editTip.style.top = event.y + 15;
editTip.style.left = event.x + 12;
editTip.style.visibility = "visible";
}
else
{
editTip.style.visibility = "hidden";
}
}
-->
</SCRIPT>
<TABLE id="editer_table" width="100%" align="center"
onclick="editerTableCell('editer_table','no_editer')">
<TR class="TrHead">
<TD colspan="3" align="center" id="no_editer">自由编辑表格</TD>
</TR>
<TR>
<TD width="33%">单击开始编辑按钮,然后点击各单元格编辑</TD>
<TD width="33%">2</TD>
<TD width="33%">3</TD>
</TR>
<TR>
<TD width="33%">4</TD>
<TD width="33%">5</TD>
<TD width="33%">6</TD>
</TR>
<TR>
<TD width="33%">one</TD>
<TD width="33%">two</TD>
<TD width="33%">three</TD>
</TR>
<TR>
<TD width="33%">four</TD>
<TD width="33%">five</TD>
<TD width="33%">six</TD>
</TR>
<TR class="TrFoot">
<TD colspan="3" align="center" id="no_editer">
<INPUT type="button" class="bt" value="开始编辑" onClick="editStart()" onMouseOver="showTip()" onMouseMove="showTip()" onMouseOut="editTip.style.visibility = 'hidden';">
</TD>
</TR>
</TABLE>
</BODY>
<DIV id="editTip">请单击某个单元格进行编辑!</DIV>
</HTML>
 
图片加水印
加图片水印:
System.Drawing.Image image
image=System.Drawing.Image.FromFile(path);
    System.Drawing.Image copyImage = System.Drawing.Image.FromFile( Server.MapPath("upload//126.JPG") );
    Graphics g = Graphics.FromImage(image);
    g.DrawImage(copyImage, new Rectangle(0,0, copyImage.Width, copyImage.Height),  0, 0,  copyImage.Width, copyImage.Height, GraphicsUnit.Pixel);
    g.Dispose();
    image.Save(Server.MapPath(newPath)+System.DateTime.Now.ToString("yyyyMMddHmmss")+exName);
    image.Dispose();
 
加文字水印:
   image=System.Drawing.Image.FromFile(path);
   Graphics g= Graphics.FromImage(image);
   newimage=image.GetThumbnailImage(smallImage_Width,smallImage_Height,callb,new System.IntPtr());
   Font f=new Font(watermark_text_FontName,watermark_text_FontSize,FontStyle.Bold);
   SolidBrush b=new SolidBrush(Color.Red);
   g.DrawString(watermark_text,f,b,10,10);
   g.Dispose();
   image.Save(httpcontent.Server.MapPath(newPath)+System.DateTime.Now.ToString("yyyyMMddHmmss")+exName );
 
GridView的小技巧(1)--如何实现鼠标划过改变GridView的行背景色

写一些简单的小技巧也许可以帮助大家把GridView用的更好,让GridView变得更漂亮更实用,大家都见过导航行栏上的这种效果,当鼠标停留在一个栏目上面,栏目的背景色就会改变,当鼠标移开栏目的背景色又还原回来,想想我们可以把这个效果用在GridView 上面,当我们把鼠标停留在记录行上面,背景颜色就改变,当我把鼠标移开的时候背景颜色就还原,下面我们就来看看怎么实现吧。

首先我们要先导入System.Drawing这个命名空间,接下来我们要编写GridView中的RowDataBound方法,看下面的代码:
   protected void gvType_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        int i;
        //执行循环,保证每条数据都可以更新
        for (i = 0; i < gvType.Rows.Count; i++)
        {
            //首先判断是否是数据行
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //当鼠标停留时更改背景色
                e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;this.style.backgroundColor='#00A9FF'");
                //当鼠标移开时还原背景色
                e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c");
            }
        }
    }

这样就可以简单实现我们所要的效果,是不是很简单。
大家如果有更好的方法可以写在评论里面,必定实现的方法不只一种。

 
HTTP状态码及其含义
下表显示了常见的HTTP 1.1状态代码以及它们对应的状态信息和含义。 
    应当谨慎地使用那些只有HTTP 1.1支持的状态代码,因为许多浏览器还只能够支持HTTP 1.0。如果你使用了HTTP 1.1特有的状态代码,最好能够检查一下请求的HTTP版本号。 
状态代码  状态信息  含义  
100  Continue  初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)  
101  Switching Protocols  服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)  
200  OK  一切正常,对GET和POST请求的应答文档跟在后面。 
201  Created  服务器已经创建了文档,Location头给出了它的URL。  
202  Accepted  已经接受请求,但处理尚未完成。  
203  Non-Authoritative Information  文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。  
204  No Content  没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。  
205  Reset Content  没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。  
206  Partial Content  客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。  
300  Multiple Choices  客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。  
301  Moved Permanently  客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。  
302  Found  类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”。 
出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。 
注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。 
严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。 
303  See Other  类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。  
304  Not Modified  客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。  
305  Use Proxy  客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。  
307  Temporary Redirect  和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。(HTTP 1.1新)  
400  Bad Request  请求出现语法错误。  
401  Unauthorized  客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。  
403  Forbidden  资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。  
404  Not Found  无法找到指定位置的资源。这也是一个常用的应答。  
405  Method Not Allowed  请求方法(GET、POST、HEAD、Delete、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)  
406  Not Acceptable  指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。  
407  Proxy Authentication Required  类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)  
408  Request Timeout  在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)  
409  Conflict  通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)  
410  Gone  所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)  
411  Length Required  服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)  
412  Precondition Failed  请求头中指定的一些前提条件失败(HTTP 1.1新)。  
413  Request Entity Too Large  目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。  
414  Request URI Too Long  URI太长(HTTP 1.1新)。  
416  Requested Range Not Satisfiable  服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)  
500  Internal Server Error  服务器遇到了意料不到的情况,不能完成客户的请求。  
501  Not Implemented  服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。  
502  Bad Gateway  服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。  
503  Service Unavailable  服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。  
504  Gateway Timeout  由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)  
505  HTTP Version Not Supported  服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)
 
Split函数详解
Split函数
描述
返回一个下标从零开始的一维数组,它包含指定数目的子字符串。
语法
Split(expression[, delimiter[, count[, compare]]])
Split函数语法有如下几部分:
部分 描述
expression 必需的。包含子字符串和分隔符的字符串表达式 。如果expression是一个长度为零的字符串(/"/"),Split则返回一个空数组,即没有元素和数据的数组。
delimiter 可选的。用于标识子字符串边界的字符串字符。如果忽略,则使用空格字符(/" /")作为分隔符。如果delimiter是一个长度为零的字符串,则返回的数组仅包含一个元素,即完整的 expression字符串。
count 可选的。要返回的子字符串数,–1表示返回所有的子字符串。
compare 可选的。数字值,表示判别子字符串时使用的比较方式。关于其值,请参阅“设置值”部分。

设置值
compare参数的设置值如下:
常数 值 描述
vbUseCompareOption –1 用Option Compare语句中的设置值执行比较。
vbBinaryCompare 0 执行二进制比较。
vbTextCompare 1 执行文字比较。
vbDatabaseCompare 2 仅用于Microsoft Access。基于您的数据库的信息执行比较。
split函数的使用:
      For Example:
      <%
      public namearray
      qname="Wang;Zhang;Ning"
      response.write qname & "<p><br>"
      namearray=split(qname,";") '把qname字符串以分号分开,然后赋给一个数组
      max=ubound(namearray)
      for counter=0 to max-1
      response.write namearray(counter) & "<p><br>"
      next
      response.write "<hr>"
      %>


本例是一个数据库查询的例子,通过Split函数对查询字段进行了切割。
用于想灵活控制查询或开发更深层应用的一个例子。
<%
     Dim Conn
     Dim Rs
     Dim j
     Dim i
     Set Conn = Server.CreateObject("adodb.connection")
     Conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("Mydatabase/#GuestBook.mdb")
     Set Rs = Server.CreateObject("Adodb.RecordSet")
     'StrSql="Select * From GuestBook" '等同于下句。
     StrSql=SplitText("Title Content"," ","Select "," From GuestBook",",")
     Rs.Open StrSql, Conn, 1, 3
     Call RsFieldShow("Title Content"," ","标题: 内容:","<br/> <br/>")
     'j=Rs.Fields.count
     'For i=0 to (j-1)
     ' Response.Write("第" & i+1 & "个字段名:" & Rs.Fields(i).Name & "<br><br>")
     'Next
%>
<%
'ASP中把要查询的字段(Content)以字符串形式传递,附有前缀(PreText)、后缀(LastText)。
'要求前后缀产生数组后,与查询字段的数目相同。
Sub RsFieldShow(Byval Content,Byval SplitMark,Byval PreText,Byval LastText)
On Error Resume Next
EveryString=Split(Content,SplitMark)'获得字符串数组,并赋值。
EveryPreText=Split(PreText,SplitMark)
EveryLastText=Split(LastText,SplitMark)
For i=LBound(EveryString) to UBound(EveryString)
Response.Write EveryPreText(i) & Rs(EveryString(i)) & EveryLastText(i) '输出
Next
End Sub
'按照指定的格式输出字符串。
Function SplitText(Byval Content,Byval SplitMark,Byval PreText,Byval LastText,Byval SplitChar)
On Error Resume Next
Dim StrQ
StrQ=Split(Content,SplitMark) '获得字符串数组,并赋值。
For i=LBound(StrQ) to UBound(StrQ) '利用函数取得数组上限和下限。
SplitText=SplitText & StrQ(i) & SplitChar '进行组合
Next
SplitText=Left(SplitText,Len(SplitText)-1) '去掉最后一个符号。
SplitText=PreText & SplitText & LastText '加上前后缀并返回。
End Function
%>
 
ASP.NET分页组件学与用——教学篇
没有人会怀疑分页组件在WEB应用程序中的作用。数据库中的记录数成千上万甚至过亿,如果一股脑儿显示在一页显然毫不现实,这样的程序员也太小儿科了。所以,最好的办法就是分页显示,每页只显示数据库中的一部分记录,可以翻页,也可以输入一个页码翻到指定的页面,这种方式也是当前比较常见的用法。
 
       本文的不同之处在于,我把分页的功能封装在组件中,一方面体现了面向对象的特点,另一方面也方便发布、共享和使用。事先声明,本文不再讲述组件创建的详细过程,如果有疑点请参考本BLOG其他相关文章(asp.net组件设计浅论,ASP.NET组件编程step by step)。
 
 
 
       该组件最后运行显示在客户端其实是一个表格,表格被分成三段,第一段是与页和记录相关的信息;第二段是页导航,该导航显示一组带超链接的数字,通过点击数字可以转移到对应的页;第三段有两个HTML控件,用户可以输入数字转移到指定的页。从图中也可以看出,该组件的功能非常简单明了。
 
       首先我们来关注第一部分。这一部分信息包括:当前页,总页数,每页显示的记录条数和总的记录条数。这些信息从组件外部传进来,所以我们定义对应的属性:
              private int _count;//每页显示的记录条数
        private int _currentPage;//当前页
        private int _allCount;//所有记录条数
        private int _showPages;//显示数字个数
我在注释_showPages这个属性的时候有点晦涩,所以需要简单的讲一下:该属性用来定义数字导航栏显示的数字个数,在上面的图中,定义显示10个数字,即从201——210,当然,根据需要,我们可以定义任意多个数字。
 
[DefaultValue(10),Category("Customer")]
        public int Count
        {
            set
            {
                if(value <= 0)
                    _count = 1;
                else
                    _count = value;
            }
            get
            {
                return _count;
            }
        }
 
        [DefaultValue(1),Category("Customer")]
        public int CurrentPage
        {
            set
            {
                if(value < 0)
                    _currentPage = 1;
                else
                    _currentPage = value;
            }
            get
            {
                return _currentPage;
            }
        }
 
        [DefaultValue(1),Category("Customer")]
        public int AllCount
        {
            get
            {
                return _allCount;
            }
            set
            {
                if(_allCount < 0)
                    throw new Exception("记录总条数不能为负数");
                else
                    _allCount = value;
            }
        }
 
        [DefaultValue(1),Category("Customer")]
        public int Pages//总页数
        {
            get
            {
                if(this._allCount % this._count > 0)
                    return ((int)this._allCount / this._count) + 1;
                else
                    return ((int)this._allCount / this._count);
            }
        }
 
        [DefaultValue(1),Category("Customer")]
        public int ShowPages
        {
            set
            {
                if(value > 0)
                    _showPages = value;
                else
                    _showPages = 9;
            }
            get
            {
                return _showPages;
            }
    }
 
在定义的属性中,有一个叫Pages的属性,该属性不需要从外面传值,而过计算出来的。他的值等于总记录条数除以每页显示的记录条数(具体请见代码)。
 
现在我们要把这些值显示出来,用下面的代码显示:
//分页条分三部分,leftInfo是最左边的部分,用来显示当前页/总页数,每页显示的记录条数
leftInfo = "页:" + this.CurrentPage.ToString() + "/" + this.Pages.ToString() + "&nbsp;&nbsp;" + "每页" + this.Count.ToString() + "条" + "&nbsp;&nbsp;共" + this.AllCount.ToString() + "条";     
 
第二段比较复杂。组件的页面导航数字是连续的,所以,我定义了一个最小值和最大值:
int min;//要显示的页面导航数最小值
int max;//要显示的页面导航数最大值
 
设计时,需要考虑三种情况:
1:如果当前页除以ShowPages余数为0,也就是恰好可以整除的话,页面导航数字最小值和最大值分别是:
min最小值 = 当前页 + 1
max最大值 = 当前页 + 页面导航数字个数(ShowPages)
对应代码:
if(this.CurrentPage % this.ShowPages == 0) //如果恰好整除
    {
        min = this.CurrentPage + 1;
        max = this.CurrentPage + this.ShowPages ;
}
2:如果当前页是导航数字最小值时,应该切换到前一组导航数字。此时,导航数字的最小值和最大值分别是:
min最小值 = (((int)当前页 / 页面导航数字个数ShowPages ) - 1) *页面导航数字个数ShowPages +1;
max最大值 = 当前页 –1
对应代码如下:
else if(this.CurrentPage % this.ShowPages == 1 && this.CurrentPage > this.ShowPages )
    {
        min = (((int)this.CurrentPage / this.ShowPages ) - 1) * this.ShowPages +1;
        max = this.CurrentPage - 1;
}
 
3:如果当前页是导航数字最大值时,应该切换到后一组导航数字。此时,导航数字的最小值和最大值分别是:
min最小值 = ((int)当前页 / 页面导航数字个数ShowPages) * 页面导航数字个数ShowPages + 1
max最大值 = (((int)当前页 / 页面导航数字个数ShowPages) +1) * 页面导航数字个数ShowPages
对应代码如下:
else
    {
        min = ((int)this.CurrentPage / this.ShowPages) * this.ShowPages + 1;
        max = (((int)this.CurrentPage / this.ShowPages) +1) * this.ShowPages;
}
 
即然导航数字列表的最小值和最大值都计算出来了,所以我们通个做一个循环操作就可以生成该导航,当前页用斜体红色字体突出显示:
for(int i = min ; i <= max ; i++)
{          
    if(i <= this.Pages)//只有不大于最大页才显示
    {
        if(this.CurrentPage == i)//如果是当前页,用斜体和红色显示
        {
            numberStr = numberStr + "<a href=" + AbsUrl + "?currentPage=" + i.ToString() + ">" + "<I style='color:red'>" + i.ToString() + "</I>" +"</a>" + "/n";
        }
        else
        {
            numberStr = numberStr + "<a href=" + AbsUrl + "?currentPage=" + i.ToString() + ">" + i.ToString() +"</a>" + "/n";
        }
    }
}
大家应该看出来了,在导航列表的最前面和最后面一共还有四个图标,这几个图标并不是图片,而是7348四个数字的Wedding字体。这四个图标的代码如下:
//第一页,上一页,下一页,最后一页
string First,Previous,Next,Last;
First = AbsUrl + "?currentPage=1";
/////////
if(this.CurrentPage == 1)
    Previous = AbsUrl + "?currentPage=1";
else
    Previous = AbsUrl + "?currentPage=" + (this.CurrentPage - 1).ToString();
/////////
if(this.CurrentPage == this.Pages)
    Next = AbsUrl + "?currentPage=" + this.Pages;
else
    Next = AbsUrl + "?currentPage=" + (this.CurrentPage + 1).ToString();
/////////
Last = AbsUrl + "?currentPage=" + this.Pages;
 
接下来的代码就是生成要输出到客户端的HTML字符串:
centerInfo.AppendFormat("<font style='font-size:14px'><a href={0}>7</a><a href={1}>3</a></font>{2}<font style='font-size:14px'><a href={3}>4</a><a href={4}>8</a></font>",First,Previous,numberStr,Next,Last);
           
StringBuilder sb = new StringBuilder();//HTML字符串
sb.AppendFormat("<table style = 'font-size:12px' border='0' cellpadding='0' cellspacing='0' width='100%'> /n " +
                "<tr>/n" +
                "<td width='25%' align='left'>{0}</td>/n" +
                "<td width='61%' align='right'>{1}</td>/n" +
                "<td width='14%' align='right'><input type='text' name='T1' size='4' style='border-bottom:solid 1pt gray;border-top :solid 1pt gray; border-left:solid 1pt gray;border-right:solid 1pt gray;'> /n    <input type='button' name='B1' size='6' value=go style='border-bottom:solid 1pt gray;border-top :solid 1pt gray; border-left:solid 1pt gray;border-right:solid 1pt gray;' onclick='go(T1,{2})'></td>/n" +
                "</tr>/n" +
                "</table>",leftInfo,
                centerInfo.ToString(),
                this.Pages);
 
       真正输出,重写protected override void Render(HtmlTextWriter writer)方法,输出代码如下:writer.Write(sb.ToString());
 
    很辛苦,不过辛苦还要继续。呵!^_^
 
    最后要完成的是第三段了,这一段我们用JavaScript脚本完成。用户输入数据到文本框时,先检测是否符合要求,不能是非数字,也不能超过最大页面范围。如果符合要求,则将浏览器的地址栏改成对应的URL地址即可。
 
    脚本如下:
   <script language="javascript">
   function go(ctrl,max)
   {
       if(ctrl.value >= 1 && ctrl.value <= max)
       {
          var url;
          var index;
          url = location.href;
          index = url.indexOf('?');
          if(index == -1)
          {
          }
          else
          {
              url = url.substring(0,index);
          }
          location.href = url + "?currentPage=" + ctrl.value;
         
       }
       else
       {
          alert("您输入的页码必须是符合页面要求的数字,最大值是:" + max);
          return false;
       }
   }
</script>
参数说明:ctrl是文本框,max是输入的最大值,也就是总页数。
 
重写OnPreRender()方法,将该段脚本输入到浏览器:
protected override void OnPreRender(EventArgs e)
{
    base.OnPreRender (e);
    if(!Page.IsClientScriptBlockRegistered("WEREW-332DFAF-FDAFDSFDSAFD"))
    {                               Page.RegisterClientScriptBlock("WEREW-332DFAF-FDAFDSFDSAFD",SCRIPTSTRING);
    }
}
 

1、DateTime 数字型

System.DateTime currentTime=new System.DateTime();
  1.1 取当前年月日时分秒

currentTime=System.DateTime.Now;
  1.2 取当前年

int 年=currentTime.Year;
  1.3 取当前月

int 月=currentTime.Month;
  1.4 取当前日

int 日=currentTime.Day;
  1.5 取当前时

int 时=currentTime.Hour;
  1.6 取当前分

int 分=currentTime.Minute;
  1.7 取当前秒

int 秒=currentTime.Second;
  1.8 取当前毫秒

int 毫秒=currentTime.Millisecond;
(变量可用中文)
  1.9 取中文日期显示——年月日时分

string strY=currentTime.ToString("f"); //不显示秒
  1.10 取中文日期显示_年月

string strYM=currentTime.ToString("y");
  1.11 取中文日期显示_月日

string strMD=currentTime.ToString("m");
  1.12 取当前年月日,格式为:2003-9-23

string strYMD=currentTime.ToString("d");
  1.13 取当前时分,格式为:14:24

string strT=currentTime.ToString("t");
  2、字符型转换 转为32位数字型

  Int32.Parse(变量) Int32.Parse("常量")

  3、 变量.ToString()

  字符型转换 转为字符串
  12345.ToString("n"); //生成 12,345.00
  12345.ToString("C"); //生成 ¥12,345.00
  12345.ToString("e"); //生成 1.234500e+004
  12345.ToString("f4"); //生成 12345.0000
  12345.ToString("x"); //生成 3039 (16进制)
  12345.ToString("p"); //生成 1,234,500.00%

  4、变量.Length 数字型

  取字串长度:

  如: string str="中国";

int Len = str.Length ; //Len是自定义变量, str是求测的字串的变量名

5、字码转换 转为比特码

  System.Text.Encoding.Default.GetBytes(变量)

  如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str);

  然后可得到比特长度:

  len = bytStr.Length;

  6、System.Text.StringBuilder("")

  字符串相加,(+号是不是也一样?)

  如:

System.Text.StringBuilder sb = new System.Text.StringBuilder("");
sb.Append("中华");
sb.Append("人民");
sb.Append("共和国");
  7、变量.Substring(参数1,参数2);

  截取字串的一部分,参数1为左起始位数,参数2为截取几位。

  如:string s1 = str.Substring(0,2);

  8、取远程用户IP地址

String user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
  9、穿过代理服务器取远程用户真实IP地址:

if(Request.ServerVariables["HTTP_VIA"]!=null){
string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString();
}else{
string user_IP=Request.ServerVariables["REMOTE_ADDR"].ToString();
}
  10、存取Session值

Session["变量"];
  如,赋值:

Session["username"]="小布什";
  取值:

Object objName=Session["username"];
String strName=objName.ToString();
  清空:

Session.RemoveAll();
  11、用超链接传送变量

String str=Request.QueryString["变量"];
  如在任一页中建超链接:<a href=Edit.aspx?fbid=23>点击</a>

  在Edit.aspx页中取值:String str=Request.QueryString["fdid"];

  12、创建XML文档新节点

  DOC对象.CreateElement("新建节点名");

  13、将新建的子节点加到XML文档父节点下

  父节点.AppendChild(子节点);

  14、 删除节点

  父节点.RemoveChild(节点);

  15、向页面输出:Response

Response.Write("字串");
Response.Write(变量);
  跳转到URL指定的页面:

Response.Redirect("URL地址");

16、查指定位置是否空字符

char.IsWhiteSpce(字串变量,位数)——逻辑型;   
  如:

string str="中国 人民";
Response.Write(char.IsWhiteSpace(str,2)); //结果为:True, 第一个字符是0位,2是第三个字符。
  17、查字符是否是标点符号

char.IsPunctuation(''''字符'''') --逻辑型
  如:

Response.Write(char.IsPunctuation(''''A'''')); //返回:False
  18、把字符转为数字,查代码点,注意是单引号。

  (int)''''字符''''

  如:

Response.Write((int)''''中''''); //结果为中字的代码:20013
  19、把数字转为字符,查代码代表的字符:(char)代码

  如:

Response.Write((char)22269); //返回“国”字。
  20、 清除字串前后空格: Trim()

  21、字串替换

  字串变量.Replace("子字串","替换为")

  如:

string str="中国";
str=str.Replace("国","央"); //将国字换为央字
Response.Write(str); //输出结果为“中央”
  再如:(这个非常实用)

string str="这是<script>脚本";
str=str.Replace("<","<font><</font>"); //将左尖括号替换为<font> 与 < 与 </font> (或换为<,但估计经XML存诸后,再提出仍会还原)
Response.Write(str); //显示为:“这是<script>脚本”
  如果不替换,<script>将不显示,如果是一段脚本,将运行;而替换后,脚本将不运行。

  这段代码的价值在于:你可以让一个文本中的所有HTML标签失效,全部显示出来,保护你的具有交互性的站点。

  具体实现:将你的表单提交按钮脚本加上下面代码:

string strSubmit=label1.Text; //label1是你让用户提交数据的控件ID。
strSubmit=strSubmit.Replace("<","<font><</font>");
  然后保存或输出strSubmit。

  用此方法还可以简单实现UBB代码。

  22、取i与j中的最大值:Math.Max(i,j)

  如 int x=Math.Max(5,10); // x将取值 10

  加一点吧 23、字串对比......

  23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法:

  (1)、

string str1; str2
//语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.如:
if(str1.EndsWith(str2)){ Response.Write("字串str1是以"+str2+"结束的"); }
  (2)、

//语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
  (3)、

//语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.
  24、查找字串中指定字符或字串首次(最后一次)出现的位置,返回索引值:IndexOf() 、LastIndexOf(), 如:

str1.IndexOf("字"); //查找“字”在str1中的索引值(位置)
str1.IndexOf("字串");//查找“字串”的第一个字符在str1中的索引值(位置)
str1.IndexOf("字串",3,2);//从str1第4个字符起,查找2个字符,查找“字串”的第一个字符在str1中的索引值(位置)
  25、在字串中指定索引位插入指定字符:Insert() ,如:

str1.Insert(1,"字");在str1的第二个字符处插入“字”,如果str1="中国",插入后为“中字国”;
26、在字串左(或右)加空格或指定char字符,使字串达到指定长度:PadLeft()、PadRight() ,如:

<%
string str1="中国人";
str1=str1.PadLeft(10,''''1''''); //无第二参数为加空格
Response.Write(str1); //结果为“1111111中国人” , 字串长为10
%>
  27、从指定位置开始删除指定数的字符:Remove()

  28.反转整个一维Array中元素的顺序。

har[] charArray = "abcde".ToCharArray();
Array.Reverse(charArray);
Console.WriteLine(new string(charArray));
  29.判断一个字符串中的第n个字符是否是大写

string str="abcEEDddd";
Response.Write(Char.IsUpper(str,3));

 
script>

function getPage(rc,ps,cr)
{
var Next,Pre,Min,Max,Pc,PageStr=[];
Next=Pre=Min=Max=Pc==0;
if(cr<1)cr=1;
if(ps!=0)
{
Pc=parseInt(rc/ps);
Pc=(parseInt(rc%ps)!=0)?Pc+1:Pc;
Pc=((Pc==0)?1:Pc)
}
Next=cr+1;
Pre=cr-1;
Min=(cr+5)>Pc?Pc-9:cr-4;
Max=cr<5?10:cr+5;
if(Min<1)Min=1;
if(Max>Pc)Max=Pc;
alert
PageStr.push("共"+cr+"/"+Pc+"页&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");

if(cr>1)
{
PageStr.push("<a href='javascript:goPage(1)' title='转到第1页'>首页</a>&nbsp;&nbsp;<a href='javascript:goPage("+Pre+")' title='当前第"+Pre+"页'>上页</a>")
}else{
PageStr.push("首页 上页");
}

for(var i=Min;i<=Max;i++)
{
if(cr==i)
{
PageStr.push("&nbsp;&nbsp;<font color='#ff0000' title='当前第"+i+"页'>["+i+"]</font>");
}else{

PageStr.push("&nbsp;<a href='javascript:goPage("+i+")' title='转到第"+i+"页'>["+i+"]</a>&nbsp;");
}

}

if(cr<Pc)
{
PageStr.push("<a href='javascript:goPage("+Next+")' title='转到第"+Next+"页'>下页</a>&nbsp;&nbsp;<a href='javascript:goPage("+Pc+")' title='转到第"+Pc+"页'>尾页</a>")
}else
{
PageStr.push("下页 尾页");
}

document.getElementById("pager").innerHTML=PageStr.toString().replace(//,/g,"");

}
function goPage(page)
{
getPage(100,9,page)
}
</script>
</HEAD>
<body onLoad=getPage(100,9,1)>
<form id="Form1" method="post" runat="server">
<div id="pager"></div>
</form>
</body>
原创粉丝点击