进入页面
<meta content="revealTrans(duration=x, transition=y)" http-equiv="Page-Enter" />
退出页面
<meta content="revealTrans(duration=x, transition=y)" http-equiv="Page-Exit" />
这个是页面被载入和调出时的一些特效。
duration表示特效的持续时间,以秒为单位。
transition表示使用哪种特效,取值为1-23:
进入页面
<meta content="revealTrans(duration=x, transition=y)" http-equiv="Page-Enter" />
退出页面
<meta content="revealTrans(duration=x, transition=y)" http-equiv="Page-Exit" />
这个是页面被载入和调出时的一些特效。
duration表示特效的持续时间,以秒为单位。
transition表示使用哪种特效,取值为1-23:
在前面我们已经完成了ActiveX控件的开发,接下来的就是发布它了。
首先,我们建立一个windows安装项目,并将ActiveX控件的主输出添加到项目输出中。然后,改动ActiveX控件的主输出文件,将其Register属性改为vsdrpCOM.如图:
下一步,我们改动项目属性,将引导程序更改为 Web引导程序。很遗憾的是,在 Web引导程序设置 中的安装文件夹URL中必须使用绝对路径,不能使用相对路径。这意味着生成安装程序的时候就必须确定路径,不是很方便。在示例中,我使用了localhost,在发布中可以改为实际的域名。
现在我们生成安装程序,并把相应得程序拷贝到正确的目录中(本例中为默认网站目录下的ActiveX文件夹中)。我们可以直接执行Setup.Exe文件,以验证安装文件的正确性。在我的机器上正确执行了,成功了!
现在我们又要重新改动helloworld.htm文件了。修改后的结果如下:
<body bgcolor='#223344'>
用C#编写ActiveX控件(二)
Homer
在我的上一篇blog中,已经实现了一个最基本的ActiveX控件。当然,我们编写的任务还没有完成。首先,我们先尝试实现和JS的交互能力。
现在,重新访问http://localhost/helloworld.htm,单击Click按钮,应该可以实现交互了。
用C#编写ActiveX控件(一)
前些日子做一个Web项目,必须自己编写一个ActiveX控件。如今的ActiveX控件大多是使用VB/C++来开发的,而我对他们并不熟悉,因此考虑使用熟悉的C#编写ActiveX控件。
首先,建立一个WinForm控件项目HelloWorld,并拖入一个Label控件,文字设为HelloWorld,如图:
使用IE查看,我们的控件又可以在网页中显示了。不过,这个时候它已经不再是以前的.net WinForm控件了,而是货真价实的ActiveX控件了。
不过,编写ActiveX控件的任务还没有完成。我们还没有实现脚本互动或者读写I/O,也没有实现ActiveX控件的自动分发。在下一篇Blog中,我会完成ActiveX控件的编写。
在vs2005开发环境下还需要做一点调整.应该把设置属性[ComVisible(true)]才能够注册
using System;
namespace CountryPark.DAL

