杨的空间
业精于勤,荒于嬉,行成于思,毁于随

Document.getElementByID("<%ServerControlID.ClientID%>")
posted @ 2006-02-28 08:45 杨 阅读(307) | 评论 (0)编辑 收藏
 
  18位身份证标准在国家质量技术监督局于1999年7月1日实施的GB11643-1999《公民身份号码》中做了明确的规定。 GB11643-1999《公民身份号码》为GB11643-1989《社会保障号码》的修订版,其中指出将原标准名称"社会保障号码"更名为"公民身份号码",另外GB11643-1999《公民身份号码》从实施之日起代替GB11643-1989。GB11643-1999《公民身份号码》主要内容如下:
一、范围
     该标准规定了公民身份号码的编码对象、号码的结构和表现形式,使每个编码对象获得一个唯一的、不变的法定号码。
二、编码对象
     公民身份号码的编码对象是具有中华人民共和国国籍的公民。
三、号码的结构和表示形式
1、号码的结构
    公民身份号码是特征组合码,由十七位数字本体码和一位校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。
2、地址码
    表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
3、出生日期码
    表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日代码之间不用分隔符。
4、顺序码
     表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
5、校验码
(1)十七位数字本体码加权求和公式
S = Sum(Ai * Wi), i = 0, ... , 16 ,先对前17位数字的权求和
Ai:表示第i位置上的身份证号码数字值
Wi:表示第i位置上的加权因子
Wi: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

(2)计算模
Y = mod(S, 11)

(3)通过模得到对应的校验码
Y: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
四、举例如下:
北京市朝阳区: 11010519491231002X
广东省汕头市: 440524188001010014


    根据〖中华人民共和国国家标准 GB 11643-1999〗中有关公民身份号码的规定,公民身份号码是特征组合码,由十七位数字本体码和一位数字校验码组成。排列顺序从左至右依次为:六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。

    地址码表示编码对象常住户口所在县(市、旗、区)的行政区划代码。生日期码表示编码对象出生的年、月、日,其中年份用四位数字表示,年、月、日之间不用分隔符。顺序码表示同一地址码所标识的区域范围内,对同年、月、日出生的人员编定的顺序号。顺序码的奇数分给男性,偶数分给女性。校验码是根据前面十七位数字码,按照ISO 7064:1983.MOD 11-2校验码计算出来的检验码。下面举例说明该计算方法。 

    15位的身份证编码首先把出生年扩展为4位,简单的就是增加一个19,但是这对于1900年出生的人不使用(这样的寿星不多了)

    某男性公民身份号码本体码为34052419800101001,首先按照公式⑴计算:

∑(ai×Wi)(mod 11)……………………………………(1)

公式(1)中:
i----表示号码字符从由至左包括校验码在内的位置序号;
ai----表示第i位置上的号码字符值;
Wi----示第i位置上的加权因子,其数值依据公式Wi=2(n-1)(mod 11)计算得出。

i       18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1

ai       3  4  0  5  2  4  1  9  8  0  0  1  0  1  0  0  1 a1

Wi       7  9 10  5  8  4  2  1  6  3  7  9 10  5  8  4  2  1

ai×Wi  21 36  0 25 16 16  2  9 48  0  0  9  0  5  0  0  2 a1

根据公式(1)进行计算:

∑(ai×Wi) =(21+36+0+25+16+16+2+9+48++0+0+9+0+5+0+0+2) = 189

189 ÷ 11 = 17 + 2/11

∑(ai×Wi)(mod 11) = 2

    然后根据计算的结果,从下面的表中查出相应的校验码,其中X表示计算结果为10:

∑(ai×WI)(mod 11)   0 1 2 3 4 5 6 7 8 9 10
校验码字符值ai       1 0 X 9 8 7 6 5 4 3  2
    根据上表,查出计算结果为2的校验码为所以该人员的公民身份号码应该为 34052419800101001X。

以上是转载的(sorry忘了哪里找过来的),以下是根据原文写的一个校验类,并自动将15位转换成18位.
---------------------------------------------------------------------------------
using System;
using System.Text;
using System.Text.RegularExpressions;
namespace Leisang
{
 /// <summary>
 /// CID 的摘要说明。
 /// </summary>
 public class IdentityCard
 {
  private string cid_;
  private string errmsg;
  private string[] aCity;
  public IdentityCard()
  {
   aCity = new string[]{null,null,null,null,null,null,null,null,null,null,null,
         "北京","天津 ","河北","山西","内蒙古",
         null,null,null,null,null,
         "辽宁","吉林","黑龙江",
         null,null, null,null,null,null,null,
         "上海","江苏","浙江","安微","福建","江西","山东",
         null,null, null,
         "河南","湖北","湖南","广东","广西","海南",
         null,null,null,
         "重庆","四川","贵州","云南","西藏",
         null,null,null,null,null,null,
         "陕西","甘肃","青海","宁夏","新疆",
         null,null, null,null,null,
         "台湾",
         null,null,null,null,null,null,null,null,null,
         "香港","澳门",
         null,null,null,null,null,null,null,null,
         "国外"};
  }
  
  public bool Check(string CardID)
  {
   CID=CardID;
   return Check();
  }

