自Sql Server联机帮助
USE AdventureWorks; GO SELECT SalesQuota, SUM(SalesYTD) 'TotalSalesYTD', GROUPING(SalesQuota) AS 'Grouping' FROM Sales.SalesPerson GROUP BY SalesQuota WITH ROLLUP; GO
结果集在 SalesQuota 下面显示两个空值。第一个 NULL 代表从表中的这一列得到的空值组。第二个 NULL 位于 ROLLUP 操作所添加的汇总行之中。汇总行显示所有SalesQuota 组的 TotalSalesYTD 数量,并以 Grouping 列中的 1 进行指示。
下面是结果集:
SalesQuota TotalSalesYTD Grouping --------- ------------- -------- NULL 1533087.5999 0 250000.00 33461260.59 0 300000.00 9299677.9445 0 NULL 44294026.1344 1 (4 row(s) affected)
利用GROUPING来做分组汇总
在用SQL时,我们经常会碰到这样的问题,要求分级求合计数,你是不是经常为怎么在一张表里分级统计而烦恼?这里我们可以用GROUPING()函数来解决该问题。下面用实际的例子来说明,例子是一个行政区、单位、销售额的数据表。
--创建表并插入数据
Create Table T_SendMoney(StateCode varchar(6),DepCode varchar(6),SendMoney Money)
Insert Into T_SendMoney
Select '100001','310001',1000
UNION ALL
Select '100001','310001',2000
UNION ALL
Select '100001','310002',1500
UNION ALL
Select '100002','320001',3000
UNION ALL
Select '100002','320001',1200
UNION ALL
Select '100003','330001',1800
UNION ALL
Select '100003','330002',2100
UNION ALL
Select '100004','340001',2500
--按GROUPING来实现分级汇总数据
Select
CASE WHEN GROUPING(StateCode)=1 THEN 'Total:' ELSE StateCode END as StateCode
,CASE WHEN GROUPING(DepCode)=1 THEN 'State Total:' ELSE DepCode END as DepCode
,Sum(SendMoney) AS SendMoney
From T_SendMoney
GROUP BY StateCode,DepCode WITH ROLLUP
--查询结果
StateCode DepCode SendMoney
-----------------------------------------
100001 310001 3000.00
100001 310002 1500.00
100001 State Total: 4500.00
100002 320001 4200.00
100002 State Total: 4200.00
100003 330001 1800.00
100003 330002 2100.00
100003 State Total: 3900.00
100004 340001 2500.00
100004 State Total: 2500.00
Total: State Total: 15100.00----------------------------WITH ROLLUP
----------------------------
先创建测试表、添加数据。
create table #t(a int,b int,c int,d int,e int)
insert into #t values(1,2,3,4,5)
insert into #t values(1,2,3,4,6)
insert into #t values(1,2,3,4,7)
insert into #t values(1,2,3,4,8)
insert into #t values(1,3,3,4,5)
insert into #t values(1,3,3,4,6)
insert into #t values(1,3,3,4,8)
insert into #t values(1,3,3,4,7)
insert into #t values(2,2,2,4,5)
insert into #t values(2,2,3,4,6)
insert into #t values(2,2,4,4,7)
insert into #t values(2,2,5,4,8)
insert into #t values(2,3,6,4,5)
insert into #t values(2,3,3,4,6)
insert into #t values(2,3,3,4,8)
insert into #t values(2,3,3,4,7)
情况一:只有一个分类汇总列时,只需要一个合计。只需要增加with rollup即可。
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
sum(b),sum(c),sum(d),sum(e) from #t group by a with rollup
情况二:有多个分类汇总列,只需要一个合计.增加rollup之后,需要增加判断。
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
b,
sum(c),sum(d),sum(e) from #t
group by a,b with rollup
having grouping(b)=0 or grouping(a)=1
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
b,
c,
sum(d),sum(e) from #t
group by a,b,c with rollup
having grouping(c)=0 or grouping(a)=1
情况三:有多个分类汇总列,需要全部的小计和合计。
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varchar) end b,
case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varchar) end c,
sum(d),sum(e) from #t
group by a,b,c with rollup
另外一种显示小计的方式
select case when grouping(a)=1 then '合计'
when grouping(b)=1 then cast(a as varchar)+'小计'
else cast(a as varchar) end a,
case when grouping(b)=0 and grouping(c)=1
then cast(b as varchar)+'小计' else cast(b as varchar) end b,
case when grouping(c)=1 and grouping(b)=0
then '' else cast(c as varchar) end c,
sum(d),sum(e) from #t
group by a,b,c with rollup
情况四:有多个分类汇总列,需要部分的小计和合计
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
b,
case when grouping(c)=1 and grouping(b)=0 then '小计' else cast(c as varchar) end c,
sum(d),sum(e) from #t
group by a,b,c with rollup
having grouping(a)=1 or grouping(b)=0
select case when grouping(a)=1 then '合计' else cast(a as varchar) end a,
case when grouping(b)=1 and grouping(a)=0 then '小计' else cast(b as varchar) end b,
c,
sum(d),sum(e) from #t
group by a,b,c with rollup
having grouping(a)=1 or grouping(b)=1 or grouping(c)=0
Attribute:
$(”p”).addClass(css中定义的样式类型); 给某个元素添加样式
$(”img”).attr({src:”test.jpg”,alt:”test Image”}); 给某个元素添加属性/值,参数是map
$(”img”).attr(”src”,”test.jpg”); 给某个元素添加属性/值
$(”img”).attr(”title”, function() { return this.src }); 给某个元素添加属性/值
$(”元素名称”).html(); 获得该元素内的内容(元素,文本等)
$(”元素名称”).html(”<b>new stuff</b>”); 给某元素设置内容
$(”元素名称”).removeAttr(”属性名称”) 给某元素删除指定的属性以及该属性的值
$(”元素名称”).removeClass(”class”) 给某元素删除指定的样式
$(”元素名称”).text(); 获得该元素的文本
$(”元素名称”).text(value); 设置该元素的文本值为value
$(”元素名称”).toggleClass(class) 当元素存在参数中的样式的时候取消,如果不存在就设置此样式
$(”input元素名称”).val(); 获取input元素的值
$(”input元素名称”).val(value); 设置input元素的值为value
Manipulation:
$(”元素名称”).after(content); 在匹配元素后面添加内容
$(”元素名称”).append(content); 将content作为元素的内容插入到该元素的后面
$(”元素名称”).appendTo(content); 在content后接元素
$(”元素名称”).before(content); 与after方法相反
$(”元素名称”).clone(布尔表达式) 当布尔表达式为真时,克隆元素(无参时,当作true处理)
$(”元素名称”).empty() 将该元素的内容设置为空
$(”元素名称”).insertAfter(content); 将该元素插入到content之后
$(”元素名称”).insertBefore(content); 将该元素插入到content之前
$(”元素”).prepend(content); 将content作为该元素的一部分,放到该元素的最前面
$(”元素”).prependTo(content); 将该元素作为content的一部分,放content的最前面
$(”元素”).remove(); 删除所有的指定元素
$(”元素”).remove(”exp”); 删除所有含有exp的元素
$(”元素”).wrap(”html”); 用html来包围该元素
$(”元素”).wrap(element); 用element来包围该元素
Traversing:
add(expr)
add(html)
add(elements)
children(expr)
contains(str)
end()
filter(expression)
filter(filter)
find(expr)
is(expr)
next(expr)
not(el)
not(expr)
not(elems)
parent(expr)
parents(expr)
prev(expr)
siblings(expr)
Core:
$(html).appendTo(”body”) 相当于在body中写了一段html代码
$(elems) 获得DOM上的某个元素
$(function(){……..}); 执行一个函数
$(”div > p”).css(”border”, “1px solid gray”); 查找所有div的子节点p,添加样式
$(”input:radio”, document.forms[0]) 在当前页面的第一个表单中查找所有的单选按钮
$.extend(prop) prop是一个jquery对象,
举例:
jQuery.extend({
min: function(a, b) { return a < b ? a : b; },
max: function(a, b) { return a > b ? a : b; }
});
jQuery( expression, [context] ) —$( expression, [context]); 在默认情况下,$()查询的是当前HTML文档中的DOM元素。
each( callback ) 以每一个匹配的元素作为上下文来执行一个函数
举例:1
$(”span”).click(function){
$(”li”).each(function(){
$(this).toggleClass(”example”);
});
});
举例:2
$(”button”).click(function () {
$(”div”).each(function (index, domEle) {
// domEle == this
$(domEle).css(”backgroundColor”, “yellow”);
if ($(this).is(”#stop”)) {
$(”span”).text(”Stopped at div index #” + index);
return false;
}
});
});
jQuery Event:
ready(fn); $(document).ready()注意在body中没有onload事件,否则该函数不能执行。在每个页面中可以
有很多个函数被加载执行,按照fn的顺序来执行。
bind( type, [data], fn ) 为每一个匹配元素的特定事件(像click)绑定一个或多个事件处理器函数。可能的事件属性有:blur, focus, load, resize, scroll, unload, click, dblclick, mousedown, mouseup, mousemove,
mouseover, mouseout, mouseenter, mouseleave, change, select, submit, keydown, keypress,
keyup, error
one( type, [data], fn ) 为每一个匹配元素的特定事件(像click)绑定一个或多个事件处理器函数。在每个对
象上,这个事件处理函数只会被执行一次。其他规则与bind()函数相同。
trigger( type, [data] ) 在每一个匹配的元素上触发某类事件。
triggerHandler( type, [data] ) 这一特定方法会触发一个元素上特定的事件(指定一个事件类型),同时取消浏览器对此事件的默认行动
unbind( [type], [data] ) 反绑定,从每一个匹配的元素中删除绑定的事件。
$(”p”).unbind() 移除所有段落上的所有绑定的事件
$(”p”).unbind( “click” ) 移除所有段落上的click事件
hover( over, out ) over,out都是方法, 当鼠标移动到一个匹配的元素上面时,会触发指定的第一个函数。当鼠标移出这个元素时,会触发指定的第二个函数。
$(”p”).hover(function(){
$(this).addClass(”over”);
},
function(){
$(this).addClass(”out”);
}
);
toggle( fn, fn ) 如果点击了一个匹配的元素,则触发指定的第一个函数,当再次点击同一元素时,则触发指定的第二个函数。
$(”p”).toggle(function(){
$(this).addClass(”selected”);
},
function(){
$(this).removeClass(”selected”);
}
);
元素事件列表说明
注:不带参数的函数,其参数为可选的 fn。jQuery不支持form元素的reset事件。
事件 描述 支持元素或对象
blur( ) 元素失去焦点 a, input, textarea, button, select, label, map, area
change( ) 用户改变域的内容 input, textarea, select
click( ) 鼠标点击某个对象 几乎所有元素
dblclick( ) 鼠标双击某个对象 几乎所有元素
error( ) 当加载文档或图像时发生某个错误 window, img
focus( ) 元素获得焦点 a, input, textarea, button, select, label, map, area
keydown( ) 某个键盘的键被按下 几乎所有元素
keypress( ) 某个键盘的键被按下或按住 几乎所有元素
keyup( ) 某个键盘的键被松开 几乎所有元素
load( fn ) 某个页面或图像被完成加载 window, img
mousedown( fn ) 某个鼠标按键被按下 几乎所有元素
mousemove( fn ) 鼠标被移动 几乎所有元素
mouseout( fn ) 鼠标从某元素移开 几乎所有元素
mouseover( fn ) 鼠标被移到某元素之上 几乎所有元素
mouseup( fn ) 某个鼠标按键被松开 几乎所有元素
resize( fn ) 窗口或框架被调整尺寸 window, iframe, frame
scroll( fn ) 滚动文档的可视部分时 window
select( ) 文本被选定 document, input, textarea
submit( ) 提交按钮被点击 form
unload( fn ) 用户退出页面 window
JQuery Ajax 方法说明:
load( url, [data], [callback] ) 装入一个远程HTML内容到一个DOM结点。
$(”#feeds”).load(”feeds.html”); 将feeds.html文件载入到id为feeds的div中
$(”#feeds”).load(”feeds.php”, {limit: 25}, function(){
alert(”The last 25 entries in the feed have been loaded”);
});
jQuery.get( url, [data], [callback] ) 使用GET请求一个页面。
$.get(”test.cgi”, { name: “John”, time: “2pm” }, function(data){
alert(”Data Loaded: ” + data);
});
jQuery.getJSON( url, [data], [callback] ) 使用GET请求JSON数据。
$.getJSON(”test.js”, { name: “John”, time: “2pm” }, function(json){
alert(”JSON Data: ” + json.users[3].name);
});
jQuery.getScript( url, [callback] ) 使用GET请求javascript文件并执行。
$.getScript(”test.js”, function(){
alert(”Script loaded and executed.”);
});
jQuery.post( url, [data], [callback], [type] ) 使用POST请求一个页面。
ajaxComplete( callback ) 当一个AJAX请求结束后,执行一个函数。这是一个Ajax事件
$(”#msg”).ajaxComplete(function(request, settings){
$(this).append(”<li>Request Complete.</li>”);
});
ajaxError( callback ) 当一个AJAX请求失败后,执行一个函数。这是一个Ajax事件
$(”#msg”).ajaxError(function(request, settings){
$(this).append(”<li>Error requesting page ” + settings.url + “</li>”);
});
ajaxSend( callback ) 在一个AJAX请求发送时,执行一个函数。这是一个Ajax事件
$(”#msg”).ajaxSend(function(evt, request, settings){
$(this).append(”<li<Starting request at ” + settings.url
+ “</li<”);
});
ajaxStart( callback ) 在一个AJAX请求开始但还没有激活时,执行一个函数。这是一个Ajax事件
当AJAX请求开始(并还没有激活时)显示loading信息
$(”#loading”).ajaxStart(function(){
$(this).show();
});
ajaxStop( callback ) 当所有的AJAX都停止时,执行一个函数。这是一个Ajax事件
当所有AJAX请求都停止时,隐藏loading信息。
$(”#loading”).ajaxStop(function(){
$(this).hide();
});
ajaxSuccess( callback ) 当一个AJAX请求成功完成后,执行一个函数。这是一个Ajax事件
当AJAX请求成功完成时,显示信息。
$(”#msg”).ajaxSuccess(function(evt, request, settings){
$(this).append(”<li>Successful Request!</li>”);
});
jQuery.ajaxSetup( options ) 为所有的AJAX请求进行全局设置。查看$.ajax函数取得所有选项信息。
设置默认的全局AJAX请求选项。
$.ajaxSetup({
url: “/xmlhttp/”,
global: false,
type: “POST”
});
$.ajax({ data: myData });
serialize( ) 以名称和值的方式连接一组input元素。实现了正确表单元素序列
function showValues() {
var str = $(”form”).serialize();
$(”#results”).text(str);
}
$(”:checkbox, :radio”).click(showValues);
$(”select”).change(showValues);
showValues();
serializeArray( ) 连接所有的表单和表单元素(类似于.serialize()方法),但是返回一个JSON数据格式。
从form中取得一组值,显示出来
function showValues() {
var fields = $(”:input”).serializeArray();
alert(fields);
$(”#results”).empty();
jQuery.each(fields, function(i, field){
$(”#results”).append(field.value + ” “);
});
}
$(”:checkbox, :radio”).click(showValues);
$(”select”).change(showValues);
showValues();
JQuery Effects 方法说明
show( ) 显示隐藏的匹配元素。
show( speed, [callback] ) 以优雅的动画显示所有匹配的元素,并在显示完成后可选地触发一个回调函数。
hide( ) 隐藏所有的匹配元素。
hide( speed, [callback] ) 以优雅的动画隐藏所有匹配的元素,并在显示完成后可选地触发一个回调函数
toggle( ) 切换元素的可见状态。如果元素是可见的,切换为隐藏的;如果元素是隐藏的,
切换为可见的。
slideDown( speed, [callback] ) 通过高度变化(向下增大)来动态地显示所有匹配的元素,在显示完成后可选
地触发一个回调函数。这个动画效果只调整元素的高度,可以使匹配的元素以
“滑动”的方式显示出来。
slideUp( speed, [callback] ) 通过高度变化(向上减小)来动态地隐藏所有匹配的元素,在隐藏完成后可选地
触发一个回调函数。这个动画效果只调整元素的高度,可以使匹配的元素以”滑动”
的方式隐藏起来。
slideToggle( speed, [callback] ) 通过高度变化来切换所有匹配元素的可见性,并在切换完成后可选地触发一个回
调函数。 这个动画效果只调整元素的高度,可以使匹配的元素以”滑动”的方式隐
藏或显示。
fadeIn( speed, [callback] ) 通过不透明度的变化来实现所有匹配元素的淡入效果,并在动画完成后可选地触
发一个回调函数。 这个动画只调整元素的不透明度,也就是说所有匹配的元素的
高度和宽度不会发生变化。
fadeOut( speed, [callback] ) 通过不透明度的变化来实现所有匹配元素的淡出效果,并在动画完成后可选地触
发一个回调函数。 这个动画只调整元素的不透明度,也就是说所有匹配的元素的
高度和宽度不会发生变化。
fadeTo( speed, opacity, [callback] ) 把所有匹配元素的不透明度以渐进方式调整到指定的不透明度,并在动画完成
后可选地触发一个回调函数。 这个动画只调整元素的不透明度,也就是说所
有匹配的元素的高度和宽度不会发生变化。
stop( ) 停止所有匹配元素当前正在运行的动画。如果有动画处于队列当中,他们就会立即开始。
queue( ) 取得第一个匹配元素的动画序列的引用(返回一个内容为函数的数组)
queue( callback ) 在每一个匹配元素的事件序列的末尾添加一个可执行函数,作为此元素的事件函数
queue( queue ) 以一个新的动画序列代替所有匹配元素的原动画序列
dequeue( ) 执行并移除动画序列前端的动画
animate( params, [duration], [easing], [callback] ) 用于创建自定义动画的函数。
animate( params, options ) 创建自定义动画的另一个方法。作用同上。
JQuery Traversing 方法说明
eq( index ) 从匹配的元素集合中取得一个指定位置的元素,index从0开始
filter( expr ) 返回与指定表达式匹配的元素集合,可以使用”,”号分割多个expr,用于实现多个条件筛选
filter( fn ) 利用一个特殊的函数来作为筛选条件移除集合中不匹配的元素。
is( expr ) 用一个表达式来检查当前选择的元素集合,如果其中至少有一个元素符合这个给定的
表达式就返回true。
map( callback ) 将jQuery对象中的一组元素利用callback方法转换其值,然后添加到一个jQuery数组中。
not( expr ) 从匹配的元素集合中删除与指定的表达式匹配的元素。
slice( start, [end] ) 从匹配元素集合中取得一个子集,和内建的数组的slice方法相同。
add( expr ) 把与表达式匹配的元素添加到jQuery对象中。
children( [expr] ) 取得一个包含匹配的元素集合中每一个元素的所有子元素的元素集合。可选的过滤器
将使这个方法只匹配符合的元素(只包括元素节点,不包括文本节点)。
contents( ) 取得一个包含匹配的元素集合中每一个元素的所有子孙节点的集合(只包括元素节点,不
包括文本节点),如果元素为iframe,则取得其中的文档元素
find( expr ) 搜索所有与指定表达式匹配的元素。
next( [expr] ) 取得一个包含匹配的元素集合中每一个元素紧邻的后面同辈元素的元素集合。
nextAll( [expr] ) 取得一个包含匹配的元素集合中每一个元素所有的后面同辈元素的元素集合
parent( [expr] ) 取得一个包含着所有匹配元素的唯一父元素的元素集合。
parents( [expr] ) 取得一个包含着所有匹配元素的唯一祖先元素的元素集合(不包含根元素)。
prev( [expr] ) 取得一个包含匹配的元素集合中每一个元素紧邻的前一个同辈元素的元素集合。
prevAll( [expr] ) 取得一个包含匹配的元素集合中每一个元素的之前所有同辈元素的元素集合。
siblings( [expr] ) 取得一个包含匹配的元素集合中每一个元素的所有同辈元素的元素集合。
andSelf( ) 将前一个匹配的元素集合添加到当前的集合中
取得所有div元素和其中的p元素,添加border类属性。取得所有div元素中的p元素,
添加background类属性
$(”div”).find(”p”).andSelf().addClass(”border”);
$(”div”).find(”p”).addClass(”background”);
end( ) 结束当前的操作,回到当前操作的前一个操作
找到所有p元素其中的span元素集合,然后返回p元素集合,添加css属性
$(”p”).find(”span”).end().css(”border”, “2px red solid”);
JQuery Selectors 方法说明
基本选择器
$(”#myDiv”) 匹配唯一的具有此id值的元素
$(”div”) 匹配指定名称的所有元素
$(”.myClass”) 匹配具有此class样式值的所有元素
$(”*”) 匹配所有元素
$(”div,span,p.myClass”) 联合所有匹配的选择器
层叠选择器
$(”form input”) 后代选择器,选择ancestor的所有子孙节点
$(”#main > *”) 子选择器,选择parent的所有子节点
$(”label + input”) 临选择器,选择prev的下一个临节点
$(”#prev ~ div”) 同胞选择器,选择prev的所有同胞节点
基本过滤选择器
$(”tr:first”) 匹配第一个选择的元素
$(”tr:last”) 匹配最后一个选择的元素
$(”input:not(:checked) + span”)从原元素集合中过滤掉匹配selector的所有元素(这里有是一个临选择器)
$(”tr:even”) 匹配集合中偶数位置的所有元素(从0开始)
$(”tr:odd”) 匹配集合中奇数位置的所有元素(从0开始)
$(”td:eq(2)”) 匹配集合中指定位置的元素(从0开始)
$(”td:gt(4)”) 匹配集合中指定位置之后的所有元素(从0开始)
$(”td:gl(4)”) 匹配集合中指定位置之前的所有元素(从0开始)
$(”:header”) 匹配所有标题
$(”div:animated”) 匹配所有正在运行动画的所有元素
内容过滤选择器
$(”div:contains(’John’)”) 匹配含有指定文本的所有元素
$(”td:empty”) 匹配所有空元素(只含有文本的元素不算空元素)
$(”div:has(p)”) 从原元素集合中再次匹配所有至少含有一个selector的所有元素
$(”td:parent”) 匹配所有不为空的元素(含有文本的元素也算)
$(”div:hidden”) 匹配所有隐藏的元素,也包括表单的隐藏域
$(”div:visible”) 匹配所有可见的元素
属性过滤选择器
$(”div[id]”) 匹配所有具有指定属性的元素
$(”input[name=’newsletter’]”) 匹配所有具有指定属性值的元素
$(”input[name!=’newsletter’]”) 匹配所有不具有指定属性值的元素
$(”input[name^=’news’]”) 匹配所有指定属性值以value开头的元素
$(”input[name$=’letter’]”) 匹配所有指定属性值以value结尾的元素
$(”input[name*=’man’]”) 匹配所有指定属性值含有value字符的元素
$(”input[id][name$=’man’]”) 匹配同时符合多个选择器的所有元素
子元素过滤选择器
$(”ul li:nth-child(2)”),
$(”ul li:nth-child(odd)”), 匹配父元素的第n个子元素
$(”ul li:nth-child(3n + 1)”)
$(”div span:first-child”) 匹配父元素的第1个子元素
$(”div span:last-child”) 匹配父元素的最后1个子元素
$(”div button:only-child”) 匹配父元素的唯一1个子元素
表单元素选择器
$(”:input”) 匹配所有的表单输入元素,包括所有类型的input, textarea, select 和 button
$(”:text”) 匹配所有类型为text的input元素
$(”:password”) 匹配所有类型为password的input元素
$(”:radio”) 匹配所有类型为radio的input元素
$(”:checkbox”) 匹配所有类型为checkbox的input元素
$(”:submit”) 匹配所有类型为submit的input元素
$(”:image”) 匹配所有类型为image的input元素
$(”:reset”) 匹配所有类型为reset的input元素
$(”:button”) 匹配所有类型为button的input元素
$(”:file”) 匹配所有类型为file的input元素
$(”:hidden”) 匹配所有类型为hidden的input元素或表单的隐藏域
表单元素过滤选择器
$(”:enabled”) 匹配所有可操作的表单元素
$(”:disabled”) 匹配所有不可操作的表单元素
$(”:checked”) 匹配所有已点选的元素
$(”select option:selected”) 匹配所有已选择的元素
JQuery CSS 方法说明
css( name ) 访问第一个匹配元素的样式属性。
css( properties ) 把一个”名/值对”对象设置为所有匹配元素的样式属性。
$(”p”).hover(function () {
$(this).css({ backgroundColor:”yellow”, fontWeight:”bolder” });
}, function () {
var cssObj = {
backgroundColor: “#ddd”,
fontWeight: “”,
color: “rgb(0,40,244)”
}
$(this).css(cssObj);
});
css( name, value ) 在所有匹配的元素中,设置一个样式属性的值。
offset( ) 取得匹配的第一个元素相对于当前可视窗口的位置。返回的对象有2个属性,
top和left,属性值为整数。这个函数只能用于可见元素。
var p = $(”p:last”);
var offset = p.offset();
p.html( “left: ” + offset.left + “, top: ” + offset.top );
width( ) 取得当前第一匹配的元素的宽度值,
width( val ) 为每个匹配的元素设置指定的宽度值。
height( ) 取得当前第一匹配的元素的高度值,
height( val ) 为每个匹配的元素设置指定的高度值。
JQuery Utilities 方法说明
jQuery.browser
.msie 表示ie
jQuery.browser.version 读取用户浏览器的版本信息
jQuery.boxModel 检测用户浏览器针对当前页的显示是否基于w3c CSS的盒模型
jQuery.isFunction( obj ) 检测传递的参数是否为function
function stub() { }
var objs = [
function () {},
{ x:15, y:20 },
null,
stub,
“function”
];
jQuery.each(objs, function (i) {
var isFunc = jQuery.isFunction(objs[i]);
$(”span:eq( ” + i + “)”).text(isFunc);
});
jQuery.trim( str ) 清除字符串两端的空格,使用正则表达式来清除给定字符两端的空格
jQuery.each( object, callback ) 一个通用的迭代器,可以用来无缝迭代对象和数组
jQuery.extend( target, object1, [objectN] ) 扩展一个对象,修改原来的对象并返回,这是一个强大的实现继承的
工具,这种继承是采用传值的方法来实现的,而不是JavaScript中的
原型链方式。
合并settings和options对象,返回修改后的settings对象
var settings = { validate: false, limit: 5, name: “foo” };
var options = { validate: true, name: “bar” };
jQuery.extend(settings, options);
合并defaults和options对象,defaults对象并没有被修改。options对象中的值
代替了defaults对象的值传递给了empty。
var empty = {}
var defaults = { validate: false, limit: 5, name: “foo” };
var options = { validate: true, name: “bar” };
var settings = $.extend(empty, defaults, options);
jQuery.grep( array, callback, [invert] ) 通过一个筛选函数来去除数组中的项
$.grep( [0,1,2], function(n,i){
return n > 0;
});
jQuery.makeArray( obj ) 将一个类似数组的对象转化为一个真正的数组
将选取的div元素集合转化为一个数组
var arr = jQuery.makeArray(document.getElementsByTagName(”div”));
arr.reverse(); // use an Array method on list of dom elements
$(arr).appendTo(document.body);
jQuery.map( array, callback ) 使用某个方法修改一个数组中的项,然后返回一个新的数组
jQuery.inArray( value, array ) 返回value在数组中的位置,如果没有找到,则返回-1
jQuery.unique( array ) 删除数组中的所有重复元素,返回整理后的数组
软件开发常用英语词汇
A
abstract 抽象的
abstract base class (ABC)抽象基类
abstract class 抽象类
abstraction 抽象、抽象物、抽象性
access 存取、访问
access function 访问函数
access level访问级别
account 账户
action 动作
activate 激活
active 活动的
actual parameter 实参
adapter 适配器
add-in 插件
address 地址
address space 地址空间
ADO(ActiveX Data Object)ActiveX数据对象
advanced 高级的
aggregation 聚合、聚集
algorithm 算法
alias 别名
align 排列、对齐
allocate 分配、配置
allocator分配器、配置器
angle bracket 尖括号
annotation 注解、评注
API (Application Programming Interface) 应用(程序)编程接口
appearance 外观
append 附加
application 应用、应用程序
application framework 应用程序框架
Approximate String Matching 模糊匹配
architecture 架构、体系结构
archive file 归档文件、存档文件
argument参数。
array 数组
arrow operator 箭头操作符
assert(ion) 断言
assign 赋值
assignment 赋值、分配
assignment operator 赋值操作符
associated 相关的、相关联的
asynchronous 异步的
attribute 特性、属性
authentication service 验证服务
authorization 授权
B
background 背景、后台(进程)
backup 备份
backup device备份设备
backup file 备份文件
backward compatible 向后兼容、向下兼容
base class 基类
base type 基类型
batch 批处理
BCL (base class library)基类库
Bin Packing 装箱问题
binary 二进制
binding 绑定
bit 位
bitmap 位图
block 块、区块、语句块
boolean 布林值(真假值,true或false)
border 边框
bounds checking 边界检查
boxing 装箱、装箱转换
brace (curly brace) 大括号、花括号
bracket (square brakcet) 中括号、方括号
breakpoint 断点
browser applications 浏览器应用(程序)
browser-accessible application 可经由浏览器访问的应用程序
bug 缺陷错误
build 编连(专指编译和连接)
built-in 内建、内置
bus 总线
business 业务、商务(看场合)
business Logic 业务逻辑
business rules 业务规则
buttons 按钮
by/through 通过
byte 位元组(由8 bits组成)
C
cache 高速缓存
calendar 日历
Calendrical Calculations 日期
call 调用
call operator 调用操作符
callback 回调
candidate key 候选键 (for database)
cascading delete 级联删除 (for database)
cascading update 级联更新 (for database)
casting 转型、造型转换
catalog 目录
chain 链(function calls)
character 字符
character format 字符格式
character set 字符集
check box 复选框
check button 复选按钮
CHECK constraints CHECK约束 (for database)
checkpoint 检查点 (for database)
child class 子类
CIL (common intermediate language)通用中间语言、通用中介语言
class 类
class declaration 类声明
class definition 类定义
class derivation list 类继承列表
class factory 类厂
class hierarchy 类层次结构
class library 类库
class loader 类装载器
class template 类模板
class template partial specializations 类模板部分特化
class template specializations 类模板特化
classification 分类
clause 子句
cleanup 清理、清除
CLI (Common Language Infrastructure) 通用语言基础设施
client 客户、客户端
client application 客户端应用程序
client area 客户区
client cursor 客户端游标 (for database)
client-server 客户机/服务器、客户端/服务器
clipboard 剪贴板
clone 克隆
CLS (common language specification) 通用语言规范
code access security 代码访问安全
code page 代码页
COFF (Common Object File Format) 通用对象文件格式
collection 集合
COM (Component Object Model) 组件对象模型
combo box 组合框
command line 命令行
comment 注释
commit 提交 (for database)
communication 通讯
compatible 兼容
compile time 编译期、编译时
compiler 编译器
component组件
composite index 复合索引、组合索引 (for database)
composite key 复合键、组合键 (for database)
composition 复合、组合
concept 概念
concrete具体的
concrete class 具体类
concurrency 并发、并发机制
configuration 配置、组态
Connected Components 连通分支
connection 连接 (for database)
connection pooling 连接池
console 控制台
constant 常量
Constrained and Unconstrained Optimization 最值问题
constraint 约束 (for database)
construct 构件、成分、概念、构造(for language)
constructor (ctor) 构造函数、构造器
container 容器
containment包容
context 环境、上下文
control 控件
cookie
copy 拷贝
CORBA 通用对象请求中介架构(Common Object Request Broker Architecture)
cover 覆盖、涵盖
create/creation 创建、生成
crosstab query 交叉表查询 (for database)
Cryptography 密码
CTS (common type system)通用类型系统
cube 多维数据集 (for database)
cursor 光标
cursor 游标 (for database)
custom 定制、自定义
D
data 数据
data connection 数据连接 (for database)
data dictionary 数据字典 (for database)
data file 数据文件 (for database)
data integrity 数据完整性 (for database)
data manipulation language (DML)数据操作语言(DML) (for database)
data member 数据成员、成员变量
data source 数据源 (for database)
Data source name (DSN) 数据源名称(DSN) (for database)
data structure数据结构
Data Structures 基本数据结构
data table 数据表 (for database)
data-bound 数据绑定 (for database)
database 数据库 (for database)
database catalog 数据库目录 (for database)
database diagram 数据关系图 (for database)
database file 数据库文件 (for database)
database object 数据库对象 (for database)
database owner 数据库所有者 (for database)
database project 数据库工程 (for database)
database role 数据库角色 (for database)
database schema 数据库模式、数据库架构 (for database)
database script 数据库脚本 (for database)
datagram 数据报文
dataset 数据集 (for database)
dataset 数据集 (for database)
DBMS (database management system)数据库管理系统 (for database)
DCOM (distributed COM)分布式COM
dead lock 死锁 (for database)
deallocate 归还
debug 调试
debugger 调试器
decay 退化
declaration 声明
default 缺省、默认值
DEFAULT constraint默认约束 (for database)
default database 默认数据库 (for database)
default instance 默认实例 (for database)
default result set 默认结果集 (for database)
defer 推迟
definition 定义
delegate 委托
delegation 委托
deploy 部署
derived class 派生类
design pattern 设计模式
destroy 销毁
destructor(dtor)析构函数、析构器
device 设备
DHTML (dynamic HyperText Markup Language)动态超文本标记语言
dialog 对话框
Dictionaries 字典
digest 摘要
digital 数字的
directive (编译)指示符
directory 目录
disassembler 反汇编器
DISCO (Discovery of Web Services)Web Services的查找
dispatch 调度、分派、派发
distributed computing 分布式计算
distributed query 分布式查询 (for database)
DNA (Distributed interNet Application) 分布式网间应用程序
document 文档
DOM (Document Object Model)文档对象模型
dot operator (圆)点操作符
double-byte character set (DBCS)双字节字符集(DBCS)
driver 驱动(程序)
DTD (document type definition) 文档类型定义
dump 转储
dump file 转储文件
E
e-business 电子商务
efficiency 效率
efficient 高效
encapsulation 封装
end user 最终用户
end-to-end authentication 端对端身份验证
engine 引擎
entity 实体
enum (enumeration) 枚举
enumerators 枚举成员、枚举器
equal 相等
equality 相等性
equality operator 等号操作符
error log 错误日志 (for database)
escape character 转义符、转义字符
escape code 转义码
evaluate 评估
event 事件
event driven 事件驱动的
event handler 事件处理器
evidence 证据
exception 异常
exception declaration 异常声明
exception handling 异常处理、异常处理机制
exception specification 异常规范
exception-safe 异常安全的
exit 退出
explicit 显式
explicit specialization 显式特化
explicit transaction 显式事务 (for database)
export 导出
expression 表达式
F
fat client 胖客户端
feature 特性、特征
fetch 提取
field 字段 (for database)
field 字段(java)
field length 字段长度 (for database)
file 文件
filter 筛选 (for database)
finalization 终结
finalizer 终结器
firewall 防火墙
flag 标记
flash memory 闪存
flush 刷新
font 字体
foreign key (FK) 外键(FK) (for database)
form 窗体
formal parameter 形参
forward declaration 前置声明
forward-only 只向前的
forward-only cursor 只向前游标 (for database)
framework 框架
full specialization 完全特化
function 函数
function call operator (即operator ()) 函数调用操作符
function object 函数对象
function template函数模板
functionality 功能
functor 仿函数
G
GC (Garbage collection) 垃圾回收(机制)、垃圾收集(机制)
generate 生成
generic 泛化的、一般化的、通用的
generic algorithm通用算法
genericity 泛型
getter (相对于 setter)取值函数
global 全局的
global object 全局对象
grant 授权 (for database)
group 组、群
group box 分组框
GUI 图形界面
GUID (Globally Unique Identifier) 全球唯一标识符
H
handle 句柄
handler 处理器
hard disk 硬盘
hard-coded 硬编码的
hard-copy 截屏图
hardware 硬件
hash table 散列表、哈希表
header file头文件
heap 堆
help file 帮助文件
hierarchical data 阶层式数据、层次式数据
hierarchy 层次结构、继承体系
high level 高阶、高层
hook 钩子
Host (application)宿主(应用程序)
hot key 热键
HTML (HyperText Markup Language) 超文本标记语言
HTTP (HyperText Transfer Protocol) 超文本传输协议
HTTP pipeline HTTP管道
hyperlink 超链接
I
icon 图标
IDE (Integrated Development Environment)集成开发环境
identifier 标识符
IDL (Interface Definition Language) 接口定义语言
idle time 空闲时间
if and only if当且仅当
IL (Intermediate Language) 中间语言、中介语言
image 图象
IME 输入法
immediate base 直接基类
immediate derived 直接派生类
immediate updating 即时更新 (for database)
implement 实现
implementation 实现、实现品
implicit 隐式
implicit transaction隐式事务 (for database)
import 导入
incremental update 增量更新 (for database)
Independent Set 独立集
index 索引 (for database)
infinite loop 无限循环
infinite recursive 无限递归
information 信息
inheritance 继承、继承机制
initialization 初始化
initialization list 初始化列表、初始值列表
initialize 初始化
inline 内联
inline expansion 内联展开
inner join 内联接 (for database)
instance 实例
instantiated 具现化、实体化(常应用于template)
instantiation 具现体、具现化实体(常应用于template)
integrate 集成、整合
integrity 完整性、一致性
integrity constraint完整性约束 (for database)
interacts 交互
interface 接口
interoperability 互操作性、互操作能力
interpreter 解释器
introspection 自省
invariants 不变性
invoke 调用
isolation level 隔离级别 (for database)
item 项、条款、项目
iterate 迭代
iteration 迭代(回圈每次轮回称为一个iteration)
iterative 反复的、迭代的
iterator 迭代器
J
JIT compilation JIT编译即时编译
Job Scheduling 工程安排
K
key 键 (for database)
key column 键列 (for database)
L
left outer join 左向外联接 (for database)
level 阶、层例
library 库
lifetime 生命期、寿命
Linear Programming 线性规划
link 连接、链接
linkage 连接、链接
linker 连接器、链接器
list 列表、表、链表
list box 列表框
literal constant 字面常数
livelock 活锁 (for database)
load 装载、加载
load balancing 负载平衡
loader 装载器、载入器
local 局部的
local object 局部对象
lock 锁
log 日志
login 登录
login security mode登录安全模式 (for database)
lookup table 查找表 (for database)
loop 循环
loose coupling 松散耦合
lvalue 左值
M
machine code 机器码、机器代码
macro 宏
maintain 维护
managed code 受控代码、托管代码
Managed Extensions 受控扩充件、托管扩展
managed object 受控对象、托管对象
manifest 清单
many-to-many relationship 多对多关系 (for database)
many-to-one relationship 多对一关系 (for database)
marshal 列集
Matching 匹配
member 成员
member access operator 成员取用运算子(有dot和arrow两种)
member function 成员函数
member initialization list成员初始值列表
memory 内存
memory leak 内存泄漏
menu 菜单
message 消息
message based 基于消息的
message loop 消息环
message queuing消息队列
metadata 元数据
metaprogramming元编程
method 方法
micro 微
middle tier 中间层
middleware 中间件
modeling 建模
modeling language 建模语言
modem 调制解调器
modifier 修饰字、修饰符
module 模块
most derived class最底层的派生类
mouse 鼠标
multi-tasking 多任务
multi-thread 多线程
multicast delegate 组播委托、多点委托
multithreaded server application 多线程服务器应用程序
multiuser 多用户
mutable 可变的
mutex 互斥元、互斥体
N
named parameter 命名参数
named pipe 命名管道
namespace 名字空间、命名空间
native 原生的、本地的
native code 本地码、本机码
nested class 嵌套类
nested query 嵌套查询 (for database)
nested table 嵌套表 (for database)
network 网络
network card 网卡
Network Flow 网络流
O
object 对象
object based 基于对象的
object model 对象模型
object oriented 面向对象的
ODBC data source ODBC数据源 (for database)
ODBC driver ODBC驱动程序 (for database)
one-to-many relationship 一对多关系 (for database)
one-to-one relationship 一对一关系 (for database)
operating system (OS) 操作系统
operation 操作
operator 操作符、运算符
option 选项
outer join 外联接 (for database)
overflow 上限溢位(相对于underflow)
overload 重载
override 覆写、重载、重新定义
P
package 包
packaging 打包
palette 调色板
parallel 并行
parameter 参数、形式参数、形参
parameter list 参数列表
parameterize 参数化
parent class 父类
parentheses 圆括弧、圆括号
parse 解析
parser 解析器
part 零件、部件
partial specialization 局部特化
pass by reference 引用传递
pass by value 值传递
pattern 模式
persistence 持久性
pixel 像素
placeholder 占位符
platform 平台
Point Location 位置查询
pointer 指针
polymorphism 多态
pooling 池化
pop up 弹出式
port 端口
postfix 后缀
precedence 优先序(通常用于运算子的优先执行次序)
prefix 前缀
preprocessor 预处理器
primary key (PK)主键(PK) (for database)
primary table 主表 (for database)
primitive type 原始类型
print 打印
printer 打印机
procedure 过程
process 进程
program 程序
programmer 程序员
programming编程、程序设计
progress bar 进度指示器
project 项目、工程
property 属性
protocol 协议
pseudo code伪码
Q
qualified 合格的
qualifier 修饰符
quality 质量
queue 队列
R
radio button 单选按钮
random number 随机数
Random Number Generation 随机数生成
range 范围、区间
rank 等级
raw 未经处理的
re-direction 重定向
readOnly只读
record 记录 (for database)
recordset 记录集 (for database
recursion —— 递归
recursive 递归
refactoring 重构
refer 引用、参考
reference 引用、参考
reflection 反射
refresh data 刷新数据 (for database)
register 寄存器
regular expression 正则表达式
relational database 关系数据库
remote 远程
remote request 远程请求
represent 表述,表现
resolution 解析过程
resolve 解析、决议
result set 结果集 (for database)
retrieve data 检索数据
return 返回
return type 返回类型
return value 返回值
revoke 撤销
right outer join 右向外联接 (for database)
robust 健壮
robustness 健壮性
roll back 回滚 (for database)
roll forward 前滚 (for database)
routine 例程
row 行 (for database)
rowset 行集 (for database)
RPC (remote procedure call)RPC(远程过程调用)
runtime 执行期、运行期、执行时、运行时
rvalue 右值
S
Satisfiability 可满足性
save 保存
savepoint 保存点 (for database)
SAX (Simple API for XML)
scalable 可伸缩的、可扩展的
schedule 调度
scheduler 调度程序
schema 模式、纲目结构
scope 作用域、生存空间
screen 屏幕
scroll bar滚动条
SDK (Software Development Kit)软件开发包
sealed class 密封类
search 查找
Searching 查找
semantics 语义
sequential container序列式容器
serial 串行
serialization/serialize 序列化
server 服务器、服务端
session 会话 (for database)
Set and String Problems 集合与串的问题
Set Cover 集合覆盖
Set Data Structures 集合
Set Packing 集合配置
setter 设值函数
side effect 副作用
signature 签名
single-threaded 单线程
slider滑块
slot 槽
SMTP (Simple Mail Transfer Protocol) 简单邮件传输协议
snapshot 截屏图
snapshot 快照 (for database)
SOAP (simple object access protocol) 简单对象访问协议
software 软件
Sorting 排序
source code 源码、源代码
specialization 特化
specification 规范、规格
splitter 切分窗口
SQL (Structured Query Language) 结构化查询语言 (for database)
stack 栈、堆栈
standard library 标准库
standard template library 标准模板库
stateless 无状态的
statement 语句、声明
static cursor 静态游标 (for database)
static SQL statements 静态SQL语句 (for database)
status bar 状态条
stored procedure 存储过程 (for database)
stream 流
string 字符串
String Matching 模式匹配
stub 存根
subobject子对象
subquery 子查询 (for database)
subscript operator 下标操作符
support 支持
suspend 挂起
symbol 记号
syntax 语法
system databases 系统数据库 (for database)
system tables 系统表 (for database)
T
table 表 (for database)
table-level constraint 表级约束 (for database)
target 标的,目标
task switch 工作切换
TCP (Transport Control Protocol) 传输控制协议
template 模板
temporary object 临时对象
temporary table 临时表 (for database)
text 文本
Text Compression 压缩
text file 文本文件
thin client 瘦客户端
third-party 第三方
thread 线程
thread-safe 线程安全的
throw 抛出、引发(常指发出一个exception)
trace 跟踪
transaction 事务 (for database)
transaction log 事务日志 (for database)
transaction rollback 事务回滚 (for database)
traverse 遍历
trigger 触发器 (for database)
type 类型
U
UDDI(Universary Description, Discovery and Integration)统一描述、查询与集成
UML (unified modeling language)统一建模语言
unary function 单参函数
unary operator 一元操作符
unboxing 拆箱、拆箱转换
underflow 下限溢位(相对于overflow)
Unicode 统一字符编码标准,采用双字节对字符进行编码
Union query 联合查询 (for database)
UNIQUE constraints UNIQUE约束 (for database)
unique index 唯一索引 (for database)
unmanaged code 非受控代码、非托管代码
unmarshal 散集
unqualified 未经限定的、未经修饰的
URI (Uniform Resource identifier) 统一资源标识符
URL (Uniform Resource Locator) 统一资源定位器
user 用户
user interface 用户界面
V
value types 值类型
variable 变量
vector 向量(一种容器,有点类似array)
vendor 厂商
viable 可行的
video 视频
view 视图 (for database)
view 视图
virtual function 虚函数
virtual machine 虚拟机
virtual memory 虚拟内存
W
Web Services web服务
WHERE clause WHERE子句 (for database)
wildcard characters 通配符字符 (for database)
wildcard search 通配符搜索 (for database)
window 窗口
window function 窗口函数
window procedure 窗口过程
Windows authentication Windows身份验证
wizard 向导
word 单词
write enable 写启用 (for database)
write-only 只写
WSDL (Web Service Description Language)Web Service描述语言
X
XML (eXtensible Markup Language) 可扩展标记语言
XML Message Interface (XMI) XML消息接口
XSD (XML Schema Definition) XML模式定义语言
XSL (eXtensible Stylesheet Language) 可扩展样式表语言
XSLT (eXtensible Stylesheet Language Transformation)可扩展样式表语言转换
xxx based 基于xxx的
xxx oriented 面向xxx
//创建表Table_1
CREATE TABLE [dbo].[Table_1](
[id] [int] NOT NULL,
[result] [nchar](10) NOT NULL,
CONSTRAINT [PK_Table_1] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
//创建表Table_2
CREATE TABLE [dbo].[Table_2](
[id] [int] IDENTITY(1,1) NOT NULL,
[G_id] [int] NOT NULL,
[C1] [nvarchar](50) NULL,
[C2] [nvarchar](50) NULL,
[C3] [nchar](10) NULL,
CONSTRAINT [PK_Table_2] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Table_2] WITH CHECK ADD CONSTRAINT [FK_Table_2_Table_2] FOREIGN KEY([id])
REFERENCES [dbo].[Table_2] ([id])
GO
ALTER TABLE [dbo].[Table_2] CHECK CONSTRAINT [FK_Table_2_Table_2]
GO
//插入测试数据
insert into [Table_1] (id,result) values (1,'未月结')
go
insert into Table_2 ([G_id],[C1],[C2],[C3]) VALUES (1,'aa','aa','aa')
insert into Table_2 ([G_id],[C1],[C2],[C3]) VALUES (1,'bb','bb','bb')
insert into Table_2 ([G_id],[C1],[C2],[C3]) VALUES (2,'cc','cc','cc')
go
//创建触发器
CREATE TRIGGER [dbo].[tri_table_1]
ON [dbo].[Table_1]
AFTER UPDATE
AS
if Update(result)
BEGIN
update Table_2 set C2='ok'
from Table_2 t, Deleted d ,Inserted i
where i.id=t.G_id
SET NOCOUNT ON;
-- Insert statements for trigger here
END
GO
当执行 update Table_1 set result='已月结' where id=1 后 执行 触发器 tri_table_1 将 table_2 中 id为1 的 C2列 更新为 ok
NET中操作数字证书,包括如何生成证书、编程操作证书、创建发行者证书等等步骤。
.NET为我们提供了操作数字证书的两个主要的类,分为为:
System.Security.Cryptography.X509Certificates.X509Certificate2类, 每个这个类的实例可以表示一个证书;
System.Security.Cryptography.X509Certificates.X509Store类,可以对保存在计算机安全区域内的证书进行add/remove/get操作。
另外我们可以使用System.Security.Cryptography.X509Certificates.X509Certificate2UI类来显示证书消息的对话框,它就是在IE中的证书查看器的.NE实现。
生成证书
在介绍以上类的使用方法之前,我们先要拥有一个数字证书,获取数字证书有三种方法,一是从CA机构申请,二是自己搭建服务器发布证书,三是使用makecert.exe来生成一个证书文件。这里我们使用makecert.exe来生成一个证书文件,用来测试。启动VS2010的命令行,输入对应参数,生成名为TestCertificates的证书文件。如图6-28所示

图6-28 生成证书
makecert.exe的参数读者可以查看帮助,这里只解释图6-28中的参数。
参数说明:
-sr CurrentUser:指定主题的证书存储位置。Location 可以是 currentuser(默认值)或 localmachine
-ss MyTestContainer:指定主题的证书存储名称,输出证书即存储在那里。
-n CN=TestCert:指定主题的证书名称。此名称必须符合 X.500 标准。最简单的方法是在双引号中指定此名称,并加上前缀 CN=;例如,"CN=myName"。
-sky exchange:指定颁发者的密钥类型,必须是 signature、exchange 或一个表示提供程序类型的整数。默认情况下,可传入 1 表示交换密钥,传入 2 表示签名密钥。
-pe:将所生成的私钥标记为可导出。这样可将私钥包括在证书中。
生成的密钥文件被保存在了我们指定的MyTestContainer中,但到哪去查看我们的证书呢?Windows没有给我们准备好直接的管理证书的入口,但我们可以在MMC控制台自行添加。
开始 运行 MMC,打开一个空的MMC控制台。
在控制台菜单,文件 添加/删除管理单元 添加按钮 选"证书" 添加 选"我的用户账户" 关闭 确定
在控制台菜单,文件 添加/删除管理单元 添加按钮 选"证书" 添加 选"计算机账户" 关闭 确定
如图6-29,我们可以查看两个账户的证书管理,在我的账户中可以看到MyTestContainer下的证书TestCert。

图6-29 在MMC控制台查看和管理证书
当然我们也可以将证书文件保存为文件,如图6-30所示
图6-30 将证书保存为文件
打开E盘,可以看到生成的证书文件。如图6-31所示。

图6-31 生成的证书文件
将证书保存为文件时,我们有三种选择:
带有私钥的证书由Public Key Cryptography Standards #12,PKCS#12标准定义,包含了公钥和私钥的二进制格式的证书形式,以pfx作为证书文件后缀名。
二进制编码的证书证书中没有私钥,DER 编码二进制格式的证书文件,以cer作为证书文件后缀名。
Base64编码的证书证书中没有私钥,BASE64 编码格式的证书文件,也是以cer作为证书文件后缀名。
右键单击本地的证书文件,我们可以看到安装选项,可以把该证书文件安装到证书存储区。也可在MMC的证书管理台上执行导出任务将存储区的证书导出为文件。这里就不再演示了,读者可以自行实践。
编程操作证书
我们可以通过编程的方式操作操作本地的证书文件和在存储区中的证书。我们以刚才保存在E盘的test.cer文件为例,讲解如何读取本地的证书文件,并将它添加到存储区中。先看代码清单6-17。
代码清单 6-17 操作本地证书文件
class OperCert { internal static byte[] ReadFile(string fileName) { FileStream f = new FileStream(fileName, FileMode.Open, FileAccess.Read); int size = (int)f.Length; byte[] data = new byte[size]; size = f.Read(data, 0, size); f.Close(); return data; } static void Main(string[] args) { try { X509Certificate2 x509 = new X509Certificate2(); byte[] rawData = ReadFile(@"e:\test.cer"); x509.Import(rawData); Console.WriteLine("{0}Subject: {1}{0}", Environment.NewLine, x509.Subject); Console.WriteLine("{0}Issuer: {1}{0}", Environment.NewLine, x509.Issuer); Console.WriteLine("{0}Version: {1}{0}", Environment.NewLine, x509.Version); Console.WriteLine("{0}Valid Date: {1}{0}", Environment.NewLine, x509.NotBefore); Console.WriteLine("{0}Expiry Date: {1}{0}", Environment.NewLine, x509.NotAfter); Console.WriteLine("{0}Thumbprint: {1}{0}", Environment.NewLine, x509.Thumbprint); Console.WriteLine("{0}Serial Number: {1}{0}", Environment.NewLine, x509.SerialNumber); Console.WriteLine("{0}Friendly Name: {1}{0}", Environment.NewLine, x509.PublicKey.Oid.FriendlyName); Console.WriteLine("{0}Public Key Format: {1}{0}", Environment.NewLine, x509.PublicKey.EncodedKeyValue.Format(true)); Console.WriteLine("{0}Raw Data Length: {1}{0}", Environment.NewLine, x509.RawData.Length); Console.WriteLine("{0}Certificate to string: {1}{0}", Environment.NewLine, x509.ToString(true)); Console.WriteLine("{0}Certificate to XML String: {1}{0}", Environment.NewLine, x509.PublicKey.Key.ToXmlString(false)); X509Store store = new X509Store(); store.Open(OpenFlags.MaxAllowed); store.Add(x509); store.Close(); } catch (Exception e) { Console.WriteLine("Error:"+e.Message); } } } 代码清单6-17演示了如何读取本地证书文件的方法。静态方法ReadFile用来从本地磁盘中读取证书文件到byte数组中。主要的操作都在Main方法中。X509Certificate2 x509 = new X509Certificate2()一句使用无参数的构造函数初始化X509Certificate2类的实例x509。然后我们使用x509.Import(rawData)语句将byte数组导入到当前证书实例。接下来是输出该证书的信息。
输出信息之后,我们看下面的四行代码:
X509Store store = new X509Store(); store.Open(OpenFlags.MaxAllowed); store.Add(x509); store.Close();
首先我们初始化一个X509Store类的实例store,然后使用Open方法打开存储区,添加上面读取的证书到存储区。
X509Certificate2一共提供了14个构造函数供我们使用,这里就不一一介绍了。我们也可以通过X509Certificate2类的构造函数直接导入本地的证书文件,可以使用代码清单6-18所示的方式。
代码清单6-18 使用构造函数导入证书文件
X509Certificate2 myX509Certificate2 = new X509Certificate2( @"e:\MyTestCert.pfx", //证书路径 "password", //证书的私钥保护密码 X509KeyStorageFlags.Exportable //表示此证书的私钥以后还可以导出 );
代码清单6-18给出了如何导入带私钥保护密码的证书的方法。X509KeyStorageFlags 枚举用来标识X.509 证书的私钥导出到何处以及如何导出。该枚举的成员说明如表6-1所示。
表6-1 X509KeyStorageFlags 枚举说明
成员名称
说明
DefaultKeySet
使用默认的密钥集。用户密钥集通常为默认值。
UserKeySet
私钥存储在当前用户存储区而不是本地计算机存储区。既使证书指定密钥应存储在本地计算机存储区,私钥也会存储到当前用户存储区。
MachineKeySet
私钥存储在本地计算机存储区而不是当前用户存储区。
Exportable
导入的密钥被标记为可导出。
UserProtected
通过对话框或其他方法,通知用户密钥被访问。使用的加密服务提供程序 (CSP) 定义确切的行为。
PersistKeySet
导入证书时会保存与 PFX 文件关联的密钥。
那么如何操作存储区中的证书呢,可以使用代码清单6-19的方式。
代码清单6-19 操作存储区中的证书
X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser); store.Open(OpenFlags.ReadOnly); //轮询存储区中的所有证书 foreach(X509Certificate2 myX509Certificate2 in store.Certificates) { //将证书的名称跟要导出的证书MyTestCert比较,找到要导出的证书 if (myX509Certificate2.Subject == "CN=TestCert") { //证书导出到byte[]中,password为私钥保护密码 byte[] CertByte = myX509Certificate2.Export(X509ContentType.Pfx,"password"); //将证书的字节流写入到证书文件 FileStream fStream = new FileStream( @"C:\Samples\PartnerAEncryptMsg\MyTestCert_Exp.pfx", FileMode.Create, FileAccess.Write); fStream.Write(CertByte, 0, CertByte.Length); fStream.Close(); } } store.Close();
代码清单6-19首先声明X509Store类的实例store,使用了两个参数的构造函数,第一个参数是存储容器的名称,StoreName枚举只能枚举系统默认的存储区名称。第二个参数是StoreLocation枚举,用来标识是本机证书还是当前用户证书。导出容器证书使用的是Export方法。第一个参数X509ContentType.Pfx表示要导出为含有私钥的pfx证书形式,第二个参数为私钥保护密码。如果要导出为不含私钥的cer证书,第一个参数使用X509ContentType.Cert,表示导出为不含私钥的cer证书,也就不需要密码了。
创建发行者证书
发行者证书是验证发行者可靠性的证书文件,保护证书发行者的签名。我们可以从证书颁发机构获得该文件。做为程序测试,我们可以使用Cert2spc.exe来生成发行者证书。从命令行启动该程序,如图6-32所示。

图6-32 生成SPC文件
如图6-32,我们使用Cert2spc.exe以test.cer为参数生成目标为tset.spc的发行者证书,如果存在多个证书文件,可以作为参数以空格隔开生成统一的发行者证书。
使用证书对文件签名
签名工具 (SignTool.exe) 是一个命令行工具,用于对文件进行数字签名,验证文件或时间戳文件中的签名。我们可以对cab文件、dll文件或者其他文件进行签名,从互联网访问这些文件的时候就需要安装和验证证书。该工具详细的说明读者可以从MSDN上找到。