{
/**//// <summary>
/// PageList 的摘要说明。
/// </summary>
public sealed class PageList
{
static PageList()
{
}

/**//// <summary>
/// 分页查询数据记录总数获取
/// </summary>
/// <param name="_tbName">----要显示的表或多个表的连接</param>
/// <param name="_ID">----主表的主键</param>
/// <param name="_strCondition">----查询条件,不需where</param>
/// <param name="_Dist">----是否添加查询字段的 DISTINCT 默认0不添加/1添加</param>
/// <returns></returns>
public static string getPageListCounts(string _tbName, string _ID, string _strCondition, int _Dist)
{
//---存放取得查询结果总数的查询语句
//---对含有DISTINCT的查询进行SQL构造
//---对含有DISTINCT的总数查询进行SQL构造
string strTmp="", SqlSelect="", SqlCounts="";
if (_Dist == 0)
{
SqlSelect = "Select ";
SqlCounts = "COUNT(*)";
}
else
{
SqlSelect = "Select DISTINCT ";
SqlCounts = "COUNT(DISTINCT "+ _ID +")";
}
if (_strCondition == string.Empty)
{
strTmp = SqlSelect +" @Counts="+ SqlCounts +" FROM "+ _tbName;
}
else
{
strTmp = SqlSelect +" @Counts="+ SqlCounts +" FROM "+ " Where (1=1) "+ _strCondition;
}
return strTmp;
}


/**//// <summary>
/// 获取分页数据查询SQL
/// </summary>
/// <param name="_tbName">----要显示的表或多个表的连接</param>
/// <param name="_fldName">----要显示的字段列表</param>
/// <param name="_PageSize">----每页显示的记录个数</param>
/// <param name="_Page">----要显示那一页的记录</param>
/// <param name="_PageCount">----查询结果分页后的总页数</param>
/// <param name="_Counts">----查询到的记录数</param>
/// <param name="_fldSort">----排序字段列表或条件(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')</param>
/// <param name="_Sort">----排序方法,0为升序,1为降序</param>
/// <param name="_strCondition">----查询条件,不需where</param>
/// <param name="_ID">----主表的主键</param>
/// <param name="_Dist">----是否添加查询字段的 DISTINCT 默认0不添加/1添加</param>
/// <returns></returns>
public static string getPageListSql(string _tbName, string _fldName, int _PageSize, int _Page, out int _PageCount, int _Counts, string _fldSort, int _Sort, string _strCondition, string _ID, int _Dist)
{
string strTmp=""; //---strTmp用于返回的SQL语句
string SqlSelect="", strSortType="", strFSortType=""; 
if (_Dist == 0)
{
SqlSelect = "Select ";
}
else
{
SqlSelect = "Select DISTINCT ";
}
if (_Sort == 0)
{
strFSortType = " ASC";
strSortType = " DESC";
}
else
{
strFSortType = " DESC";
strSortType = " ASC";
}
// ----取得查询结果总数量-----
int tmpCounts = 1;
if (_Counts != 0)
{
tmpCounts = _Counts;
}
// --取得分页总数
_PageCount = (tmpCounts + _PageSize - 1)/_PageSize;
// /**//**当前页大于总页数 取最后一页**/
if (_Page > _PageCount)
{
_Page = _PageCount;
}
if (_Page <= 0)
{
_Page = 1;
}
// --/*-----数据分页2分处理-------*/
int pageIndex = tmpCounts/_PageSize;
int lastCount = tmpCounts%_PageSize;
if (lastCount > 0)
{
pageIndex = pageIndex + 1;
}
else
{
lastCount = _PageSize;
}
if (_strCondition == string.Empty) // --没有设置显示条件
{
if (pageIndex < 2 || _Page <= (pageIndex/2 + pageIndex%2)) //--前半部分数据处理
{
if (_Page == 1)
{
strTmp = SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +" ORDER BY "+ _fldSort +" "+ strFSortType;
}
else
{
strTmp = SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +" Where "+ _ID +" <(Select MIN("+ _ID +") FROM ("+ SqlSelect +" TOP "+ _PageSize*(_Page-1) +" "+ _ID +" FROM "+ _tbName +
" ORDER BY "+ _fldSort +" "+ strFSortType +") AS TBMinID) ORDER BY "+ _fldSort +" "+ strFSortType;
}
}
else
{
_Page = pageIndex - _Page + 1; //后半部分数据处理
if (_Page <= 1) //--最后一页数据显示
{
strTmp = SqlSelect +" * FROM ("+ SqlSelect +" TOP "+ lastCount +" "+ _fldName +" FROM "+ _tbName +" ORDER BY "+ _fldSort +" "+ strSortType +") AS TempTB"+ " ORDER BY "+ _fldSort +" "+ strFSortType;
}
else
{
strTmp = SqlSelect +" * FROM ("+ SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +
" Where "+ _ID +" >(Select MAX("+ _ID +") FROM("+ SqlSelect +" TOP "+ (_PageSize*(_Page-2)+lastCount) +" "+ _ID +" FROM "+ _tbName +
" ORDER BY "+ _fldSort +" "+ strSortType +") AS TBMaxID) ORDER BY "+ _fldSort +" "+ strSortType +") AS TempTB ORDER BY "+ _fldSort +" "+ strFSortType;
}
}
}
else // --有查询条件
{
if (pageIndex < 2 || _Page <=(pageIndex/2 + pageIndex%2))//--前半部分数据处理
{
if (_Page == 1)
{
strTmp = SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +"Where 1=1 "+ _strCondition +" ORDER BY "+ _fldSort +" "+ strFSortType;
}
else
{
strTmp = SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM"+ _tbName +
" Where "+ _ID +" <(Select MIN("+ _ID +") FROM ("+ SqlSelect +" TOP "+ (_PageSize*(_Page-1)) +" "+ _ID +" FROM " +_tbName +
" Where 1=1 "+ _strCondition +" ORDER BY "+ _fldSort +" "+ strSortType +") AS TBMaxID) "+ _strCondition +
" ORDER BY "+ _fldSort +" "+ strFSortType;
}
}
else //--后半部分数据处理
{
_Page = pageIndex-_Page+1;
if (_Page <= 1) //--最后一页数据显示
{
strTmp = SqlSelect +" * FROM ("+ SqlSelect +" TOP "+ lastCount +" "+ _fldName +" FROM "+ _tbName +
" Where 1=1 "+ _strCondition +" ORDER BY "+ _fldSort +" "+ strSortType +") AS TempTB ORDER BY "+ _fldSort +" "+ strFSortType;
}
else
{
strTmp = SqlSelect +" * FROM ("+ SqlSelect +" TOP "+ _PageSize +" "+ _fldName +" FROM "+ _tbName +
" Where "+ _ID +" >(Select MAX("+ _ID +") FROM("+ SqlSelect +" TOP "+ (_PageSize*(_Page-2)+ lastCount) +" "+ _ID +" FROM "+ _tbName +
" Where 1=1 "+ _strCondition +" ORDER BY "+ _fldSort +" "+ strSortType +") AS TBMaxID) "+ _strCondition +
" ORDER BY "+ _fldSort +" "+ strSortType +") AS TempTB ORDER BY "+ _fldSort +" "+ strFSortType;
}
}
}
return strTmp;
}
}
}
//调用函数例子
public IList getParkDataList(string key, int curPage, out int pageCount, int pageSize, int Counts)
{
IList list = new ArrayList();
string SECLECT_FIELD = "T_Park.ParkID, T_Park.ParkTitle, T_Park.ParkLetter, T_ParkArea.AreaName, T_ParkType.ParkTypeName ";
string SECLECT_TABLE = "T_ParkType INNER JOIN (T_ParkArea INNER JOIN T_Park ON T_ParkArea.ParkAreaID = T_Park.ParkAreaID) ON T_ParkType.ParkTypeID = T_Park.ParkTypeID";
string SECLECT_CONDITION = string.Empty;

if (key != string.Empty)
{
SECLECT_CONDITION = " AND T_Park.ParkTitle like '%"+ key +"%'";
}
string Select_ID = "ParkID";
string Select_FLDSORT = "ParkID";
int Select_SORT = 1;
int Select_DIST = 0;
string SQL = PageList.getPageListSql(SECLECT_TABLE, SECLECT_FIELD, pageSize, curPage, out pageCount, Counts, Select_FLDSORT, Select_SORT, SECLECT_CONDITION, Select_ID, Select_DIST);
//string strCondition;
OleDb db = new OleDb();
ParkBE park;
using(OleDbDataReader dr = (OleDbDataReader)db.ExecuteReader(CommonFun.GetConnectionString(), CommandType.Text, SQL))
{
while (dr.Read())
{
park = new ParkBE();
park.ParkID = Convert.ToInt32(dr[0]);
park.ParkTitle = dr[1].ToString();
park.ParkLetter = dr[2].ToString();
park.ParkAreaName = dr[3].ToString();
park.ParkTypeName = dr[4].ToString();
list.Add(park);
}
}
return list;
}
1 可以实现单点登陆的几种方法
(1)基于domain的方案
这种方案是我公司目前使用的一种方案,原理:应用A在a.domain.com,B在b.domain.com,如果设cookie的时候,设domain为domain.com,那在A、B上都可以访问到这个cookie了。(cookie的domain、path、port、version、secure相同)。
该方案特点:
1、不能够跨域
2、在网络中传送用户名和密码
3、只支持J2EE应用
(2)基于gateway的方案
实际部署的时候,对所有应用的请求,都要通过一个gateway转发一下,比如用一个L4的交换机顶在前面。
(3)基于tooken传递的方案
主要是以耶鲁大学的CAS项目为基础。
注意:你自己的应用看不到用户的密码。由CAS执行授权,只有CAS能看到用户的密码。这样增加发安全性,因为用户名和密码不会通过网络在应用间传播。
下面是使用CAS整合的单点登录用例
用例一:
一台认证服务器(假定为AUTH),有两个应用A、B,分别部署在不同的服务器上。
1) 用户访问A,A应用无法找到用户的身份信息,使用redirect方法将用户引导至http://Auth/login?service=http://A/path。
2) AUTH 显示登录界面,用户输入登录信息,认证通过。
3) AUTH产生一个cookie(这个cookie只有AUTH上才能读到),使用redirect方法将用户引导回http://A/path?token=xxxxx(在有的解决方案上,这个token是通过一定编码算法的Account信息)
4) A读取token=xxxx的信息,获取用户身份。
5) 用户访问B。B未找到用户的身份信息,redirect至http://AUTH/login?service=http://B/path
6) AUTH读cookie获取用户身份,然后redirect回http://B/path?token=xxxx
7) B读取token=xxxx信息,获得用户身份信息
用例二:
用户访问一个Web应用的过程。
具体的参看 http://www.9ta8.com/YaleCASServer.mht
(4)USBKey登录
这个方案是北京点聚信息技术有限公司提供的,我也向他们的技术咨询了相关的问题。他们的实现方式基本上是这样的:每个使用该系统的用户都有一个USBKey证书,在登陆系统的时候把这个证书插在计算机上。每一个网站都要通过这个证书去认证。
这样每个登录用户只需插上USBKey即可进入任意受信任系统,当然访问USBKey首先需要密码校验。
2 个人认为单点登陆实际上就两种方案
首先确认要使用单点登陆,必须有一个核心,那就是不管用户走到那个平台,他必须要带着他的通行证,单点登陆最关键的问题是用户怎么取得、保存、使用这个通行证的问题。 用户要取得他的通行证其实不外乎以下两种方案:
第一种:所有的业务平台集成在一个Portal上,去每一个平台的时候都要带着他的“通行证”,这就是所谓的“Tooken传递方案”;
第二种:使用硬件卡,就是上面所说的“USBKey登陆”;
3 单点登陆的几个案例
(1)微软一篇关于单点登陆的文章,他的实现是使用第一种方案。
原文:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnaspp/html/singlesignon.asp
(2)点聚公司的产品,可以看看他们的介绍
http://www.dianju.com.cn/sso.htm
(3)SharePoint Portal Server 2003 中的单一登录
http://www.microsoft.com/china/technet/prodtechnol/sppt/reskit/c2661881x.mspx
(4)《WebCast SharePoint Portal Server 2003 Single Sign On 管理及开发》已提供下载
http://www.msotec.net/Forums/ShowThread.aspx?PostID=415
(5)北京大学信息平台下的统一用户管理和身份认证
http://www.9ta8.com/download.htm
(6)统一身份认证在校园信息化中的应用
http://www.9ta8.com/download.htm
4 我想达到的目的
在不使用硬件卡、Passport和Cookie的情况下我想达到的目的:当用户打开浏览器进入站点A后,登陆,浏览A站点的内容;浏览完毕后用户想进入B站点,然后就在浏览器的地址栏中输入了B站点的地址,这时进入B站点后也不用重新登陆;同样,当用户关闭了浏览器后又想进入C站点,但同样不需要登陆。这个问题考虑了很长时间了,敬请大家指点迷津。
在《数据库原理》里面,对聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此,所以一个表最多只能有一个聚簇索引。
不过这个定义太抽象了。在SQL Server中,索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。如下图:
非聚簇索引
聚簇索引
聚簇索引与非聚簇索引的本质区别到底是什么?什么时候用聚簇索引,什么时候用非聚簇索引?
What's GUID ?
GUID 是个根据网络卡MAC Address 及时间等因素随机产生的 128 Bits(=16 Bytes) 数字, 因为 2 的128 次方是个极大的数目, 因此发生重复的机率非常非常.... 低 (乐观地说: 乐透中奖的机率远远高于 GUID 重复, 我们可以假设 "不可能" 发生)!
摘录几个网络上流传的例子来说明 GUID 如何地"不太可能" 发生重复:
一. The probability of an accidental match is (theoretically - and I use that term guardedly) the same as throwing a set of 128 pennies,
and having them all land in the same heads/tails combination twice.