  public bool Check()
  {
   //判断位数
   if(CID.Length==15)
   {
    return Check15();
   }
   else if(CID.Length==18)
   {
    return Check18(CID);
   }
   else
   {
    ErrMsg="身份证位数不正确";
    return false;
   }
  }

  public bool Check18(string cid)
  {
   double iSum=0;
   //string info="";
   System.Text.RegularExpressions.Regex rg = new System.Text.RegularExpressions.Regex(@"^\d{17}(\d|x)$");
   System.Text.RegularExpressions.Match mc = rg.Match(cid);
   if(!mc.Success)
   {
    ErrMsg="身份证输入错误";
    return false;
   }  
   cid = cid.ToLower();
   cid = cid.Replace("x","a");
   if(aCity[int.Parse(cid.Substring(0,2))]==null)
   {
    ErrMsg= "非法地区";
    return false;
   }
   try
   {
    DateTime.Parse(cid.Substring(6,4)+"-"+cid.Substring(10,2)+"-"+cid.Substring(12,2));
   }
   catch
   {
    ErrMsg= "非法生日";
    return false;
   }
   for(int i=17;i>=0;i--)
   {   
    iSum +=(System.Math.Pow(2,i)%11)*int.Parse(cid[17-i].ToString(),System.Globalization.NumberStyles.HexNumber);

   }
   if(iSum%11!=1)
   {
    ErrMsg="非法证号";
    return false;
   }
   //return "";
   string xx;
   int sex=int.Parse(cid.Substring(16,1))%2;
   if(sex==1)
   {
    xx="男";
   }
   else
   {
    xx="女";
   }
   ErrMsg=(aCity [int.Parse(cid.Substring(0,2))]+","+cid.Substring(6,4)+"-"+cid.Substring(10,2) +"-"+cid.Substring(12,2)+","+xx);
   return true;
  }

  public bool Check15()
  {
   string[] verifyID=new string[]{"0","1","2","3","4","5","6","7","8","9","x"};
   CID=CID.Substring(0,6)+"19"+CID.Substring(6,9);
   foreach(string vid in verifyID)
   {
    bool result=Check18(CID+vid);
    if(result)
    {
     ErrMsg+=" your Card ID:"+CID+vid;
     return true;
    }
   }
   return false;
  }
  
  public string CID
  {
   get{return cid_;}
   set{cid_=value;}
  }

  public string ErrMsg
  {
   get{return errmsg;}
   set{errmsg=value;}
  }
 }
}


原文:http://blog.csdn.net/leisang/archive/2004/10/30/159875.aspx

posted @ 2006-02-24 17:57 杨 阅读(1149) | 评论 (0)编辑 收藏
 

今天突然打开任意Asp文件,都会提示:

Active Server Pages 错误 'ASP 0201'

  无效的默认脚本语言

  为此应用程序指定的默认脚本语言无效。

平台: Windows 2003 IIS 6.0

解决方法(对我的电脑适用,不知对别人是否有效,仅作参考):

1、在控制面板里,删除IIS组件。

2、删除C:\Inetpub目录。

3、重新安装IIS。

4、如果不行就试一下IIS管理器里的“重新启动IIS”

posted @ 2006-02-21 17:43 杨 阅读(3329) | 评论 (3)编辑 收藏
 
很多朋友在用IIS6架网站的时候遇到不少问题,而这些问题有些在过去的IIS5里面就遇到过,有些是新出来的,俺忙活了一下午,做了很多次试验,结合以前的排错经验,做出了这个总结,希望能给大家帮上忙:)

问题1:未启用父路径
症状举例:
Server.MapPath() 错误 'ASP 0175 : 80004005'
不允许的 Path 字符
/0709/dqyllhsub/news/OpenDatabase.asp,行 4
在 MapPath 的 Path 参数中不允许字符 '..'。

原因分析:
许多Web页面里要用到诸如../格式的语句(即回到上一层的页面,也就是父路径),而IIS6.0出于安全考虑,这一选项默认是关闭的。

解决方法:
在IIS中 属性->主目录->配置->选项中。把”启用父路径“前面打上勾。确认刷新。


问题2:ASP的Web扩展配置不当(同样适用于ASP.NET、CGI)

症状举例:
HTTP 错误 404 - 文件或目录未找到。

原因分析:
在IIS6.0中新增了web程序扩展这一选项,你可以在其中对ASP、ASP.NET、CGI、IDC等程序进行允许或禁止,默认情况下ASP等程序是禁止的。

解决方法:
在IIS中的Web服务扩展中选中Active Server Pages,点击“允许”。


问题3:身份认证配置不当

症状举例:
HTTP 错误 401.2 - 未经授权:访问由于服务器配置被拒绝。

