这一断,影响了我将近90%的网络生活.
flickr上不去
delicious上不去
google搜索出来的结果无法打开
卡巴没法升级
还好有”套”可以支撑一下
更不幸的是我们公司部分组的exchange是直连美国的,而剩下的人是连电信的.导致他们群发的邮件我们收不到
希望这次瘫痪不要持续更长时间,希望以后我们能多几个国际出口,希望世界不要有战争
这一断,影响了我将近90%的网络生活.
flickr上不去
delicious上不去
google搜索出来的结果无法打开
卡巴没法升级
还好有”套”可以支撑一下
更不幸的是我们公司部分组的exchange是直连美国的,而剩下的人是连电信的.导致他们群发的邮件我们收不到
希望这次瘫痪不要持续更长时间,希望以后我们能多几个国际出口,希望世界不要有战争
今天早上到公司,发现google搜索的结果没有一个能打开的,很奇怪.
后来听说因为台湾地震才导致访问国外网站不正常.
看看谷歌的资讯,发现了这么一段话
跨太平洋到中国内地的光缆大部分要途径香港、台湾等地区,所以台湾强烈地震对海底光缆造成了很大影响,导致用户不能正常访问国外网站。
但是为什么gmail,google.com, google reader, blogger都是正常的呢?
我用tracert跟踪了一下,现将结果贴上来,如果有人看到了,希望能一起讨论一下.
cn.engadget.com,连接超时
F:\download>tracert cn.engadget.comTracing route to cn.engadget.com [206.252.155.14]
over a maximum of 30 hops:1 1 ms <1 ms 1 ms host_209_13_235_219.gotonets.com [219.235.13.209
]
2 1 ms 1 ms <1 ms 192.168.213.73
3 1 ms 1 ms 1 ms 218.1.3.141
4 9 ms 28 ms 9 ms 218.1.3.29
5 1 ms 1 ms 1 ms 218.1.5.30
6 5 ms 5 ms 5 ms 218.1.5.134
7 2 ms 1 ms 1 ms 192.168.229.54
8 3 ms 2 ms 2 ms 172.16.254.226
9 2 ms 2 ms 2 ms 172.16.254.178
10 2 ms 2 ms 3 ms host_121_14_235_219.gotonets.com [219.235.14.121
]
11 5 ms 5 ms 7 ms 124.243.197.73
12 4 ms 7 ms 7 ms 61.152.240.181
13 12 ms 14 ms 8 ms 61.152.240.105
14 785 ms 149 ms 76 ms 61.152.87.233
15 6 ms 8 ms 5 ms 202.101.63.242
16 29 ms 30 ms 30 ms 202.97.34.133
17 30 ms 29 ms 29 ms 202.97.53.86
18 * * * Request timed out.
19 * 306 ms * so-4-0-0.mpr2.lax9.us.above.net [64.125.12.125]20 * * * Request timed out.
21 343 ms * * so-4-0-0.cr1.dfw2.us.above.net [64.125.29.22]
22 * * 339 ms so-0-0-0.cr2.dfw2.us.above.net [64.125.28.210]
23 * * * Request timed out.
24 * * * Request timed out.
25 * * * Request timed out.
26 * * * Request timed out.
27 * * * Request timed out.
28 * * * Request timed out.
29 * * 381 ms above1-cr-2-ge-1-2.core.logicworks.net [206.252.
140.141]
30 * * * Request timed out.
google.com,正常打开,速度挺快
F:\download>tracert www.google.comTracing route to www-china.l.google.com [66.249.89.99]
over a maximum of 30 hops:1 1 ms <1 ms <1 ms host_209_13_235_219.gotonets.com [219.235.13.209
]
2 1 ms 1 ms <1 ms 192.168.213.73
3 2 ms 2 ms 1 ms 218.1.3.141
4 80 ms 3 ms 6 ms 218.1.3.29
5 1 ms 5 ms 1 ms 218.1.5.30
6 6 ms 5 ms 5 ms 218.1.5.134
7 2 ms 2 ms 2 ms 192.168.229.54
8 2 ms 2 ms 3 ms 172.16.254.226
9 2 ms 2 ms 2 ms 172.16.254.178
10 9 ms 4 ms 6 ms host_121_14_235_219.gotonets.com [219.235.14.121
]
11 6 ms 3 ms 7 ms 124.243.197.73
12 5 ms 8 ms 5 ms 61.152.240.89
13 7 ms 8 ms 6 ms 61.152.240.117
14 8 ms 5 ms 6 ms 61.152.87.233
15 7 ms 4 ms 5 ms 202.101.63.242
16 5 ms 5 ms 5 ms 202.97.33.94
17 10 ms 6 ms 9 ms 202.97.33.178
18 40 ms 41 ms 40 ms 202.97.4.46
19 56 ms 50 ms 41 ms 216.239.47.54
20 41 ms 44 ms 42 ms 66.249.89.99Trace complete.
google.cn,正常打开,速度挺快
F:\download>tracert www.google.cnTracing route to cn.l.google.com [59.151.21.101]
over a maximum of 30 hops:1 1 ms 1 ms 1 ms host_209_13_235_219.gotonets.com [219.235.13.209
]
2 1 ms <1 ms 3 ms 192.168.213.73
3 2 ms 2 ms 2 ms 218.1.3.77
4 4 ms 2 ms 1 ms 218.1.3.1
5 1 ms 3 ms 1 ms 218.1.5.2
6 10 ms 6 ms 6 ms 218.1.5.70
7 4 ms 5 ms 3 ms 192.168.224.30
8 2 ms 3 ms 5 ms 172.16.254.226
9 4 ms 2 ms 2 ms 172.16.254.178
10 8 ms 7 ms 7 ms host_121_14_235_219.gotonets.com [219.235.14.121
]
11 11 ms 15 ms 10 ms 124.243.197.73
12 12 ms 7 ms 3 ms 61.152.240.89
13 4 ms 5 ms 7 ms 61.151.250.49
14 9 ms 8 ms 7 ms 61.152.87.237
15 10 ms 10 ms 10 ms 202.101.63.202
16 36 ms 32 ms 31 ms 202.97.34.61
17 35 ms 27 ms 30 ms 202.97.57.222
18 30 ms 28 ms 26 ms bj141-130-126.bjtelecom.net [219.141.130.126]
19 26 ms 27 ms 28 ms 219.142.1.70
20 30 ms 30 ms 30 ms 220.181.17.5
21 29 ms 28 ms 27 ms 211.151.224.194
22 27 ms 28 ms 27 ms 211.151.255.42
23 28 ms 29 ms 30 ms 59.151.21.101Trace complete.
www2.blogger.com,正常打开,速度比较慢
F:\download>tracert www2.blogger.comTracing route to blogger.l.google.com [72.14.207.191]
over a maximum of 30 hops:1 1 ms <1 ms 1 ms host_209_13_235_219.gotonets.com [219.235.13.209
]
2 2 ms 1 ms 3 ms 192.168.213.73
3 1 ms 1 ms 1 ms 218.1.3.77
4 40 ms 211 ms 3 ms 218.1.3.9
5 2 ms 1 ms 1 ms 218.1.5.10
6 10 ms 7 ms 6 ms 218.1.5.70
7 3 ms 6 ms 2 ms 192.168.224.30
8 7 ms 7 ms 4 ms 172.16.254.226
9 3 ms 2 ms 2 ms 172.16.254.178
10 3 ms 3 ms 5 ms host_121_14_235_219.gotonets.com [219.235.14.121
]
11 4 ms 6 ms 3 ms 124.243.197.73
12 11 ms 12 ms 18 ms 61.152.240.89
13 6 ms 4 ms 4 ms 61.152.240.157
14 5 ms 5 ms 5 ms 61.152.87.233
15 5 ms 4 ms 6 ms 202.101.63.254
16 7 ms 5 ms 5 ms 202.97.33.14
17 7 ms 8 ms 7 ms 202.97.33.54
18 42 ms 43 ms 42 ms 202.97.4.46
19 * 192 ms 192 ms 216.239.47.237
20 199 ms 200 ms * 72.14.239.13
21 198 ms 201 ms * 72.14.233.55
22 243 ms * 250 ms 72.14.233.118
23 250 ms 244 ms 251 ms 72.14.232.113
24 251 ms 254 ms 250 ms 66.249.94.118
25 * 350 ms * eh-in-f191.google.com [72.14.207.191]
26 356 ms 359 ms * eh-in-f191.google.com [72.14.207.191]
27 * 344 ms 343 ms eh-in-f191.google.com [72.14.207.191]Trace complete.
打开注册表编辑器(regedit)
找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\View Source Editor\Editor Name
如果没有这个项,就手工建一个
将Editor Name的值改为: C:\windows\notepad.exe,如果你想改成别的编辑器就把这个路径改掉
以前使用OWC的PivotTable都是为该对象设定一个连接串,然后在指定一条sql语句,这个PivotTable就能连接到数据库上,并把内容显示出来了.
这是在局域网上.但如果在互联网上呢,你还敢把连接串放到网页里面吗?即使放了,你的数据库服务器也很有可能在内网中,网关不做端口转发,你仍旧访问不到.那该怎么办呢?
别怕,我们用XML作为其数据源.
步骤是这样的:
客户端利用Ajax请求服务器的一个页面(datasource.aspx)
datasource.aspx将访问数据库,并将读到的结果放到一个DataTable对象中
利用自己写的一个函数将DataTable的XML转换成RecordSet XML
返回该XML
客户端声明一个XML对象,将字符串转换成XML Document
客户端声明一个RecodSet对象,将XMLDocument作为其数据源,并打开数据源
指定PivotTable的数据源为上面的RecordSet对象,从而完成了对数据源的加载
后面再根据需要操作PivotTable将某些列添加到行/列/过滤/内容区域
总体顺序是这样的,我把部分代码贴上来,供大家参考.
/// <summary>
/// 将DataTable转换成RecordXML函数
/// </summary>
/// <param name="dt">要转换的DataTable</param>
/// <returns>转换好的XML字符串</returns>
public static string ConvertDataTableToXML(DataTable dt)
{
/*DataTable支持的数据类型
system.int64
system.byte[]
system.boolean
system.string
system.datetime
system.decimal
system.double
system.int32
system.single
system.int16
system.object
system.byte
system.guid
*/
string TempValue;
for(int i = 0; i < dt.Columns.Count; i++)
{
TempValue = dt.Columns[i].ColumnName;
Regex rex = new Regex("\\W");
TempValue = rex.Replace(TempValue, "");
rex = new Regex("^\\d");
if(rex.Replace(TempValue, "").Length != TempValue.Length)
{
TempValue = "N" + TempValue;
}
dt.Columns[i].ColumnName = TempValue;
}
StringBuilder sb = new StringBuilder();
sb.Append("<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'");
sb.Append("\txmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'");
sb.Append("\txmlns:rs='urn:schemas-microsoft-com:rowset'");
sb.Append("\txmlns:z='#RowsetSchema'>");
sb.Append("<s:Schema id='RowsetSchema'>");
sb.Append("\t<s:ElementType name='row' content='eltOnly' rs:CommandTimeout='30'>");
for (int i = 0; i < dt.Columns.Count; i++)
{
string DataType;
switch (dt.Columns[i].DataType.ToString().ToLower())
{
case "system.boolean":
DataType = "string";
break;
case "system.byte":
case "system.int16":
case "system.int32":
case "system.int64":
DataType = "int";
break;
case "system.decimal":
case "system.double":
case "system.single":
DataType = "float";
break;
case "system.string":
DataType = "string";
break;
case "system.datetime":
DataType = "datetime";
break;
default:
throw new ArgumentException();
}
sb.Append("\t\t<s:AttributeType name='" + dt.Columns[i].ColumnName + "' rs:number='" + (i + 1).ToString() + "' rs:writeunknown='true'>");
sb.Append("\t\t\t<s:datatype dt:type='" + DataType + "' dt:maxLength='100' rs:maybenull='true' />");
sb.Append("\t\t</s:AttributeType>");
}
sb.Append("\t\t<s:extends type='rs:rowbase' />");
sb.Append("\t</s:ElementType>");
sb.Append("</s:Schema>");
sb.Append("<rs:data>");
for (int i = 0; i < dt.Rows.Count; i++)
{
sb.Append("\t<z:row ");
for (int j = 0; j < dt.Columns.Count; j++)
{
TempValue = dt.Rows[i][j].ToString().Replace("<", "").Replace(">", "").Replace("'", "").Replace("\"", "");
if (dt.Columns[j].DataType.ToString().ToLower() == "system.datetime" && TempValue == string.Empty)
{
TempValue = INVALIDDATE.ToString(DATEMASK);
}
sb.Append(dt.Columns[j].ColumnName + "='" + TempValue + "' ");
}
sb.Append("/>");
}
sb.Append("</rs:data>");
sb.Append("</xml>");
return sb.ToString();
}
通过这个函数就能将一个DataTable转换成RecordSet XML
下面是完整的客户端页面,包括详尽的注释(牵扯到公司有关的代码都被我Cut掉了,但不影响这个页面)
<html>
<head>
<script language="javascript" type="text/javascript">
window.onload=LoadPage;
var SEP = "/,/";
var SEP2 = "/,,/";
//初始化报告参数
//TODO:这里为了做成通用的报告,变量名称需要变更
//需要添加到行区域的字段名称集合,以Common.SEP分割
var strRowFieldNames = "<%=Server.UrlDecode(Request.QueryString["RowFieldNames"])%>";
//需要添加到列区域的字段名称集合,以Common.SEP分割
var strColumnFieldNames = "<%=Server.UrlDecode(Request.QueryString["ColumnFieldNames"])%>";
//过滤字段名称集合,以Common.SEP分割
var strFilterFieldNames = "<%=Server.UrlDecode(Request.QueryString["FilterFieldNames"])%>";
//需要进行分段汇总的字段名称
//格式为:字段名/,,/分组类型/,,/起始值/,,/间隔值/,/第二个分组
//其中/,,/为Common.SEP2, /,/为Common.SEP
var strGroupFieldNamesAndValues = "<%=Server.UrlDecode(Request.QueryString["GroupFieldNamesAndValues"])%>";
//图表类型
var intChartType = parseInt("<%=Server.UrlDecode(Request.QueryString["ChartType"])%>");
//声明变量,用来存储页面上的OWC Object
//透视表对象及透视表的常量对象
var pvt, pvtconstants;
//图表对象及图标的常量对象
var cht, chtconstants;
function LoadPage()
{
//初始化透视表
InitPivotTable();
//初始化图表
InitChartSpace();
}
/**
* 初始化透视表
*/
function InitPivotTable()
{
//声明RecordSet对象
var adors = new ActiveXObject("ADODB.Recordset");
//声明XMLDocument对象
//TODO:msxml2.domdocument有可能是msxml3.domdocument或msxml4.domdocument,有待证明
var xmldoc = new ActiveXObject("msxml2.domdocument");
//服务器端返回的XML字符串,用来构造RecordSet
var str="<%=XMLString%>";
//XMLDocument对象加载XML字符串
xmldoc.loadXML(str);
//RecordSet设定数据源为上面的XMLDocument对象,并打开
adors.Open(xmldoc);
pvt = document.pvtTable;
pvtconstants = pvt.Constants;
//设定透视表的数据源为上面的RecordSet对象
pvt.DataSource = adors;
//设定透视表的一些属性,具体请参考OWC For VBA
pvt.AutoFit = true;
pvt.DisplayToolbar = true;
pvt.DisplayExpandIndicator = true;
pvt.DisplayAlerts = true;
pvt.DisplayBranding = true;
pvt.DisplayDesignTimeUI = true;
pvt.DisplayFieldList = true;
pvt.DisplayOfficeLogo = false;
pvt.DisplayPropertyToolbox = false;
pvt.DisplayScreenTips = true;
pvt.ActiveView.TitleBar.Visible = true;
pvt.ActiveView.TitleBar.Caption = "<%=Title%>";
pvt.ActiveView.TitleBar.Font.Name = "arial";
pvt.ActiveView.TitleBar.Font.Size = 10;
pvt.ActiveView.TotalBackColor = "CornSilk";
pvt.ActiveView.TotalFont.Name = "arial";
pvt.ActiveView.TotalFont.Size = 8;
pvt.ActiveView.FieldLabelFont.Name = "arial";
pvt.ActiveView.FieldLabelFont.Size = 8;
pvt.ActiveView.HeaderFont.Name = "arial";
pvt.ActiveView.HeaderFont.Size = 8;
pvt.ActiveView.PropertyCaptionFont.Name = "arial";
pvt.ActiveView.PropertyCaptionFont.Size = 8;
pvt.ActiveView.PropertyValueFont.Name = "arial";
pvt.ActiveView.PropertyValueFont.Size = 8;
pvt.ActiveView.ExpandMembers = pvtconstants.plExpandNever;
pvt.ActiveView.ExpandDetails = pvtconstants.plExpandNever;
//设定每一个字段的字体,字号,颜色等
for(var i = 0; i <= pvt.ActiveView.FieldSets.Count - 1; i++)
{
pvt.ActiveView.FieldSets(i).Fields(0).DetailFont.Name = "arial";
pvt.ActiveView.FieldSets(i).Fields(0).DetailFont.Size = 8;
pvt.ActiveView.FieldSets(i).Fields(0).GroupedFont.Name = "arial";
pvt.ActiveView.FieldSets(i).Fields(0).GroupedFont.Name = "arial";
pvt.ActiveView.FieldSets(i).Fields(0).GroupedFont.Size = 8;
pvt.ActiveView.FieldSets(i).Fields(0).SubtotalLabelFont.Name = "arial";
pvt.ActiveView.FieldSets(i).Fields(0).SubtotalLabelFont.Size = 8;
pvt.ActiveView.FieldSets(i).Fields(0).SubtotalFont.Name = "arial";
pvt.ActiveView.FieldSets(i).Fields(0).SubtotalFont.Size = 8;
pvt.ActiveView.FieldSets(i).Fields(0).SubtotalBackColor = "LightSteelBlue";
}
//将所有字段都添加到"过滤"区域
for(var i = 0; i < pvt.ActiveView.FieldSets.Count; i++)
{
pvt.ActiveView.FilterAxis.InsertFieldSet(pvt.ActiveView.FieldSets(i));
}
/*
* 添加一个"合计"字段
* AddTotal方法原型: AddTotal(Name, Field, Function)
* Name合计字段的名字
* Field需要进行合计的列对象
* Function合计方法
*/
var ctotal = pvt.ActiveView.AddTotal("汇总", pvt.ActiveView.FieldSets(0).Fields(0), pvtconstants.plFunctionCount);
/*
* 将"合计"字段添加到"数据区域"
* InsertTotal方法原型: InsertTotal(Total, Before)
* Total是一个PivotTotal类型的对象,也就是上面声明的对象
* Bebore是指定要在其之前插入总计的总计索引。如果不指定该参数,则总计插入到集合的末尾。
*/
pvt.ActiveView.DataAxis.InsertTotal(ctotal, 0);
//设定行区域
SetRowFields();
//设定列区域
SetColumnFields();
//设定明细区域
SetDataFields();
//设定分组
SetGroupFields();
/*
* 隐藏指定对象的明细单元格。
* 如果指定对象为 PivotData 对象,将隐藏所有明细单元格。
* 如果指定对象为 PivotRowMember 对象,将隐藏该行的所有明细单元格。
* 如果指定对象为 PivotColumnMember 对象,将隐藏该列的所有明细单元格。
*/
pvt.ActiveData.HideDetails();
}
//设定行区域
function SetRowFields()
{
if(strRowFieldNames == "")
{
return;
}
var OrgCollection = strRowFieldNames.split(SEP);
//循环要显示在行上的字段
for(var i = 0; i < OrgCollection.length; i++)
{
pvt.ActiveView.FieldSets(OrgCollection[i]).Fields(0).IsIncluded = true;
pvt.ActiveView.RowAxis.InsertFieldSet(pvt.ActiveView.FieldSets(OrgCollection[i]));
}
}
//设定列区域
function SetColumnFields()
{
if(strColumnFieldNames == "")
{
return;
}
var ColumnFieldsCollection = strColumnFieldNames.split(SEP);
for(var i = 0; i < ColumnFieldsCollection.length; i++)
{
pvt.ActiveView.FieldSets(ColumnFieldsCollection[i]).Fields(0).IsIncluded = true;
pvt.ActiveView.ColumnAxis.InsertFieldSet(pvt.ActiveView.FieldSets(ColumnFieldsCollection[i]));
}
}
//设定数据明细区域
function SetDataFields()
{
var ColumnFieldsCollection = strColumnFieldNames + SEP + strRowFieldNames + SEP + strFilterFieldNames + SEP;
for(var i = 0; i < pvt.ActiveView.FieldSets.Count; i++)
{
if(ColumnFieldsCollection.indexOf(pvt.ActiveView.FieldSets(i).Name + SEP) == -1)
{
pvt.ActiveView.DataAxis.InsertFieldSet(pvt.ActiveView.FieldSets(i));
}
}
}
//设定字段分组
function SetGroupFields()
{
//得到分组字段定义的数组,数组的每个元素是字段分组的一个完整定义
var GroupCollection = strGroupFieldNamesAndValues.split(SEP);
for(var i = 0; i < GroupCollection.length; i++)
{
if(GroupCollection[i] == "")
{
break;
}
//得到其中的一个字段分组定义
var OneGroupDefination = GroupCollection[i].split(SEP2);
if(OneGroupDefination.length != 4)
{
break;
}
//字段名称
var FieldName = OneGroupDefination[0];
//分组类型
var GroupMethod = parseInt(OneGroupDefination[1]);
//基数
var BaseAmount = parseFloat(OneGroupDefination[2]);
//间隔值
var IntervalAmount = parseFloat(OneGroupDefination[3]);
if(IntervalAmount == 0)
{
pvt.ActiveView.FieldSets(FieldName).Fields(0).GroupOn = pvtconstants.plGroupOnEachValue;
}
else
{
pvt.ActiveView.FieldSets(FieldName).Fields(0).GroupOn = GroupMethod;
pvt.ActiveView.FieldSets(FieldName).Fields(0).GroupInterval = IntervalAmount;
pvt.ActiveView.FieldSets(FieldName).Fields(0).GroupStart = BaseAmount;
}
}
}
//初始化图表
function InitChartSpace()
{
//设定图表对象
cht = document.chtSpace;
//图表常量
chtconstants = cht.Constants;
//设定图表数据源
cht.DataSource = pvt;
//设置图表的一些属性
cht.DisplayFieldButtons = false;
cht.object.Border.Color = -2;
cht.DisplayToolbar = true;
cht.DisplayFieldButtons = false;
cht.DisplayFieldList = false;
cht.DisplayOfficeLogo = false;
cht.HasChartSpaceLegend = true;
cht.HasPassiveAlerts = false;
//如果是柱状图(0)或3D柱状图(46)
if(intChartType == 0 || intChartType == 46)
{
cht.style.width = "100%";
}
//设定图表类型
cht.Charts(0).Type = intChartType;
}
</script>
</head>
<body>
<table cellspacing="0" cellpadding="0" border="0">
<tr>
<td>
<object id="pvtTable" style="width: 502px; height: 217px" height="217" width="502"
classid="clsid:0002E552-0000-0000-C000-000000000046" viewastext="VIEWASTEXT">
<param name="XMLData" value='<xml xmlns:x="urn:schemas-microsoft-com:office:excel">
<x:PivotTable>
<x:OWCVersion>10.0.0.6619 </x:OWCVersion>
<x:DisplayScreenTips/>
<x:CubeProvider>msolap.2</x:CubeProvider>
<x:CacheDetails/>
<x:PivotView>
<x:IsNotFiltered/>
</x:PivotView>
</x:PivotTable>
</xml>'>
</object>
</td>
</tr>
<tr>
<td>
<object id="chtSpace" classid="clsid:0002E556-0000-0000-C000-000000000046" viewastext>
</object>
</td>
</tr>
<tr height="100%">
<td>
</td>
</tr>
</table>
</body>
</html>
相关链接:
1. Office XP Web Component Toolpack
OWC组件的例子,如果里面有代码不能运行,请将HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\ActiveX Compatibility\{00000566-0000-0010-8000-00AA006D2EA4}注册表项删除,以启用ADOStream
2.OWC VBA参考,是一个chm文件,默认情况下在C:\Program Files\Common Files\Microsoft Shared\Web Components\11\2052\OWCVBA11.CHM 要看各个对象的属性什么的,可不能缺少这个.
IE7发布第二天装的,没想到它跟这么多网站不兼容,普通网站就算了,建行的网银竟然有部分功能无法使用.
IE卸载出奇的简单,到”添加删除程序”里找到它,点卸载,重启一下就搞定,如果没有就点一下”显示更新”就会有了.
建行网站在10月28号改版,新版本还是有很多问题,实在是太糟了.不知道这些开发人员懂不懂什么叫做网站.
另外每个网银的ActiveX密码控件实在是够烦人,在FF里面根本就没有替代功能.这一点支付宝做的不错,在IE中是ActiveX,在FF中是普通的文本框,这样能给使用其他浏览器的人带来极大的方便.
现在主机、域名一点都不稳定,而且还有可能被ban,所以写Blog的人应该多做几个备份,以备不时之需。
我备份在这几个地方:
Donews:http://my.donews.com/iworm
BlogSome:http://iworm.blogsome.com
前段时间可以访问的bloggoing和blogates现在不能访问了,比较郁闷。要不然那两个BSP也是不错的选择。
昨天也看到了范型这个被.Net 2.0支持的类型。
范型大概是这样的:比如说我们声明一个对象,但是这个对象的类型我们在设计的时候不清楚,要等到实际运行时才能决定他的类型。一般的做法是声明一个object类型的对象,可以存任何类型进去,需要取得时候,取出来,再用类型转换。这样做的坏处估计是性能低,任何类型都需要装箱和拆箱,还有就是可能存在的类型转换时出现错误。
而范型是在运行期才确定类型的,所以就可以根据需要来任意指定其类型。
比如:
class TimeSpanPropertiesDemo
{
static void Main()
{
//声明对象为TypeList型,TypeList中定义的范型类型为int型
TypeList<int> MyList = new TypeList<int>();
MyList.GetSetValue = 23;
int test = MyList.GetSetValue;
//声明对象为TypeList型,TypeList中定义的范型类型为string型
TypeList<string> MyList2 = new TypeList<string>();
MyList2.GetSetValue = “Hello”;
string test2 = MyList2.GetSetValue;
//声明对象为TypeList型,TypeList中定义的范型类型为TypeList<int>型
TypeList<TypeList<int>> MyList3 = new TypeList<TypeList<int>>();
}
}
class TypeList<MyType> //范型类型
{
MyType m_value; //范型类型的变量
public MyType GetSetValue
{
get
{
return m_value;
}
set
{
m_value = value;
}
}
}
从这个例子大家可以看出,范型就是将类型作为变量,从而可以写出程序代码不需要任何修改,就能适应各种类型的Class。
.Net 2.0出来也很久了,但是一直也没时间看新东西。正好昨天看那篇如何创建数据访问层的文章,也就顺便把这些东西看一下。
不过昨天还是头一次看到“强类型的DataSet”是这么好用,整个数据访问层没有一句SQL语句。
有机会我会继续写一些程序方面的文章,不过大家期望不要太高,一般都是常见的问题的自己的想法。
昨天看“Creating a Data Access Layer”文章时,里面讲到了强类型的DataSet,由系统自动生成的代码里面,我发现每个值类型(Value Type值类型,相对于Reference Type引用类型)的参数是这么声明的:
int? ProductID, string? ProductName
很奇怪,到MSDN上才发现了“??”操作符,这个操作符是这个意思:
在声明变量的时候,可以为值类型的变量赋值null,在作为二元操作符时,用来判断左边变量是否为null,如果为null,就将右边的变量赋给=前面的变量。
举个例子:
int? IntType = null;是正确的 int IntType = null;在编译时就不会通过 --------------------------------- int? Para1 = null; int Para2 = 8; int Result = Para1 ?? Para2;此时的意思是如果Para1为null,则Result == Para2