原因分析:IIS 支持以下几种 Web 身份验证方法:
匿名身份验证
IIS 创建 IUSR_计算机名称 帐户(其中 计算机名称 是正在运行 IIS 的服务器的名称),用来在匿名用户请求 Web 内容时对他们进行身份验证。此帐户授予用户本地登录权限。你可以将匿名用户访问重置为使用任何有效的 Windows 帐户。
基本身份验证
使用基本身份验证可限制对 NTFS 格式 Web 服务器上的文件的访问。使用基本身份验证,用户必须输入凭据,而且访问是基于用户 ID 的。用户 ID 和密码都以明文形式在网络间进行发送。
Windows 集成身份验证
Windows 集成身份验证比基本身份验证安全,而且在用户具有 Windows 域帐户的内部网环境中能很好地发挥作用。在集成的 Windows 身份验证中,浏览器尝试使用当前用户在域登录过程中使用的凭据,如果尝试失败,就会提示该用户输入用户名和密码。如果你使用集成的 Windows 身份验证,则用户的密码将不传送到服务器。如果该用户作为域用户登录到本地计算机,则他在访问此域中的网络计算机时不必再次进行身份验证。
摘要身份验证
摘要身份验证克服了基本身份验证的许多缺点。在使用摘要身份验证时,密码不是以明文形式发送的。另外,你可以通过代理服务器使用摘要身份验证。摘要身份验证使用一种挑战/响应机制(集成 Windows 身份验证使用的机制),其中的密码是以加密形式发送的。
.NET Passport 身份验证
Microsoft .NET Passport 是一项用户身份验证服务,它允许单一签入安全性,可使用户在访问启用了 .NET Passport 的 Web 站点和服务时更加安全。启用了 .NET Passport 的站点会依靠 .NET Passport 中央服务器来对用户进行身份验证。但是,该中心服务器不会授权或拒绝特定用户访问各个启用了 .NET Passport 的站点。

解决方法:
根据需要配置不同的身份认证(一般为匿名身份认证,这是大多数站点使用的认证方法)。认证选项在IIS的属性->安全性->身份验证和访问控制下配置。


问题4:IP限制配置不当

症状举例:
HTTP 错误 403.6 - 禁止访问:客户端的 IP 地址被拒绝。

原因分析:
IIS提供了IP限制的机制,你可以通过配置来限制某些IP不能访问站点,或者限制仅仅只有某些IP可以访问站点,而如果客户端在被你阻止的IP范围内,或者不在你允许的范围内,则会出现错误提示。

解决方法:
进入IIS的属性->安全性->IP地址和域名限制。如果要限制某些IP地址的访问,需要选择授权访问,点添加选择不允许的IP地址。反之则可以只允许某些IP地址的访问。


问题5:IUSR账号被禁用

症状举例:
HTTP 错误 401.1 - 未经授权:访问由于凭据无效被拒绝。

原因分析:
由于用户匿名访问使用的账号是IUSR_机器名,因此如果此账号被禁用,将造成用户无法访问。

解决办法:
控制面板->管理工具->计算机管理->本地用户和组,将IUSR_机器名账号启用。


问题6:NTFS权限设置不当

症状举例:
HTTP 错误 401.3 - 未经授权:访问由于 ACL 对所请求资源的设置被拒绝。

原因分析:
Web客户端的用户隶属于user组,因此,如果该文件的NTFS权限不足(例如没有读权限),则会导致页面无法访问。

解决办法:
进入该文件夹的安全选项卡,配置user的权限,至少要给读权限。关于NTFS权限设置这里不再馈述。


问题7:IWAM账号不同步

症状举例:
HTTP 500 - 内部服务器错误

原因分析:
IWAM账号是安装IIS时系统自动建立的一个内置账号。IWAM账号建立后被Active Directory、IIS metabase数据库和COM+应用程序三方共同使用,账号密码被三方分别保存,并由操作系统负责这三方保存的IWAM密码的同步工作。系统对IWAM账号的密码同步工作有时会失效,导致IWAM账号所用密码不统一。

解决办法:
如果存在AD,选择开始->程序->管理工具->Active Directory用户和计算机。为IWAM账号设置密码。
运行c:\Inetpub\AdminScripts>adsutil SET w3svc/WAMUserPass +密码 同步IIS metabase数据库密码
运行cscript c:\inetpub\adminscripts\synciwam.vbs -v 同步IWAM账号在COM+应用程序中的密码


问题8:MIME设置问题导致某些类型文件无法下载(以ISO为例)

症状举例:
HTTP 错误 404 - 文件或目录未找到。

原因分析:
IIS6.0取消了对某些MIME类型的支持,例如ISO,致使客户端下载出错。

解决方法:
在IIS中 属性->HTTP头->MIME类型->新建。在随后的对话框中,扩展名填入.ISO,MIME类型是application。


另外,防火墙阻止,ODBC配置错误,Web服务器性能限制,线程限制等因素也是造成IIS服务器无法访问的可能原因,这里就不再一一馈述了。希望此帖能解决大家的大部分问题:)
posted @ 2006-02-21 10:08 杨 阅读(261) | 评论 (0)编辑 收藏
 
【导读】本文结合示例讲述了在ASP.net应用程序中如何利用客户端的Javascript脚本提高程序的执行效率并实现更多的功能。

一、ASP.Net与Javascript

.Net是微软公司下一代的战略核心,ASP.Net是.Net战略在Web开发方面的具体实现。它继承了ASP的简单性和易用性,同时克服了ASP程序结构化较差,难于阅读和理解的缺点。特别是服务器控件和事件驱动模式的引入,使得Web应用程序的开发更接近于过去桌面程序的开发。

在各种各样介绍ASP.Net的文章和书籍中,都把重点放在了服务器控件和.Net Framework SDK上,因为这是ASP.Net中最新和最具革命性的改进;与此相反,在过去的Web开发中占据重要地位的客户端脚本Javascript(也包括VBScript)则鲜有提及,似乎有了服务器端程序,已经不需要客户端脚本了。但是,服务器端的程序毕竟需要一次浏览器与Web服务器的交互,对于ASP.Net来说,就是一次页面的提交,需要来回传送大量的数据,而很多工作,比如输入验证或者删除确认等,完全可以用Javascript来实现。因此,探讨在ASP.Net中如何使用Javascript仍然很有必要。



二、Javascript的应用示例

1.为页面上的某个服务器控件添加Javascript事件

服务器控件最终生成的仍然是普通的HTML,比如<asp:textbox>生成input text。表单中的每个HTML控件都有它自己的Javascript事件,比如Textbox有onchange事件,Button有onclick事件,Listbox有onchange事件等。要想为服务器控件添加客户端的事件,需要用到Attributes属性。Attributes属性是所有的服务器控件都有的一个属性,它用来为最终生成的HTML添加自定义的一些标记。假设Web Form上有一个保存按钮btnSave,希望在用户点此按钮时提示用户是否确实要保存(比如一旦保存就无法恢复等),则应在Page_Load事件中添加如下代码:

if not page.isPostBack() then

btnSave.Attributes.Add(“onclick”,”Javascript:return confirm(‘Are you sure to save?’);”)

end if

要注意的是‘return’,这是不可省的,否则即使用户点了取消,数据仍然会保存。

2.为Datagrid中的每一行添加Javascript事件

假设Datagrid的每一行有一个删除按钮,希望在用户点此按钮时提示用户是否确实要删除此条记录,以防用户点错了行,或仅仅是无意中点了删除按钮。

无论这个删除按钮是什么名字,都不能象上个例子那样直接引用,因为每一行都有这样一个按钮,它们是Datagrid中的子控件。在这种情况下,需要用到Datagrid的OnItemDataBound事件。OnItemDataBound事件发生在Datagrid的每一行数据绑定到Datagrid之后(即一行激发一次)。首先在Datagrid的声明中添加如下代码:

<asp:datagrid id="grd1" runat="server" OnItemDataBound = "ItemDataBound" >

…Columns definition here

</asp:datagrid> 此处说明OnItemDataBound事件发生时调用ItemDataBound方法,在代码后置文件中添加此方法的定义:



Sub ItemDataBound(ByVal sender As Object, ByVal e As DataGridItemEventArgs)

If e.Item.ItemType <> ListItemType.Header And e.Item.ItemType <> ListItemType.Footer Then

Dim oDeleteButton As LinkButton = e.Item.Cells(5).Controls(0)

oDeleteButton.Attributes("onclick") = "javascript:return Confirm ('Are you sure you want to delete" & DataBinder.Eval(e.Item.DataItem, "m_sName") & "?')"

End If

End Sub

由于Datagrid的标题行和脚注行也会激发此事件,所以首先判断激发此事件的行不是标题行和脚注行。这里假设Delete按钮位于Datagrid的第6列(第一列是0),且Datagrid的Datasource中包含名为”m_sName”的列

3.引用编辑状态下的Datagrid中的控件

Datagrid的内置编辑功能使得当记录的字段较少时的一种编辑方法。用户不必进入一个单独的页面编辑记录,而是直接点编辑按钮就可以使当前行进入编辑模式。而另一方面,有一些Javascript程序需要引用控件的名称。比如,很多程序在需要用户输入日期时都提供一个日期控件以保证日期格式的合法性,当用户点控件图标时弹出一个新窗口供用户选择日期。此时需要把显示日期的文本框的ID提供给新窗口,以便当用户选择日期后值可以回填到文本框中。

如果是普通的服务器文本框控件,它的ID与生成的HTML输入框的ID是相同的;但是在Datagrid的编辑状态下,两个ID并不相同(其道理与上例相同),这就需要用到控件的ClientID属性。

Protected Sub ItemEdit(ByVal source As Object, ByVal e As System.Web.UI.WebControls.DataGridCommandEventArgs)

Dim sDateCtrl as string

sDateCtrl = grd1. Items (e.Item.ItemIndex) . Cells(2). FindControl("txtDate") . ClientID

End Sub

这里假设ItemEdit方法是Dategrid的OnItemEdit事件处理程序,同时在Datagrid的第三列包含一个名为txtDate的服务器文本框控件

4.引用ASP.Net自动生成的Javascript程序

所谓的“服务器控件”是针对开发人员的,在生成的HTML源程序中并没有服务器和客户端之分,都是标准的HTML,DHTML和Javascript。它之所以能响应用户的输入是因为每个控件的事件处理程序最终都生成了一段脚本,此脚本重新提交页面使得Web Server有机会再次响应并作出处理。通常情况下我们不必知道此脚本是什么也不必直接调用此脚本,但在有些情况下,适当地调用此脚本可以简化许多工作。请看下面两个例子。

● 点Datagrid的任一位置以选中一行

Datagrid提供了一种内置的选择按钮,当点此按钮时选中当前行(可以设置SelectedItemStyle属性以使当前行有不同的外观)。但用户可能更习惯于点任意一个位置都能选中一行,如果完全自己实现这个功能相当烦琐。一个好的思路是添加一个选择按钮,但使此列隐藏,当点任一行时调用此按钮产生的Javascript脚本。

Sub Item_Bound(ByVal sender As Object, ByVal e As DataGridItemEventArgs )

Dim itemType As ListItemType

itemType = CType(e.Item.ItemType, ListItemType)

If (itemType <> ListItemType.Header) And _

(itemType <> ListItemType.Footer) And _

(itemType <> ListItemType.Separator) Then

Dim oSelect As LinkButton = CType(e.Item.Cells(5).Controls(0), LinkButton)

e.Item.Attributes("onclick") = Page. GetPostBackClientHyperlink (oSelect, "")



End Sub

这里假设选择按钮位于第6列。e.Item代表了一行,从生成的HTML上看就是在每个<tr>里增加了一个onclick事件。Page.GetPostBackClientHyperLink方法返回页面中LinkButton控件产生的客户端脚本,其中第一个参数是Linkbutton控件,第二个参数是传递给此控件的参数,通常为空。如果不是LinkButton控件,有一个类似的函数GetPostBackClientEvent,读者可以参考MSDN。

服务器产生的脚本与手工添加的脚本冲突

服务器控件服务器事件一般对应到客户端控件的相应事件,如Dropdownlist的SelectedIndexChanged事件对应HTML <Select>的onchange事件。如果你要手工增加一个onchange事件,则会在客户端产生两个onchange,浏览器就会忽略掉一个。比如用户希望每当改变了Dropdownlist中的选项就保存到数据库(虽然不是很常见,但确实有这种需要),但同时还希望提醒用户是否确实要做保存。显然,保存的代码应该放在SelectedIndexChanged事件中,而提醒的工作应该手工加一段onchange事件。结果就是两个onchange只能执行一个。正确的方法应该是添加一个不可见的保存按钮,在手工增加的onchange事件中调用此按钮生成的程序。

Page_Load方法如下:

Dim sCmd as string

sCmd=Page.GetPostBackClientHyperlink(btnUpdate, "")

If not page.isPostback then

Dropdownlist1.Attributes.add("onchange","ConfirmUpdate(""" & sCmd & """)")

End if

ConfirmUpdate函数如下

<Script language=”javascript”>

function ConfirmUpdate(cmd){

if confirm(“Are you sure to update?”)

eval(cmd);

}</Script>

这里利用了Javascript eval函数来调用一个字符串中包含的命令。需注意的是包含命令的字符串不能用单引号括起来,因为自动生成的脚本中包括单引号,所以这里用两个双引号表示字符串本身的双引号。

三、结束语

以上简单讨论了在ASP.Net中插入Javascript的几种情况。合理地在服务器程序中插入客户端的Javascript脚本,可以提高程序的运行效率并提供更友好的用户界面。

posted @ 2006-02-20 09:47 杨 阅读(326) | 评论 (0)编辑 收藏
 
“无刷新页面”,只是一种不确切的效果描述(其实还有其他各种方法来实现这个效果),更确切的说法是:在页面上用JavaScript调用服务器端的一个方法,然后处理返回的数据。实现它最标准的方法当然是XMLHTTP。但是,程序员都是懒惰的家伙,每个人都希望能有更方便的方法,或者,更佳的包装。比如,Lostinet的Rane就是对XMLHTTP的一个很好的包装。 


终于,在ASP.NET 2.0里面,我们可以轻松的来做到这点了。服务器端任何实现了System.Web.UI.ICallbackEventHandler接口的控件,都可以通过RaiseCallbackEvent()方法来处理从页面上的JS脚本传递过来的请求和数据,处理后,再将结果传回给页面。这项能力的底层仍然是XMLHTTP。 


下面是一个简单的演示: 

在页面上,我们放上两个文本框和一个按钮:

<INPUT id="txtMessage">

<INPUT onclick="callToServer();" type="button" value="Call to Server">

Result : <INPUT id="txtResult" >


当点击按钮的时候,将调用JS脚本方法callToServer(),JS脚本如下:

function callToServer()

{

var param = document.getElementById("txtUsername").value;

var context = "";

<% = ClientScript %>

}



function handleResultFromServer(result, context)

{

document.getElementById("txtResult").value = result;

}



handleResultFromServer()方法则负责将从服务器传回的数据写到txtResult这个文本框里面。 

再看看服务器端的代码:

public partial class Default_aspx : System.Web.UI.ICallbackEventHandler

{

private String ClientScript

{

get

{

return this.GetCallbackEventReference(this, "param", "handleResultFromServer", "context");

}

}


public string RaiseCallbackEvent(string eventArgument)

{

return "客户端在[" + DateTime.Now.ToString() + "]传送来 [" + eventArgument + "].";

}




我们让页面直接实现ICallbackEventHandler接口,然后接口定义的RaiseCallbackEvent()方法中将服务器的时间和传来的数据一起返回回去。 

ClientScript属性的作用是,它调用了页面的GetCallbackEventReference()方法,获得了让客户端有能力调用服务器端方法的JS脚本,并输出到页面的callToServer()方法中,这样,点击页面按钮时,就开始执行页面上包含了调用服务器方法的的callToServer()方法。 

注意GetCallbackEventReference()方法的参数,在参数中,我们定义了客户端的哪个变量包含了要传递给服务器,服务器方法执行后,调用客户端的哪个方法等信息。GetCallbackEventReference()的详细参看请看这里。 

最后,我们这个页面的执行效果就是:

 
posted @ 2006-02-20 08:51 杨 阅读(252) | 评论 (0)编辑 收藏
 
摘自csdn

即认为中文长度为2

方法一

byte[] mybyte=System.Text.Encoding.Default.GetBytes(str);

mybyte.Length

方法二

 public double CnLen(string str)
 {
  ASCIIEncoding n=new ASCIIEncoding();
  byte [] mybyte=n.GetBytes(str);
  double len=str.Length;
  for(int i=0;i<str.Length;i++)
  {
  if(mybyte[i]==63)
  {
   len=len+1;
  }
  }
  return len/2;

//  int temp;
//  double len=str.Length;
//  for(int i=0;i<str.Length;i++) 
//  {
//  temp=(int)str[i];
//  if(temp<0)
//  {
//   temp+=65536;
//  }
//  if(temp>255)
//  {
//   len+=1;
//  }
//  }
//  return len/2;
 }
posted @ 2006-02-20 08:47 杨 阅读(1790) | 评论 (0)编辑 收藏
 

 

// -----------------------------------------------------------------------------
本函数用于测试字符串sString的长度;
// 注:对本函数来说,1个汉字代表2单位长度;
//
 -----------------------------------------------------------------------------
function JHshStrLen(sString)
{
var sStr,iCount,i,strTemp ; 
iCount 
= 0 ;
sStr 
= sString.split("");
for (i = 0 ; i < sStr.length ; i ++)
{
strTemp 
= escape(sStr[i]); 
if (strTemp.indexOf("%u",0== -1// 表示是汉字

iCount 
= iCount + 1 ;
}
 
else 
{
iCount 
= iCount + 2 ;
}

}

return iCount ;
}


posted @ 2006-02-20 08:44 杨 阅读(790) | 评论 (1)编辑 收藏
 

 

         using System.Web.Mail; 
         MailMessage mail 
= new MailMessage(); 
       mail.To 
= "me@mycompany.com"
       mail.From 
= "you@yourcompany.com"
       mail.Subject 
= "this is a test email."
       mail.Body 
= "Some text goes here"
          mail.BodyFormat 
= MailFormat.Html;//设置为HTML格式  
         
//设置为需要用户验证 
      mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate""1");   
         
//设置验证用户名(把my_username_here改为你的验证用户名) 
      mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername""my_username_here");  
         
//设置验证密码(把password改为你的验证密码) 
      mail.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword""password");   
      SmtpMail.SmtpServer 
= "mail.mycompany.com";  //邮件服务器地址 
      SmtpMail.Send( mail ); 



主要是在mail.Fields里Add三个设置就可以了

posted @ 2006-02-18 10:38 杨 阅读(480) | 评论 (0)编辑 收藏
 
文章编号 : 310070
最后修改 : 2005年8月12日
修订 : 2.0
本文的发布号曾为 CHS310070

概要

有多种方法使用 ADO.NET 调用存储过程并获得返回值和返回参数,其中包括:
使用 DataSet 对象,在获得返回值和返回参数之外,还可以收集并使用返回的数据行。
使用 DataReader 对象收集返回的行,遍历这些行,然后收集返回值和返回参数。
使用 ExecuteScalar 方法返回结果中第一行的第一列的值以及返回值和返回参数。这对于聚合函数特别有用。
使用 ExecuteNonQuery 方法只返回参数和值。任何返回的行都将被丢弃。这对于执行操作查询特别有用。
本文演示后三种方法,并使用 SqlCommandOleDbCommand 这两个对象。确保只复制对应于您在使用的托管提供程序的代码。如果您不确定应该使用哪个托管提供程序,请访问下面的 Microsoft Developer Network 网站:
.NET 数据提供程序
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconadonetproviders.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconadonetproviders.asp)
在本文的每个示例中,这些参数都被添加到 Command 对象的 Parameters 集合中。使用 SqlCommand 对象时,您不必按照任何特定的顺序添加参数,但必须保证参数名正确。使用 OleDbCommand 对象时,必须按照正确的顺序添加参数,不能按照名称使用参数。

使用 DataReader 返回行和参数

您可以使用 DataReader 对象返回只读的仅向前型数据流。DataReader 中所包含的信息可以来自一个存储过程。本示例使用 DataReader 对象运行带有输入和输出参数的存储过程,然后遍历返回记录,以查看返回参数。
1. 在运行 Microsoft SQL Server 的服务器上创建下面的存储过程:
Create Procedure TestProcedure
(
  @au_idIN varchar (11),
  @numTitlesOUT Integer OUTPUT
)
AS

select A.au_fname, A.au_lname, T.title
from authors as A join titleauthor as TA on
A.au_id=TA.au_id
join titles as T
on T.title_id=TA.title_id
where A.au_id=@au_idIN
set @numTitlesOUT = @@Rowcount
return (5)
					
2. 新建一个新的 Visual C# .NET Windows 应用程序项目。
3. SystemSystem.Data 命名空间使用 using 语句,这样,在后面的代码中就无需限定这些命名空间中的声明了。将此代码添加到“窗体”代码模块的顶部。请确保只复制对应于您所选的提供程序的代码。SQL 客户端
using System.Data.SqlClient;
					
OLE DB 数据提供程序
using System.Data.OleDb;
					
4. 用以下代码替换 private Form_Load 事件中的代码:SQL 客户端
SqlConnection PubsConn = new SqlConnection
("Data Source=server;integrated " +
"Security=sspi;initial catalog=pubs;");
SqlCommand testCMD = new SqlCommand
("TestProcedure", PubsConn);

testCMD.CommandType = CommandType.StoredProcedure;

SqlParameter RetVal = testCMD.Parameters.Add
   ("RetVal", SqlDbType.Int);
RetVal.Direction = ParameterDirection.ReturnValue;
SqlParameter IdIn = testCMD.Parameters.Add
  ("@au_idIN", SqlDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
SqlParameter NumTitles = testCMD.Parameters.Add
   ("@numtitlesout", SqlDbType.VarChar, 11);
NumTitles.Direction = ParameterDirection.Output ;

IdIn.Value = "213-46-8915";
PubsConn.Open();

SqlDataReader myReader = testCMD.ExecuteReader();
Console.WriteLine ("Book Titles for this Author:");
while (myReader.Read())
   {
     Console.WriteLine ("{0}", myReader.GetString (2));
   };
myReader.Close() ;
Console.WriteLine("Number of Rows: " + NumTitles.Value );
Console.WriteLine("Return Value: " + RetVal.Value);
					
OLE DB 数据提供程序
OleDbConnection PubsConn = new OleDbConnection
   ("Provider=SQLOLEDB;Data Source=server;" +
   "integrated Security=sspi;initial catalog=pubs;");
OleDbCommand testCMD = new OleDbCommand
   ("TestProcedure", PubsConn);

testCMD.CommandType = CommandType.StoredProcedure;

OleDbParameter RetVal = testCMD.Parameters.Add
   ("RetVal", OleDbType.Integer);RetVal.Direction = ParameterDirection.ReturnValue;
OleDbParameter IdIn = testCMD.Parameters.Add
   ("@au_idIN", OleDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
OleDbParameter NumTitles = testCMD.Parameters.Add
   ("@numtitlesout", OleDbType.VarChar, 11);
NumTitles.Direction = ParameterDirection.Output;

IdIn.Value = "213-46-8915";

PubsConn.Open();

OleDbDataReader myReader = testCMD.ExecuteReader();
Console.WriteLine ("Book Titles for this Author:");
while (myReader.Read())
   {
     Console.WriteLine ("{0}", myReader.GetString (2));
   };
myReader.Close() ;
Console.WriteLine("Number of Rows: " + NumTitles.Value );
Console.WriteLine("Return Value: " + RetVal.Value);
					
5. 修改 Connection 对象的连接字符串,以便指向运行 SQL Server 的计算机。
6. 运行上述代码。注意,DataReader 检索记录并返回参数值。可以使用 DataReader 对象的 Read 方法遍历返回的记录。

“输出”窗口显示两本书的标题、返回值 5 和输出参数,其中包含记录的数目 (2)。注意,必须关闭代码中的 DataReader 才能看到参数值。另外还要注意,如果关闭了 DataReader,则不必为了查看返回参数而遍历所有记录。

使用 Command 对象的 ExecuteScalar 方法

可以使用 Command 对象的 ExecuteScalar 方法检索参数值。另外,ExecuteScalar 返回该存储过程的第一行的第一列。这对于聚合函数特别有用,如下例所示。
1. 在运行 SQL Server 的服务器上创建下面的存储过程:
Create Procedure TestProcedure2
(
  @au_idIN varchar (11)
)
As
/* set nocount on */
select count (T.title)
from authors as A join titleauthor as TA on
A.au_id=TA.au_id
join titles as T
on T.title_id=TA.title_id
where A.au_id=@au_idIN
Return(5)
					
2. 新建一个新的 Visual C# .NET Windows 应用程序项目。
3. SystemSystem.Data 命名空间使用 using 语句,这样,在后面的代码中就无需限定这些命名空间中的声明了。将此代码添加到“窗体”代码模块的顶部。请确保只复制对应于您所选的提供程序的代码。SQL 客户端
using System.Data.SqlClient;
					
OLE DB 数据提供程序
using System.Data.OleDb;
					
4. 将下面的代码添加到 Form_Load 事件:SQL 客户端
string strCount;
SqlConnection PubsConn = new SqlConnection
   ("Data Source=server;integrated " +
   "Security=sspi;initial catalog=pubs;");
SqlCommand testCMD = new SqlCommand
   ("TestProcedure2", PubsConn);

testCMD.CommandType = CommandType.StoredProcedure;

SqlParameter RetVal = testCMD.Parameters.Add
   ("RetVal", SqlDbType.Int);
RetVal.Direction = ParameterDirection.ReturnValue;
SqlParameter IdIn = testCMD.Parameters.Add
   ("@au_idIN", SqlDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;

IdIn.Value = "213-46-8915";

PubsConn.Open();

strCount =testCMD.ExecuteScalar ().ToString() ;

Console.WriteLine("Number of Rows: " + strCount );
Console.WriteLine("Return Value: " + RetVal.Value);
					
OLE DB 数据提供程序
string strCount;
OleDbConnection PubsConn = new OleDbConnection
   ("Provider=SQLOLEDB;Data Source=server;" +
   "integrated Security=sspi;initial catalog=pubs;");
OleDbCommand testCMD = new OleDbCommand
   ("TestProcedure2", PubsConn);

testCMD.CommandType = CommandType.StoredProcedure;

OleDbParameter RetVal = testCMD.Parameters.Add
   ("RetVal", OleDbType.Integer);
RetVal.Direction = ParameterDirection.ReturnValue;
OleDbParameter IdIn = testCMD.Parameters.Add
   ("@au_idIN", OleDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;

IdIn.Value = "213-46-8915";

PubsConn.Open();

strCount = testCMD.ExecuteScalar().ToString() ;

Console.WriteLine("Number of Rows: " + strCount);
Console.WriteLine("Return Value: " + RetVal.Value);
					
5. 修改 Connection 对象的连接字符串,以便指向运行 SQL Server 的计算机。
6. 运行上述代码。注意,Command 对象的 ExecuteScalar 方法将返回参数。ExecuteScalar 还将返回所返回的行集中的第一行第一列的值。因此,intCount 的值是存储过程的 count 函数的结果。

使用 Command 对象的 ExecuteNonQuery 方法

此示例使用 ExecuteNonQuery 方法运行查询并返回参数值。ExecuteNonQuery 还返回在运行此查询后受影响的记录数。但是,ExecuteNonQuery 不从该存储过程返回任何行或列。

如果只需要知道更改的行数,那么在使用 INSERT、UPDATE 或 DELETE 语句时,ExecuteNonQuery 方法特别有用。当存储过程中仅使用 SELECT 语句时,您将收到 -1,因为查询不会影响任何行。
1. 在运行 SQL Server 的计算机上创建下面的存储过程:
Create Procedure TestProcedure3
(
  @au_idIN varchar (11),
  @au_fnam varchar (30)
)

As
/* set nocount on */
Update authors set au_fname = @au_fnam
where au_id = @au_idin
return (5)
					
2. 新建一个新的 Visual C# .NET Windows 应用程序项目。
3. SystemSystem.Data 命名空间使用 using 语句,这样,在后面的代码中就无需限定这些命名空间中的声明了。将此代码添加到“窗体”代码模块的顶部。请确保只复制对应于您所选的提供程序的代码。SQL 客户端
using System.Data.SqlClient;
					
OLE DB 数据提供程序
using System.Data.OleDb;
					
4. 用以下代码替换 Form1 代码模块中 private Form1_Load 事件后面的代码:SQL 客户端
string strRowAffect;
SqlConnection PubsConn = new SqlConnection
   ("Data Source=server;integrated Security=sspi;" +
   "initial catalog=pubs;");
SqlCommand testCMD = new SqlCommand
   ("TestProcedure3", PubsConn);

testCMD.CommandType = CommandType.StoredProcedure;

SqlParameter RetVal = testCMD.Parameters.Add
   ("RetVal", SqlDbType.Int);
RetVal.Direction = ParameterDirection.ReturnValue;
SqlParameter IdIn = testCMD.Parameters.Add
   ("@au_idIN", SqlDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
SqlParameter FnameIn = testCMD.Parameters.Add
   ("@au_fnam", SqlDbType.VarChar, 30);
FnameIn.Direction = ParameterDirection.Input;

IdIn.Value = "213-46-8915";
FnameIn.Value = "Marjorie";

PubsConn.Open();

strRowAffect =testCMD.ExecuteNonQuery ().ToString() ;

Console.WriteLine("Number of Rows: " + strRowAffect );
Console.WriteLine("Return Value: " + RetVal.Value);
					
OLE DB 数据提供程序
int intRowAffected;
OleDbConnection PubsConn = new OleDbConnection
   ("Provider=SQLOLEDB;Data Source=server;" +
   "integrated Security=sspi;initial catalog=pubs;");
OleDbCommand testCMD = new OleDbCommand
   ("TestProcedure3", PubsConn);

testCMD.CommandType = CommandType.StoredProcedure;

OleDbParameter RetVal = testCMD.Parameters.Add
   ("RetVal", OleDbType.Integer);
RetVal.Direction = ParameterDirection.ReturnValue;
OleDbParameter IdIn = testCMD.Parameters.Add
   ("@au_idIN", OleDbType.VarChar, 11);
IdIn.Direction = ParameterDirection.Input;
OleDbParameter FnameIn = testCMD.Parameters.Add
   ("@au_fname", OleDbType.VarChar, 30);
FnameIn.Direction = ParameterDirection.Input;

IdIn.Value = "213-46-8915";
FnameIn.Value = "Marjorie";

PubsConn.Open();
intRowAffected = testCMD.ExecuteNonQuery();

Console.WriteLine("Number of Rows affected: " + intRowAffected);
Console.WriteLine(RetVal.Value);
					
5. 修改 Connection 对象的连接字符串,以便指向运行 SQL Server 的计算机。
6. 运行上述代码。“输出”窗口显示受影响的行数 (intRowAffect) 和返回参数的值。

参考

有关其他信息,请访问下面的 MSDN 网站:
.NET Framework 类库简介
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthenetframeworkclasslibrary.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconthenetframeworkclasslibrary.asp)

使用 DataReader 检索数据
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontheadonetdatareader.asp)

这篇文章中的信息适用于:
Microsoft .NET Framework 1.1 Service Pack 1
Microsoft ADO.NET 1.1
Microsoft Visual C# .NET 2002 标准版
Microsoft Visual C# .NET 2003 标准版
posted @ 2006-02-17 08:54 杨 阅读(972) | 评论 (0)编辑 收藏
仅列出标题
共7页: 1 2 3 4 5 6 7