发布新日志

  • Android SDK install —— a folder failed to be renamed or moved

    2011-04-25 23:55:05

    a folder failed to be renamed or moved on SDK install的处理方法

    在进行android-sdk-windows中进行 update all时, 报错  folder failed to be renamed or moved...,goole了一下,有外国网友解决办法如下:
    1, 复制 tools目录 为一个新的目录 tools-copy ,此时在android-sdk-windows 目录下有两个目录 tools 和 tools-copy
    2, 在tools-copy目录运行 android.bat ,这样就可以正常 update all 了
    3,之后,关闭 sdk, 
    4, 在 android-sdk-windows 目录运行 SDK Setup.exe, 就可以了
  • 简明教程 C# Webservice实例

    2010-09-13 23:43:43

      下面,我们看看如何建立和部署一个最简单的Web服务,通过C# Webservice实例的一个简单实例,了解如何使用C#创建Webservice。

      建立Web服务

      1.在wwwroot目录下建立一个叫做Webservice的目录。

      2.建立下面这样一个文件:

      1. 〈%@ WebService Language="c#" Class="AddNumbers"%〉  
      2. using System;  
      3. using System.Web.Services;  
      4. public class AddNumbers : WebService  
      5. {  
      6. [WebMethod]  
      7. public int Add(int a, int b){  
      8. int sum;  
      9. sum = a + b;  
      10. return sum;  
      11. }  
      12. }  

      3.将这个文件保存为AddService.asmx(asmx是扩展名),保存到Webservice的目录中

      4.现在我们建立了Web服务,已经准备好客户端使用

      5.现在,你可以用下面的URL访问这个Web服务:

      http://IP地址/Webservice/Addservice.asmx/Add?a=10&b=5

      结果将以XML格式返回。

      在客户机上部署这个服务

      1.在命令行输入:

      WSDL http://IP地址/WebService/MathService.asmx /n:NameSp /out:FileName.cs

      这个操作将建立一个称为FileName.cs的文件

      说明:WSDL 指的是WebServices Description Language ,这个程序在Program Files\Microsoft.NET\FrameworkSDK\Bin 目录中。

      NameSp是我们设置的名字空间的名字,将在后面部署这个服务的客户端的实现代码中使用到。

      2.编译C# Webservice实例

      CSC /t:library /r:system.web.dll /r:system.xml.dll FileName.cs

      上述命令将生成一个dll文件,名字就是上面的asmx文件中的公共类的名字,在我们的例子中,就是:AddNumbers.dll

      3.将生成的dll文件放到部署机的wwwroot\bin目录中。

      在部署机的asp/aspx 中调用这个Web服务

      1. 〈%@ import Namespace = "NameSp" % 〉  
      2. 〈script language = "c#" runat = "server" 〉  
      3. public void Page_Load(object o, EventArgs e){  
      4. int x = 10;  
      5. int y = 5;  
      6. int sum;  
      7. //Instantiating the public class of the webservice  
      8. AddNumbers AN = new AddNumbers();  
      9. sum = AN.Add(x,y);  
      10. string str = sum.ToString();  
      11. response.writeline(str);  
      12. }  
      13. 〈/script 〉   

      至此,我们就完成了一个C# Webservice实例。

  • 私有构造函数的类可以派生子类吗

    2010-08-31 22:29:51

    今天我发现私有构函数的类不仅不能在外部被实例化,而且也不能被继承。
    因为子类在构造的时候先执行子类的构造函数,然后再执行基类的构造函数。但基类的构造函数是私有的话,就无法访问。所以编译的时候就会出错。
    例如:

        public class BaseClass
        {
            private BaseClass()
            {

            }
        }

        public class NewClass : BaseClass
        {
             public NewClass()
            {

            }
        }

    编译时出现:错误 1“BaseClass.BaseClass()”不可访问,因为它受保护级别限制 

    那如果是由多个构造函数哪?其实在子类构造的时候除非你显示调用基类的某个构造函数,否则只会执行基类中的默认构造函数,也就是没有任何参数的那个。
    例如下面的代码就会编译通过了。

        public class BaseClass
        {
            public BaseClass()
            {

            }

            BaseClass(int i)
            {

            }
        }

        public class NewClass : BaseClass
        {

            public NewClass()
            {

            }

            public NewClass(int i)
            {

            }
        }

    也就是说只要基类的默认构造函数不是私有的,就可以被继承了。但是如果你在子类中显式调用了基类的某个私有构造函数还是会编译失败的(错误同上)。
    例如:

        public class BaseClass
        {
            public BaseClass()
            {

            }

            BaseClass(int i)
            {

            }
        }

        public class NewClass : BaseClass
        {

            public NewClass()
            {

            }

            public NewClass(int i):base(i)
            {

            }
        }

    上面的代码中NewClass的第二个构造函数显式调用基类的一个私有构造函数,失败了...

    当然了,私有的构造函数很少用到(单件模式中会用到,只能在类内部构造出实例)

  • lr关联:手工关联和自动关联

    2010-07-07 23:29:09

    lr关联:手工关联和自动关联

    简单的说,每一次执行时都会变动的值,就有可能需要做关联(correlation)。

    VuGen提供二种方式帮助您找出需要做关联(correlation)的值:

    自动关联

    手动关联

    一手工关联

    lr8.0之前的实现原理是:在客户端和服务端之间设置一个proxy,拦截client和server之间的数据,产生脚本,当然是根据所选定的协议和端口.正因为如此,写在脚本中的,我们模拟客户端对服务端的通信数据是死的,有些情况下会失效,所以需要关联.

    所以说,关联(correlation)就是把脚本中某些写死的(hard-coded)数据,转变成是撷取自服务器所送的、动态的、每次都不一样的数据。举个例子,有些服务器和客户端对话的流程是这样的,首先,客户端首先发送一个消息,服务端分配一个sessionid,以后,每次客户端发送消息时,都需要带上这个sessionid.

    关联可以讲是一个特殊的参数化,只是数据来源不同,普通的参数化数据来源于文件\数据库等,关联的数据来源于服务器动态产生.

    要对付这种服务器,我们必须想办法找出这个Session ID到底是什么、位于何处,然后把它撷取下来,放到某个参数中,并且取代掉脚本中有用到Session ID的部分,这样就可以成功骗过服务器.

    关联(correlation)函数

    关联(correlation)会用到下列的函数:

    web_reg_save_param:这是最新版,也是最常用来做关联(correlation)的函数。

    语法:

    web_reg_save_param ( “Parameter Name” , < list of Attributes >, LAST );

    web_create_html_param、web_create_html_param_ex:这二个函数主要是保留作为向前兼容的目的的。建议使用web_reg_save_param函数。

    手动关联的执行过程大致如下:

    使用相同的业务流程与数据,录制二份脚本

    使用WinDiff工具协助找出需要关联的数据

    使用web_reg_save_param函数手动建立关联

    将脚本中有用到关联的数据,以参数取代

    检查脚本哪些地方的错误是因为关联引起的,run time setting中设置data returned by server

    确定哪些数据需要关联

    找出动态数据的左右边界值和出现位置

    脚本中添加web_reg_save_param函数

    在脚本中参数化脚本中的动态值

    校检动态数据

    找位置

    检查脚本哪些地方的错误是因为关联引起的,run time setting中设置data returned by server,运行,肯定出错,查看出错函数,如request form. was not fount错误信息,有可能是因为关联引起的.找到这个函数,我的一次实践是在web_submit_data()函数.

    因为这个sessionid是不同的,所以我们使用相同的操作和数据录制两个脚本,使用tools中的compair with user,比较两个不同的脚本,注意,这个工具是按照action来比较的,同时注意:请忽略lr_thik_time的差异部份,因为lr_thik_time是用来模拟每个步骤之间使用者思考延迟的时间.保存的文件名太长或者有中文的情况下,会出错.

    找出所有不同的地方,再做分析.

    使用web_reg_save_param函数手动建立关联

    web_reg_save_param要放在提交数据的函数之前,是最近的位置.

    在树形图的server中找到web_reg_save_param中要用到的边界

    web_reg_save_param函数主要是透过动态数据的前面和后面的固定字符串,来辨识要撷取的动态数据的,所以我们还需要找出动态数据的边界字符串。这里要注意的是"要用\做转义字符.

    将脚本中有用到关联的数据,以参数取代

    当使用web_reg_save_param建立参数后,接下来就是用“UserSession”参数去取代脚本中写死的(hard-coded)资料。

    “Name=userSession”, “Value=123456879”, ENDITEM,

    换成

    “Name=userSession”, “Value={UserSession}”, ENDITEM,

    语法

    intweb_reg_save_param(const char *ParamName, <list of Attributes>, LAST);

    参数说明

    ParamName:存放动态数据的参数名称

    list of Attributes:其它属性,包含Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert,以及SaveLen。属性值不分大小写,例如Search=all。以下将详细说明每个属性值的意义:

    Notfound:指定当找不到要找的动态数据时该怎么处置。

    Notfound=error:当找不到动态数据时,发出一个错误讯息。假如没设定此属性,此为LoadRunner的默认值。

    Notfound=warning:当找不到动态数据时,不发出错误讯息,只发出警告,脚本也会继续执行下去不会中断。在对脚本除错时,可以使用此属性值。

    LB:动态数据的左边界字符串。此属性质是必须要有的,而且区分大小写。

    RB:动态数据的右边界字符串。此属性质是必须要有的,而且区分大小写。

    RelFrameID:相对于URL而言,欲搜寻的网页的Frame。此属性质可以是All或是数字,而且可有可无。

    Search:搜寻的范围。可以是Headers(只搜寻headers)、Body(只搜寻body部分,不搜寻header)、Noresource(只搜寻body部分,不搜寻header与resource)或是All(搜寻全部范围,此为默认值)。此属性质可有可无。

    ORD:指明从第几次出现的左边界开始才是要撷取的数据。此属性质可有可无,默认值是1。假如值为All,则所有找到符合的数据会储存在数组中。

    SaveOffset:当找到符合的动态数据时,从第几个字符开始才开始储存到参数中。此属性质不可为负数,其默认值为0。

    Convert:可能的值有二种:

    HTML_TO_URL:将HTML-encoded数据转成URL-encoded数据格式

    HTML_TO_TEXT:将HTML-encoded数据转成纯文字数据格式

    SaveLen:从offect开始算起,到指定的长度内的字符串,才储存到参数中。此参数可有可无,默认值是-1,表示储存到结尾整个字符串。

  • HTML-based模式和URL-based模式的区别

    2010-07-07 22:53:52

    在Web(HTTP/HTML)录制中,有2种重要的录制模式。用户该选择那种录制模式呢?
    HTML-mode录制是缺省也是推荐的录制模式。它录制当前网页中的HTML动作。
    在录制会话过程中不会录制所有的资源。在回放时,HTML-mode脚本积极地解析返回的信息来获得要下载的资源。
    HTML-mode是亦称上下文敏感方式因为它只能在先前请求的结果的上下文之内执行。由于许多的HTTP 请求数据都是从内存中取出来的,所以语句必须在正确的前个请求之后执行。
    HTML-mode录制的优点是:
    1.资源从内存中取出且在回放时下载。因此,脚本比其他的录制方式更小且更容易阅读。
    2.由于只有较少的硬编码脚本,因此只有较少的动态数值需要关联。
    3.可以插入图片检查之类的语句以检查结果是否正确。
    4.因为HTML模式回放时需要积极地解析返回的信息,因此它可能会比其他录制模式更加占用资源。然而,HTML模式record/replay有相当大的改善,使得差异最小化且微不足道。

    URL-mode选项指导VuGen录制来自server的所有的请求和资源。它自动录制每一个HTTP资源为URL的步骤。这种录制模式甚至抓取非HTML应用程序,例如applets和非浏览器的应用程序。推荐使用这种录制方式录制以下情况:
    1。录制非browser的应用程序
    2。取得在下载或不下载哪些资源上更好的控制,既然你可以在脚本中修改。
    3。当使用LR6.x时,录制使用applet和/或javascript的浏览器应用程序
    由于URL-模式录制了所有的请求和资源,需要做更多的关联。脚本看起来也会相当的长。
    -------------------------------------

    我发现用这两种模式录制Mercury的网页(http://www.mercury.com/),结果却有很大差别,HTML-based的response time是7.4秒左右,而URL-based的却达到22秒左右。根据MI上面的解释,估计是由于HTML-based模式的资源占用,从内存中读数据引起的。

    参考文章:

    关河http://sitwithwhom.51.net/index.php?job=art&articleid=a_20060410_183517

    [原创]URL-based 方式和 HTML-based方式的差别

    在使用LoadRunner进行WEB脚本录制的时候,很多人不清楚URL-based 方式和 HTML-based方式的差别,以及何种情况下使用何种录制方式,这里给出一个简单的判断方法。
    HTML-based 方式
    HTML-based 方式对每个页面录制形成一条语句,对LoadRunner来说,在该模式下,访问一个页面,首先会与服务器之间建立一个连接获取页面的内容,然后从页面中分解得到其他的元素(component),然后建立几个连接分别获取相应的元素。
    URL-based 方式
    URL-based 方式将每条客户端发出的请求录制成一条语句,对LoadRunner来说,在该模式下,一条语句只建立一个到服务器的连接,LoadRunner提供了web_concurrent_start和web_concurrent_end函数模拟HTML-based的工作方式。
    如何决定选择何种录制方式?
    1、如果应用是WEB应用,首选是HTML-based方式;
    2、如果应用是使用HTTP协议的非WEB应用,首选是URL-based方式;
    3、如果WEB应用中使用了java applet程序,且applet程序与服务器之间存在通讯,选用URL-based方式;
    4、如果WEB应用中使用的javascript、vbscript脚本与服务器之间存在通讯(调用了服务端组件),选用URL-based方式。

  • SQL Server中存储过程与函数的区别

    2010-06-29 21:05:10

    SQL Server用户自定义函数和存储过程有类似的功能,都可以创建捆绑SQL语句,存储在server中供以后使用。这样能够极大地提高工作效率,通过以下的各种做法可以减少编程所需的时间:
      重复使用编程代码,减少编程开发时间。
       隐藏SQL细节,把SQL繁琐的工作留给数据库开发人员,而程序开发员则集中处理高级编程语言。
       维修集中化,可以在一个地方做业务上的逻辑修改,然后让这些修改自动应用到所有相关程序中。
      乍看之下,用户自定义函数和存储过程的功能似乎一摸一样。但是,其实这两者之间还有一些虽然细微但是很重要的差异:
       存储过程是使用EXEC命令独立调用的,而用户自定义函数是在另一个SQL语句中调用的。
      l存储程序是允许用户和程序去使用存储过程,而不是允许其存取表格,这样能够增强程序安全性。与标准的SQL Server相比,存储程序限制用户行动权限方面更为细化。例如,如果你有一个货存表格,每次卖出一个货物收银员都要对表格进行更新一次(从货存中把该货品减去一件)。你可以给收银员设置权限,允许其使用decrement_item存储过程,而不是允许他们有任意修改或村表格的权限。
      函数必须始终返回一个值(一个标量值或一个表格)。而存储过程可以返回一个标量值、一个表值或无需返回值。
    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhangzuohai/archive/2008/11/07/3248831.aspx
  • datalist 和gridview和datagridview区别

    2010-04-28 12:15:23

    griview优点:功能最强大,提供分页,编辑,删除,选择等等很多功能,使用最方便,直接拖拽到页面上,建立新的数据源,点几下鼠标就可以维护一个表的浏览、删除和修改了,而且是分页的哦。(增加我还没搞明白怎么能点几下鼠标就实现,如果您知道请告诉我。)。而且因为模板已经定制好,想自己灵活控制,不太容易。

    缺点:占用系统资源大,他的分页是把整个表的数据取出来,到gridview上分页的,因此如果数据量比较大的时候,速度非常非常慢。效率极低。
    datalist比较好控制样式。。没有自带的分页。。编辑等。。都得自己手写。。

    还有个repeater
    优点:功能简单,效率高,容易灵活控制生成的HTML代码,分页需要自己实现,整体来说,如果用习惯repeater就会喜欢上,适合前台使用。
    datalist处于他们俩之间
    至于什么时候用  取决与你自己的程序。。
  • dataset和datatable的区别

    2010-04-21 17:17:05

    DataSet:数据集。一般包含多个DataTable,用的时候,dataset["表名"]得到DataTable

    DataTable:数据表。
    一:
    SqlDataAdapter da=new SqlDataAdapter(cmd);
    DataTable dt=new DataTable();
    da.Fill(dt);

    -----------------
    直接把数据结果放到datatable中,
    二:
    SqlDataAdapter da=new SqlDataAdapter(cmd);
    DataSet dt=new DataSet();
    da.Fill(dt);
    ----------------
    数据结果放到dataset中,若要用那个datatable,可以这样:dataset[0]
    更常见的用法:
    SqlDataAdapter da=new SqlDataAdapter(cmd);
    DataSet dt=new DataSet();
    da.Fill(dt,"table1");
    用的时候:这样取datatable:

    dataset["table1"]

  • C#使用SqlDataAdapter.Update更新数据库

    2010-04-20 23:34:04

    此处将资料从数据库得出后显在DataGridView上显示。然后变更数据。变更数据的方法在按钮事件中。
        资料显示方法不用多说。
        更新时主要用到SqlCommandBuilder类和SqlDataAdapter.Update()方法。
            SqlCommandBuilder对象负责生成用于更新数据库的SQL语句,不必自己创建这些语句。
            UpDate方法自动遍历DataTable中的行,以找出需要对数据库作出变动。Rows集合中每个DataRow对象都具有属性RowState,可以跟踪此行是否已删除、添加、修改,还是未作变动。所作的任何变化都会反映到数据库中。
        例:更新表中内容:
    using System.Data.SqlClient;
    namespace UpdatingData
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                btnUpdate.Click += new EventHandler(btnUpdate_Click);
                UpdateData();
            }

            string sConnection = "Data Source=scott;Initial Catalog=northwind;Persist Security Info=True;User ID=sa;Password=sa123";
            DataSet dsSet = new DataSet();
            SqlDataAdapter sdaAdapter = null;
            SqlCommandBuilder scbBuilder = null;
            private void UpdateData()
            {
                //建立Connection
                SqlConnection scConnection = new SqlConnection(sConnection);
                //建立Command
                SqlCommand scCommand = scConnection.CreateCommand();
                scCommand.CommandText = "select customerID,contactName from customers";
                //建立Adapter
                sdaAdapter = new SqlDataAdapter(scCommand);
                //该对象负责生成用于更新数据库的SQL语句,不必自己创建这些语句
                scbBuilder = new SqlCommandBuilder(sdaAdapter);
                //得到数据
                sdaAdapter.Fill(dsSet, "customers");
                dgvView.DataSource = dsSet.Tables["customers"];
            }
            void btnUpdate_Click(object sender, EventArgs e)
            {
                //设置值
                dsSet.Tables["customers"].Rows[3]["contactName"] = "Thomas Hardy";
                //更新数据(UpDate方法自动遍历DataTable中的行,以找出需要对数据库作出变动)
                //Rows集合中每个DataRow对象都具有属性RowState,可以跟踪此行是否已删除、添加、修改,还是未作变动。所作的任何变化都会反映到数据库中。
                sdaAdapter.Update(dsSet, "customers");
                dgvView.DataSource = dsSet.Tables["customers"];
            }
        }
    }
    例:在表中增加行
    using System.Data.SqlClient;
    namespace AddingData
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                btnAdd.Click += new EventHandler(btnAdd_Click);
                UpdateData();
            }

            string sConnection = "Data Source=scott;Initial Catalog=northwind;Persist Security Info=True;User ID=sa;Password=sa123";
            DataSet dsSet = new DataSet();
            SqlDataAdapter sdaAdapter = null;
            SqlCommandBuilder scbBuilder = null;
            private void UpdateData()
            {
                //建立Connection
                SqlConnection scConnection = new SqlConnection(sConnection);
                //建立Command
                SqlCommand scCommand = scConnection.CreateCommand();
                scCommand.CommandText = "select customerID,companyName from customers";
                //建立Adapter
                sdaAdapter = new SqlDataAdapter(scCommand);
                //该对象负责生成用于更新数据库的SQL语句,不必自己创建这些语句
                scbBuilder = new SqlCommandBuilder(sdaAdapter);
                //得到数据
                sdaAdapter.Fill(dsSet, "customers");
                dgvView.DataSource = dsSet.Tables["customers"];
            }
            void btnAdd_Click(object sender, EventArgs e)
            {
                AddRow();
            }
            private void AddRow()
            {
                //新建表中的行
                DataRow drRow = dsSet.Tables["customers"].NewRow();
                drRow["customerID"] = "ZaCzi";
                drRow["companyName"] = "Zachary Zithers Ltd.";
                //增加行
                dsSet.Tables["customers"].Rows.Add(drRow);
                //更新表
                sdaAdapter.Update(dsSet, "customers");
               
                //显示
                dgvView.DataSource = dsSet.Tables["customers"];
            }
        }
    }

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/cnming/archive/2009/10/08/4643896.aspx
  • aspx,ascx和ashx使用小结

    2010-04-19 16:38:24

    做asp.net开发的对.aspx,.ascx和.ashx都不会陌生。关于它们,网上有很多文章介绍。“纸上得来终觉浅,绝知此事要躬行”,下面自己总结一下做个笔记。

    1、.aspx

    Web窗体设计页面。Web窗体页由两部分组成:视觉元素(html、服务器控件和静态文本)和该页的编程逻辑(VS中的设计视图和代码视图可分别看到它们对应得文件)。VS将这两个组成部分分别存储在一个单独的文件中。视觉元素在.aspx 文件中创建。

    2、.ascx

    asp.net的用户控件,是作为一种封装了特定功能和行为(这两者要被用在Web应用程序的各种页面上)的Web页面被开发的。一个用户控件包含了html、代码和其他Web或者用户控件的组合,并在Web服务器上以自己的文件格式保存,其扩展名是*.ascx。asp.net里的缺省配置并不允许Web客户端通过url来访问这些文件,但是这个网站的其他页面可以集成这些文件里所包含的功能。

    3、.ashx

    前面两个都太熟悉了,这个才是要讲的重点。

    (1)、使用举例

    .ashx文件是主要用来写web handler的。使用.ashx 可以让你专注于编程而不用管相关的web技术。我们熟知的.aspx是要做html控件树解析的,.aspx包含的所有html实际上是一个类,所有的html都是类里面的成员,这个过程在.ashx是不需要的。ashx必须包含IsReusable属性(这个属性代表是否可复用,通常为true),而如果要在ashx文件用使用Session必须实现IRequiresSessionState接口.

    一个简单的实现修改登录用户密码的示例:

    aspx,ascx和ashx使用小结 - dingtao-wgs - 程序员驿站Code

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Web;

    using System.Web.Security;

    using System.Web.UI;

    using System.Web.UI.WebControls;

    using System.Web.UI.WebControls.WebParts;

    using System.Web.UI.HtmlControls;

    using System.Web.SessionState;

    namespace Test

    {

        public class HandlerTest : IHttpHandler, IRequiresSessionState

        {

            public void ProcessRequest(HttpContext context)

            {

                context.Response.ClearContent();

                context.Response.ContentType = "text/plain";

                context.Response.Cache.SetCacheability(HttpCacheability.NoCache); //无缓存

                string action = context.Request.Params["action"]; //外部请求

                if (action == "modifyPwd") //用户改密码

                {

                    string oldPwd = context.Request.Params["pwd"];

                    //在ashx文件用使用Session必须实现IRequiresSessionState接口

                    //Session["LogedUser"]是登录用户的会话,用户名和密码都是test

                    if (oldPwd.ToUpper() != ((context.Session["LogedUser"]) as Customer).Password.ToUpper()) //用户输入的旧密码和当前登录用户的不相同

                    {

                        context.Response.Write("旧密码输入错误!");

                    }

                    else

                    {

                        context.Response.Write("旧密码输入正确!");

                    }

                }

                context.Response.End();

            }

            public bool IsReusable

            {

                get

                {

                    return true;

                }

            }

        }

    }

    客户端的调用(js和页面部分):

    aspx,ascx和ashx使用小结 - dingtao-wgs - 程序员驿站Code

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ASHXTest.aspx.cs" Inherits="ASHXTest" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">

    <head runat="server">

        <title>mytest</title>

        <script type="text/javascript">

            function $(s) { if (document.getElementById) { return eval('document.getElementById("' + s + '")'); } else { return eval('document.all.' + s); } }

            function createXMLHTTP() {

                var xmlHttp = false;

                var arrSignatures = ["MSXML2.XMLHTTP.5.0", "MSXML2.XMLHTTP.4.0",

                             "MSXML2.XMLHTTP.3.0", "MSXML2.XMLHTTP",

                             "Microsoft.XMLHTTP"];

                for (var i = 0; i < arrSignatures.length; i++) {

                    try {

                        xmlHttp = new ActiveXObject(arrSignatures[i]);

                        return xmlHttp;

                    }

                    catch (oError) {

                        xmlHttp = false; //ignore

                    }

                }

                // throw new Error("MSXML is not installed on your system."); 

                if (!xmlHttp && typeof XMLHttpRequest != 'undefined') {

                    xmlHttp = new XMLHttpRequest();

                }

                return xmlHttp;

            }

            var xmlReq = createXMLHTTP();

            // 发送ajax处理请求(这里简单验证旧密码的有效性)

            function validateOldPwd(oTxt) {

                var url = "/HandlerTest.ashx?action=modifyPwd&pwd=" + escape(oTxt.value); //.ashx文件

                xmlReq.open("get", url, true);

                xmlReq.setRequestHeader("If-Modified-Since", "0");

                xmlReq.onreadystatechange = callBack;

                xmlReq.send(url); // 发送文本

            }

            function callBack() {

                if (xmlReq.readyState == 4) {

                    if (xmlReq.status == 200) {

                        alert(xmlReq.responseText); // 接收文本

                    }

                    else if (xmlReq.status == 404) {

                        alert("Requested URL is not found.");

                    } else if (xmlReq.status == 403) {

                        alert("Access denied.");

                    } else

                        alert("status is " + xmlReq.status);

                }

            }

        </script>

    </head>

    <body>

        <form id="form1" runat="server">

        <div>

            <input id="txtOldPwd" type="text" onblur="validateOldPwd(this)" />

        </div>

        </form>

    </body>

    </html>

    分析:

    a、以前我们通常都是通过一个简单的aspx文件实现的功能,其实通过ashx也可以。

    笔者曾经写过的一篇ajax:数据传输方式简介 ,通过对比,我们发现aspx要将前后台显示和处理逻辑分开,所以就弄成了两个文件,其实,在最终编译的时候,aspx和cs还是会编译到同一个类中去.这中间就要设计html的一些逻辑处理;而ashx不同,它只是简单的对web http请求的直接返回你想要返回的结果.比aspx少处理了html的过程(但是ashx也可以处理html的一些逻辑,只是通常都不这么用)。理论上ashx比aspx要快。

    b、还是在相同的旧文里,我们知道数据传输的几种方式,其实ashx都可以实现(修改ashx文件里context.Response.ContentType 即可),这里不再赘述了。

    (2)、ashx特别适合于生成动态图片,生成动态文本(纯文本,json,xml,javascript等即可)等。

    (3)、.ashx文件有个缺点:它处理控件的回发事件非常麻烦。处理数据的回发,通常都需要一些.aspx页的功能,只有自己手动处理这些功能(还不如直接建一个aspx文件来处理)。所以,一般使用.ashx输出一些不需要回发处理的项目即可。

    4、总结

    aspx-->P(Page)

    ascx-->C(Control)

    ashx-->H(HttpHandler)

    当浏览器访问web服务器,我们最终接收到的还是html文本。浏览器通过渲染引擎解释这些标签,在屏幕上展现出可见的效果。而asp.net不过就是我们应用的一种平台技术来"变相"解释html的,说白了它就是为了提高生产率,它的技术术语再多,本质上还是html范畴内的东西(如果你不通过那些动态页面技术完全利用html和浏览器(当然包括js)技术来实现动态页面效果,那么你会发现效果有了代码量也相当可观).所以说web开发的底层就是一堆的html标签,无论是asp.net还是jsp都是对html某种方式的包装,是html的产物。

  • ADO.NET总结

    2010-04-19 15:32:12

    ASP.NET是通过ADO.NET来访问数据库的

    数据提供者包含4个主要组件:

    Connection:用于连接到数据库或其它数据源。
    Command:用于在数据库中检索、编辑、删除、或插入数据。
    DataReader从数据源提供数据流。这些数据只读(不可修改),我们只能向前经过这些数据。

    -------------------------------------------------------------------------------------

    DataReader对象没有公用的构造函数,所以不能使用DataReader对象的构造函数来创建一个DataReader对象,只能用Command对象中的ExecuteReader方法来创建一个DataReader对象

    ---------------------------------------------------------------------------------------
    DataAdapter:用于将数据源中的数据填充到DataSet中,并将在DataSet中数据的变化返回到数据库中。可以将数据适配器看作是DataSet与数据库之间的桥梁。

    DataSet :数据集,相当于驻留在内存中的数据库

    使用Ado.NET实现以下功能:

    private void Form1_Load(object sender, System.EventArgs e)
      {
       bind();
      }
            //查找用户信息
      void bind()
      {
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");
       SqlDataAdapter sda=new SqlDataAdapter("select * from login",conn);
       DataSet ds=new DataSet();
       sda.Fill(ds,0,0,"login");
       this.dataGrid1.DataSource=ds.Tables["login"];
      }
      
      //Sql语句增加 =====SqlDataAdapter与DataSet组合
      private void button1_Click(object sender, System.EventArgs e)
      {
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");
    //   string username=this.textBox1.Text;
    //   string userpwd=this.textBox2.Text;
       SqlDataAdapter sda=new SqlDataAdapter("insert into login(uname,upwd) values('"+this.textBox1.Text+"','"+this.textBox2.Text+"')",conn);
       DataSet ds=new DataSet();
       sda.Fill(ds,0,0,"login");
       bind();
      }
      //存储过程增加
      private void button5_Click(object sender, System.EventArgs e)
      {
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");
       SqlDataAdapter sda=new SqlDataAdapter("SqlAndProc_Login_Insert",conn);
       sda.SelectCommand.CommandType=CommandType.StoredProcedure;
       sda.SelectCommand.Parameters.Add("@name",this.textBox1.Text);
       sda.SelectCommand.Parameters.Add("@pwd",this.textBox2.Text);
       DataSet ds=new DataSet();
       sda.Fill(ds,0,0,"login");
       bind();
      }
      //Sql语句删除=====SqlDataAdapter与DataSet组合
      private void button2_Click(object sender, System.EventArgs e)
      {
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");
       SqlDataAdapter sda=new SqlDataAdapter("delete from login where uname='"+this.textBox1.Text+"'",conn);
       DataSet ds=new DataSet();
       sda.Fill(ds,"login");
       this.dataGrid1.DataSource=ds.Tables["login"];
       bind();
      }
      //存储过程删除(删除输入的用户名的记录)
      private void button6_Click(object sender, System.EventArgs e)
      {
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");
       SqlDataAdapter sda=new SqlDataAdapter("SqlAndProc_Login_Del",conn);
       sda.SelectCommand.CommandType=CommandType.StoredProcedure;
       sda.SelectCommand.Parameters.Add("@name",this.textBox1.Text);
       DataSet ds=new DataSet();
       sda.Fill(ds,0,0,"login");
       bind();
      }
      //Sql语句查找=====SqlDataAdapter与DataSet组合
      private void button3_Click(object sender, System.EventArgs e)
      {
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");  
       SqlDataAdapter sda=new SqlDataAdapter("select * from login where uname='"+this.textBox1.Text+"'",conn);
       DataSet ds=new DataSet();
       sda.Fill(ds,"login");
       this.dataGrid1.DataSource=ds.Tables["login"];

      }
      //存储过程查找
      private void button7_Click(object sender, System.EventArgs e)
        
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");
       SqlDataAdapter sda=new SqlDataAdapter("SqlAndProc_Login_Select",conn);
       sda.SelectCommand.CommandType=CommandType.StoredProcedure;
       sda.SelectCommand.Parameters.Add("@name",this.textBox1.Text);
       DataSet ds=new DataSet();
       sda.Fill(ds,"login");
       this.dataGrid1.DataSource=ds.Tables["login"]; 
       
       
      }
      //Sql语句修改
      private void button4_Click(object sender, System.EventArgs e)
      {
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");
       conn.Open();
       SqlCommand cmd=new SqlCommand("update login set upwd='"+this.textBox2.Text+"' where uname='"+this.textBox1.Text+"'",conn);
       int i=cmd.ExecuteNonQuery();
       if(i==1)
       {
        MessageBox.Show("密码修改成功!!!");
       }
       conn.Close();
       bind();
      }
      //存储过程修改
      private void button8_Click(object sender, System.EventArgs e)
      {
       SqlConnection conn=new SqlConnection("server=.;database=DBForADO;uid=sa;pwd=;");
       SqlDataAdapter sda=new SqlDataAdapter("SqlAndProc_Login_Update",conn);
       sda.SelectCommand.CommandType=CommandType.StoredProcedure;
       sda.SelectCommand.Parameters.Add("@name",this.textBox1.Text);
       sda.SelectCommand.Parameters.Add("@pwd",this.textBox2.Text);
       DataSet ds=new DataSet();
       sda.Fill(ds,0,0,"login");
       bind();
      }

  • Response.Redirect和Server.Transfer的区别

    2010-04-18 23:38:47

    1、浏览器ASP文件请求->服务器执行->遇到response.redirect语句->服务器发送response.redirect后面的地址给客户机端的浏览器->浏览器请求执行新的地址

    2、浏览器ASP文件请求->服务器执行->遇到Server.Transfer语句->服务器转向新的文件

    切换对象:

    1、Response.Redirect可以切换到任何存在的网页。

    2、Server.Transfer只能切换到同目录或者子目录的网页。

    数据保密:

    1、Response.Redirect后地址会变成跳转后的页面地址。

    2、Server.Transfer后地址不变,隐藏了新网页的地址及附带在地址后边的参数值。具有数据保密功能。

    传递的数据量(网址后附带的参数):

    1、Response.Redirect能够传递的数据以2KB为限。

    2、传递的数据超过2KB时,务必使用Server.Transfer。

    例如,用户可能请求一个这样的页面:

    http://www.domain.com/Cars/Volvo/850/T5/

    服务器在幕后可能转换为:

    http://www.domain.com/Cars/ShowCar.aspx?Make=843&Model=984&Type=7345

    显然,第一个URL更容易理解和在浏览器中输入。它还让用户容易猜出符合相同模式的其他URL。例如,请求下面的页面:

    http://www.domain.com/Cars/Volvo/V70/R/

    最后会出现显示Volvo V70 Rde 正确页面。

     

     

    本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/littlehb/archive/2007/06/01/1634036.aspx

  • DataAdapter类

    2010-04-14 23:14:38

    10.3  使用数据集访问和修改数据

    DataSet对象表示数据源中数据的本地副本,它是Microsoft NET Framework的一个主要创新。DataSet对象本身可用来引用数据源,然而为了担当真正的数据管理工具,DataSet必须能够与数据源交互。为了实现该功能,.NET提供了DataAdapter类。

    10.3.1  DataAdapter类(1)

    1.DataAdapter

    DataAdapter对象充当DataSet和数据源之间用于检索和保存数据的桥梁。DataAdapter类代表用于填充DataSet以及更新数据源的一组数据库命令和一个数据库连接。DataAdapter对象是ADO.NET数据提供程序的组成部分,该数据提供程序还包括连接对象、数据读取器对象和命令对象。

    每个DataAdapter都在DataSet中的单个DataTable对象和SQL语句或存储过程所产生的单个结果集之间交换数据。可以使用DataAdpater在DataSet和数据源之间交换数据。一个常见例子是应用程序将数据从数据库读到DataSet中,然后将DateSet中的更改写回到数据库中。然而,DataAdapter可以从任何数据源中检索和更新数据(不仅仅是数据库),例如从Microsoft BizTalk服务器应用程序将数据读取到DataSet。

    XxxDataAdapter类提供了方便地管理断开式功能性的途径,如图9-12所示。它用于填充数据集,然后以数据集的任何更改来更新相应的数据源。

     
    (点击查看大图)图10-13  XxxDataAdapter对象模型

    DataAdapter是为将查询结果存储到DataSet对象和DataTable对象中而设计的。Command对象使用户能够通过DataReader对象来检查查询结果。DataAdapter对象由一系列Command对象和决定DataAdapter如何与DataSet通信的映射属性的集合组成。

    当使用DataAdapter将查询结果存储到DataSet时,DataAdapter使用Command与数据库进行通信。在内部,DataAdapter使用DataReader读取结果,然后将该结果复制到DataSet的新行中。DataAdapter用来从数据库中读取数据的Command对象存储在DataAdapter对象的SelectCommand属性中。

    DataAdapter对象还有其他一些属性也包含Command对象:InsertCornmand、UpdateCommand和DeleteCommand。DataAdapter使用这些Command对象将保存在DataSet中的更改提交到数据库。

    可以使用数据适配器来填充DataSet,并将数据的更改传送回数据源。

    使用带SQL Server .NET数据提供程序的DataSet的步骤如下:

    (1)创建SqlConnection对象,连接到SQL Server数据库。

    (2)创建SqlDataAdapter对象。该对象包含能够指向4个SqlCommand对象的属性,这些对象指定SQL语句在数据库中进行SELECT、INSERT、DELETE和UPDATE等数据操作。

    (3)创建包含一个或多个表的DataSet对象。

    (4)使用SqlDataAdapter对象,通过调用Fill方法来填充DataSet表。SqlDataAdapter隐式执行包含SELECT语句的SqlCommand对象。

    (5)修改DataSet中的数据。可以通过编程方式来执行修改,或者将DataSet绑定到用户界面控件(例如DataGrid),然后在控件中更改数据。

    (6)在准备将数据更改返回数据库时,可以使用SqlDataAdapter并调用Update方法。SqlDataAdapter对象隐式使用其SqlCommand对象对数据库执行INSERT、DELETE和UPDATE语句。

    2.DataAdapter类的属性和方法

    尽管DataAdapter类包含很多属性和方法,但很可能每次只使用它们的某个子集。使用DataAdapter可对来自数据源的记录进行操作。通过使用4个DataAdapter属性(指定执行某条SQL语句或调用某个存储过程)中的一个,可以指定所要执行的操作。这些属性实际上是SqlCommand或OleDbCommand类的实例对象:

    SelectCommand引用从数据源中检索行的Command对象。

    InsertCommand引用将插入的行从DataSet写入数据源的Command对象。

    UpdateCommand引用将修改的行从DataSet写入数据源的Command对象。

    DeleteCommand引用从数据源中删除行的Command对象。

    使用DataAdapter提供的方法,可以填充DataSet或将DataSet表中的更改传送到相应的数据存储区。这些方法包括:

    Fill。使用SqlDataAdapter(或OleDbDataAdapter)的这个方法,从数据源增加或刷新行,并将这些行放到DataSet表中。Fill方法调用SelectCommand属性所指定的SELECT语句。

    Update。使用DataAdapter对象的这个方法,将DataSet表的更改传送到相应的数据源中。该方法为DataSet的DataTable中每一指定的行调用相应的INSERT、UPDATE或DELETE命令。

  • Executereader & Executenonquery & ExecuteScalar

    2010-04-14 23:06:19

    ExecuteScalar()可以执行SELECT查询,返回的是一个单值,多用于查询聚合值,如函数count(),sum(),比如select count(*) from users,那么用EexcuteScalar就是返回一个int类型的值,该值等于users里面的行数。

    ExecuteNonQuery()这个是用来执行update,insert或delete的操作,返回的值是该命令所影响到的表行数。

    ExecuteReader()返回一个Datareader对象,这个对象的内容就是与命令匹配的所有行。如sqlDatareader read=123.ExecuteReader(),
    又或:Gridview1.Datasoure=123.ExecuteReader()。
  • ASP.NET对象概述

    2010-04-07 22:39:11

    一、Response对象
    Response对象是HttpResponse类的一个实例。该类主要是封装来自ASP.NET操作的HTTP响应信息。
    1.Response对象的属性
       ① BufferOutput
       说明:获取或设置一个值,该值指示是否缓冲输出,并在完成处理整个页之后将其发送
       属性值:如果缓冲了到客户端的输出,则为true;否则为false。默认为true
       ② Cache
       说明:获取Web页的缓存策略(过期时间、保密性、变化子句)
       属性值:包含有关当前响应的缓存策略信息的HttpCachePolicy对象
       ③ Charset
       说明:获取或设置输出流的HTTP字符集
       属性值:输出流的HTTP字符集
       ④ IsClientConnected
       说明:获取一个值,通过该值指示客户端是否仍连接在服务器上
       属性值:如果客户端当前仍在连接,则为true;否则为false
    2.Response对象的方法
       Response对象可以输出信息到客户端,包括直接发送信息给浏览器、重定向浏览器到另一个URL或设置cookie的值。ASP.NET中引用对象方法的语法是“对象名.方法名”。“方法”就是嵌入到对象定义中的程序代码,它定义对象怎样去处理信息。使用嵌入的方法,对象便知道如何去执行任务,而不用提供额外的指令。
       ① Write
       说明:将指定的字符串或表达式的结果写到当前的HTTP输出
       ② End
       说明:停止页面的执行并得到相应结果
       ③ Clear
       说明:用来在不将缓存中的内容输出的前提下,清空当前页的缓存,仅当使用了缓存输出时,才可以利用Clear方法
       ④ Flush
       说明:将缓存中的内容立即显示出来。该方法有一点和Clear方法一样,它在脚本前面没有将Buffer属性设置为True时会出错。和End方法不同的是,该方法调用后,该页面可继续执行
       ⑤ Redirect
       说明:使浏览器立即重定向到程序指定的URL

    二、Request对象
    1.Request对象的属性
       ① QueryString
       说明:获取 HTTP 查询字符串变量集合
       属性值:NameValueCollection对象
       ② Path
       说明:获取当前请求的虚拟路径
       属性值:当前请求的虚拟路径
       ③ UserHostAddress
       说明:获取远程客户端的 IP 主机地址
       属性值:远程客户端的IP地址
       ④ Browser
       说明:获取有关正在请求的客户端的浏览器功能的信息
       属性值:HttpBrowserCapabilities对象
    2.Request对象的方法
       ① BinaryRead
       说明:执行对当前输入流进行指定字节数的二进制读取
       ②MapPath
       说明:为当前请求将请求的URL中的虚拟路径映射到服务器上的物理路径

    Application对象是HttpApplicationState类的一个实例。
    HttpApplicationState类的单个实例,将在客户端第一次从某个特定的ASP.NET应用程序虚拟目录中请求任何URL资源时创建。对于Web服务器上的每个ASP.NET应用程序,都要创建一个单独的实例。然后通过内部Application对象公开对每个实例的引用。Application对象使给定应用程序的所有用户之间共享信息,并且在服务器运行期间持久地保存数据。因为多个用户可以共享一个Application对象,所以必须要有Lock和Unlock方法,以确保多个用户无法同时改变某一属性。Application对象成员的生命周期止于关闭IIS或使用Clear方法清除。
    1.Application对象的属性
       ① AllKeys
       说明:获取HttpApplicationState集合中的访问键
       属性值:HttpApplicationState对象名的字符串数组
       ② Count
       说明:获取HttpApplicationState集合中的对象数
       属性值:集合中的Item对象数。默认为0
    2.Application对象的方法
       ① Add
       说明:新增一个新的Application对象变量
       ② Clear
       说明:清除全部的Application对象变量
       ③ Get
       说明:使用索引关键字或变数名称得到变量值
       ④ GetKey
       说明:使用索引关键字來获取变量名称
       ⑤ Lock
       说明:锁定全部的Application变量
       ⑥ Remove/RemoveAll
       说明:使用变量名称删除一个Application对象/删除全部的Application对象变量
       ⑦ Set
       说明:使用变量名更新一个Application对象变量的內容
       ⑧ UnLock
       说明:解除锁定的Application变量

    四、Session对象
       Session对象是HttpSessionState的一个实例。该类为当前用户会话提供信息,还提供对可用于存储信息的会话范围的缓存的访问,以及控制如何管理会话的方法。
       Session的出现填补了HTTP协议的局限。HTTP协议工作过程是,用户发出请求,服务器端做出响应,这种用户端和服务器端之间的联系都是离散的,非连续的。在HTTP协议中没有什么能够允许服务器端来跟踪用户请求的。在服务器端完成响应用户的请求后,服务器端不能持续与该浏览器保持连接。从网站的观点上看,每一个新的请求都是单独存在的,因此,当用户在多个主页间转换时,就根本无法知道他的身份。
       使用Session对象存储特定用户会话所需的信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。
       当用户请求来自应用程序的Web页时,如果该用户还没有会话,则Web服务器将自动创建一个Session对象。当会话过期或被放弃后,服务器将中止该会话。
       当用户第一次请求给定的应用程序中的aspx文件时,ASP.NET将生成一个SessionID。SessionID是由一个复杂算法生成的号码,它唯一标识每个用户会话。在新会话开始时,服务器将Session ID作为一个cookie存储在用户的Web浏览器中。
       在将SessionID cookie存储于用户的浏览器之后,即使用户请求了另一个.aspx文件,或请求了运行在另一个应用程序中的.aspx文件,ASP.NET仍会重用该cookie跟踪会话。与此相似,如果用户故意放弃会话或让会话超时,然后再请求另一个.aspx文件,那么ASP.NET将以同一个cookie开始新的会话。只有当服务器管理员重新启动服务器,或用户重新启动Web浏览器时,此时存储在内存中的SessionID设置才被清除,用户将会获得新的SessionID   cookie。
       通过重用SessionID cookie,Web应用程序将发送给用户浏览器的cookie数量降为最低。另外,如果用户决定该Web应用程序不需要会话管理,就可以不让Web应用程序跟踪会话和向用户发送SessionID。
       Session对象最常见的一个用法就是存储用户的首选项。例如,如果用户指明不喜欢查看图形,另外其还经常被用在鉴别客户身份的程序中。要注意的是,会话状态仅在支持cookie的浏览器中保留,如果客户关闭了cookies选项,Session也就不能发挥作用了。
       ASP.NET的Sessions非常好用,能够利用Session对象来对Session全面控制,如果需要在一个用户的Session中存储信息,只需要简单地直接调用Session对象就可以了,下面就是个例子:
    Session["Myname"]=Response.form("Username");
    Session["Mycompany"]=Response.form("Usercompany");
       应注意的是,Session对象是与特定用户相联系的。针对某一个用户赋值的Session对象是和其他用户的Session对象完全独立的,不会相互影响。换句话说,这里面针对每一个用户保存的信息是每一个用户自己独享的,不会产生共享情况。
       很明显,对于不同的用户,Session对象的Myname变量和Mycompany变量各自是不同的,当每个人在网站的不同主页间浏览时,这种针对个人的变量会一直保留,这样作为身份认证是十分有效的。
    1.Session对象的属性
       ① Count
       说明:获取会话状态集合中Session对象的个数
       属性值:Session对象的个数
       ② TimeOut
       说明:获取或设置在会话状态提供程序终止会话之前各请求之间所允许的超时期限
       属性值:超时期限(以分钟为单位)
       ③ SessionID
       说明:获取用于标识会话的唯一会话ID
       属性值:会话ID
    2.Session对象的方法
       ① Add
       说明:新增一个Session对象
       ② Clear
       说明:清除会话状态中的所有值
       ③ Remove
       说明:删除会话状态集合中的项
       ④ RemoveAll
       说明:清除所有会话状态值

    三、Server对象
       Server对象是HttpServerUtility的一个实例。该对象提供对服务器上的方法和属性的访问。
    1.Server对象的属性
       ① MachineName
       说明:获取服务器的计算机名称
       属性值:本地计算机的名称
       ② ScriptTimeout
       说明:获取和设置请求超时
       属性值:请求的超时设置(以秒计)
    2.Server对象的方法
       ① CreateObject
       说明:创建COM 对象的一个服务器实例
       ② CreateObjectFromClsid
       说明:创建COM 对象的服务器实例,该对象由对象的类标识符(CLSID)标识
       ③ Execute
       说明:使用另一页执行当前请求
       ④ Transfer
       说明:终止当前页的执行,并为当前请求开始执行新页
       ⑤ HtmlDecode
       说明:对已被编码以消除无效HTML字符的字符串进行解码
       ⑥ HtmlEncode
       说明:对要在浏览器中显示的字符串进行编码
       ⑦ MapPath
       说明:返回与Web服务器上的指定虚拟路径相对应的物理文件路径
       ⑧ UrlDecode
       说明:对字符串进行解码,该字符串为了进行HTTP传输而进行编码并在URL中发送到服务器
       ⑨ UrlEncode
       说明:编码字符串,以便通过URL从Web服务器到客户端进行可靠的HTTP传输 

     

    六、Cookie对象
       Cookie 是一小段文本信息,伴随着用户请求和页面在Web服务器和浏览器之间传递。用户每次访问站点时,Web应用程序都可以读取Cookie包含的信息。
       Cookie跟Session、Application类似,也是用来保存相关信息,但Cookie和其他对象的最大不同是,Cookie将信息保存在客户端,而Session和Application是保存在服务器端。也就是说,无论何时用户连接到服务器,Web站点都可以访问cookie信息。这样,既方便用户的使用,也方便了网站对用户的管理。
       ASP.NET包含两个内部Cookie集合。通过HttpRequest的Cookies集合访问的集合包含通过Cookie标头从客户端传送到服务器的Cookie。通过HttpResponse的Cookies集合访问的集合包含一些新Cookie,这些Cookie在服务器上创建并以Set-Cookie标头的形式传输到客户端。
    1.Cookie对象的属性
       ① Name
       说明:获取或设置Cookie的名称
       属性值:Cookie的名称
       ② Value
       说明:获取或设置Cookie的Value
       属性值:Cookie的Value
       ③ Expires
       说明:获取或设置Cookie的过期日期和时间
       属性值:作为DateTime实例的Cookie过期日期和时间
       ④ Version
       说明:获取或设置此Cookie符合的HTTP状态维护版本
       属性值:此Cookie符合的HTTP状态维护版本
    2.Cookie对象的方法
       ① Add
       说明:新增一个Cookie变量
       ② Clear
       说明:清除Cookie集合内的变量
       ③ Get
       说明:通过变量名或索引得到Cookie的变量值
       ④ GetKey
       说明:以索引值来获取Cookie的变量名称
       ⑤ Remove
       说明:通过Cookie变量名来删除Cookie变量

    七、Cache对象
       对于每个应用程序域均创建该类的一个实例,并且只要对应的应用程序域保持活动,该实例便保持有效。有关此类实例的信息通过HttpContext对象的Cache属性或Page对象的Cache属性来提供。
    1.Cache对象的属性
       ① Count
       说明:获取存储在缓存中的项数。当监视应用程序性能或使用ASP.NET跟踪功能时,此属性可能非常有用
       属性值:存储在缓存中的项数
       ② Item
       说明:获取或设置指定键处的缓存项
       属性值:表示缓存项的键的String对象
    2.Cache对象的方法
       ① Add
       说明:将指定项添加到 Cache 对象,该对象具有依赖项、过期和优先级策略,以及一个委托(可用于在从Cache 移除插入项时通知应用程序)
       ② Get
       说明:从 Cache 对象检索指定项
       ③ Remove
       说明:从应用程序的 Cache 对象移除指定项
       ④ Insert
       说明:向Cache对象插入项。使用此方法的某一版本改写具有相同key参数的现有Cache项
     
  • ASP.NET的ViewState

    2010-04-05 23:09:22

    ViewState是ASP.NET中用来保存WEB控件回传时状态值一种机制。在WEB窗体(FORM)的设置为runat="server",这个窗体(FORM)会被附加一个隐藏的属性_VIEWSTATE。_VIEWSTATE中存放了所有控件在ViewState中的状态值。

    ViewState是类Control中的一个域,其他所有控件通过继承Control来获得了ViewState功能。它的类型是system.Web.UI.StateBag,一个名称/值的对象集合。

    当请求某个页面时,ASP.NET把所有控件的状态序列化成一个字符串,然后做为窗体的隐藏属性送到客户端。当客户端把页面回传时,ASP.NET分析回传的窗体属性,并赋给控件对应的值。当然这些全部是由ASP.NET负责的。

    ASP.NET运行时在名为_VIEWSTATE的隐藏字段上保存控件的值。这个隐藏字段与回送一起被发送到服务器,在那里它解开包装,然后用前面的值重新填充页面里的控件。
     
  • ASP.NET&html的Form表单

    2010-04-05 23:03:49

    Form. 表单:一个页面只能有一个

  • runat=“server”不是必须的,加上后,会在输出的源代码里多了一行
    <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUJNzgzNDMwNTMzZGR/8ZxOm5Tn0sfHNJaqE12hKqqJTQ==" />
    嘿,这不就是传说中的viewstate吗。原来这就是.net中的FORM跟HTML中FORM的区别。
    viewstate是通过HTML控件的name属性来跟踪HTML控件中的数据,这就是为什么在HTML控件中输入数据时也能显示以前曾经输入过的数据。
    假如FORM没有加runat="server"属性的话,HTML控件就不会有这样的效果了。如果FORM加了runat属性,则它的action属性便会失效,或者说action属性值永远为本页。
  • 【action属性】的默认值应该是本页
  • 【method】默认的值是get

==========================================================================================

html Form. 表单:一个页面可以有多个

  • 【action属性】的默认值应该是submit按钮触发到action的指向页面
    表单的动作属性(Action)和确认按钮当用户单击确认按钮时,表单的内容会被传送到另一个文件。表单的动作属性定义了目的文件的文件名。由动作属性定义的这个文件通常会对接收到的输入数据进行相关的处理。
  • 【method】Method的默认值为Get
    在客户端,Get方式在通过URL提交数据;而Post提交后地栏不变。
    在服务器端只能用Request.QueryString来获取Get方式提交来的数据,用Post方式提交的数据只能用Request.Form来获取。
    特别说明
    一般来说,尽量避免使用Get方式提交表单,因为有可能会导致安全问题。比如说在登陆表单中用Get方式,用户输入的用户名和密码将在地址栏中暴露无遗。不过在分页程序中,用Get方式就比用Post好。
    Get把参数添加到action属性指定的地址中,并以锚方式打开。
    Post通过HTTP post处理发送数据。
  • 前台线程与后台线程

    2010-04-03 23:19:08

    .Net的公用语言运行时(Common Language Runtime,CLR)能区分两种不同类型的线程:前台线程和后台线程。这两者的区别就是:应用程序必须运行完所有的前台线程才可以退出;而对于后台线程,应用程序则可以不考虑其是否已经运行完毕而直接退出,所有的后台线程在应用程序退出时都会自动结束。

    .net环境使用Thread建立的线程默认情况下是前台线程,即线程属性IsBackground=false,在进程中,只要有一个前台线程未退出,进程就不会终止。主线程就是一个前台线程。而后台线程不管线程是否结束,只要所有的前台线程都退出(包括正常退出和异常退出)后,进程就会自动终止。一般后台线程用于处理时间较短的任务,如在一个Web服务器中可以利用后台线程来处理客户端发过来的请求信息。而前台线程一般用于处理需要长时间等待的任务,如在Web服务器中的监听客户端请求的程序,或是定时对某些系统资源进行扫描的程序。下面的代码演示了前台和后台线程的区别。

    public static void myStaticThreadMethod()
    {
        Thread.Sleep(3000);
    }
    Thread thread = new Thread(myStaticThreadMethod);
    // thread.IsBackground = true;
    thread.Start()
    如果运行上面的代码,程序会等待3秒后退出,如果将注释去掉,将thread设成后台线程,则程序会立即退出
    要注意的是,必须在调用Start方法之前设置线程的类型,否则一但线程运行,将无法改变其类型
    通过BeginXXX方法运行的线程都是后台线程

    启动了多个线程的程序在关闭的时候却出现了问题,如果程序退出的时候不关闭线程,那么线程就会一直的存在,但是大多启动的线程都是局部变量,不能一一的关闭,如果调用Thread.CurrentThread.Abort()方法关闭主线程的话,就会出现ThreadAbortException 异常,因此这样不行。
    后来找到了这个办法: Thread.IsBackground 设置线程为后台线程。

    msdn对前台线程和后台线程的解释:托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置 Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。例如,通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程。同样,通过将 IsBackground 设置为 false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的 Thread 对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将 Thread.IsBackground 设置为 true,以便进程可以终止。
    所以解决办法就是在主线程初始化的时候,设置:Thread.CurrentThread.IsBackground = true;

    这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结果保存。

  • DataReader与DataSet区别

    2010-04-03 15:40:22

    DataSet表示一个数据集,是数据在内存中的缓存。 可以包括多个表

        DataSet 连接数据库时是非面向连接的。把表全部读到Sql中的缓冲池,并断开于数据库的连接

        DataReader 连接数据库时是面向连接的。读表时,只能向前读取,读完数据后有用户决定是否断开连接。

        分布式系统的数据可能会用dataset做数据载体,因为dataset是保存数据的数据结构,而DataReader不承担保存数据的责任,它只负责从数据源读取数据到本地而已,它不是数据结构,而是网络通讯组件的高层封装。 DataAdapter也只是使用DataReader从数据源读取数据并Add到dataset保存起来而已。假如我们单独使用DataReader也可以把数据写入到业务类或者dataset里。那只是根据业务需要而选择不同的数据载体而已。实际上我们从数据库获得数据都会通过DataReader,只不过DataAdapter把这一切都封装起来了

    DataSet 和 DataReader对象有什么区别?

        DataSet可以离线处理,前后滚动.DataReader不能离线处理,且是只读的向前的,不过速度明显会很快;

        DataSet可以存储数据库各种对象的,比如表触发器等,而DataReader只能存储游标记录  

        DataSet可以更新回原来的数据库,DataReader不行;   

        DataSet可以FORWORD     PREVIUS,而DataReader只能FW;   

        DataReader类似一个只能向前的游标记录集   

        DataSet叫数据集!是ADO.net相对与ADO实现断开式数据库连接性的主要体现!DateReader是一个客户端的只向前游标,两者的应用领域不同!读取数据后!如果要进行比较频繁的改动,可以使用DataSet,并且DataSet也支持串行化,可与xslt结合!进行web开发!   

        DataReader则偏向于快速读取数据!针对数据量比较大的数据可能应用的更加频繁点!

        ADO.NET提供以下两个对象,用于检索关系数据并将其存储在内存中:DataSet和DataReader。DataSet提供一个内存中数据的关系表示形式,一整套包括一些表在内的数据(这些表包含数据、对数据进行排序并约束数据),以及表之间的关系。DataReader提供一个来自数据库的快速、仅向前、只读数据流。

        当使用DataSet时,经常会利用DataAdapter(也可能是CommandBuilder)与数据源进行交互。当使用DataSet时,也可以利用DataView对DataSet中的数据应用排序和筛选。也可以从DataSet继承,创建强类型DataSet,用于将表、行和列作为强类型对象属性公开。

        下列主题包括的信息涉及:使用DataSet或DataReader的最佳时机、如何优化访问它们所包含数据、以及如何优化使用DataAdapter(包括CommandBuilder)和DataView的技巧。

     

    DataSet与DataReader

    当设计应用程序时,要考虑应用程序所需功能的等级,以确定使用DataSet或者是DataReader。

    要通过应用程序执行以下操作,就要使用DataSet:

    r 在结果的多个离散表之间进行导航。

    r 操作来自多个数据源(例如,来自多个数据库、一个XML文件和一个电子表格的混合数据)的数据。

    r 在各层之间交换数据或使用XML Web服务。与DataReader不同的是,DataSet能传递给远程客户端。

    r 重用同样的记录集合,以便通过缓存获得性能改善(例如排序、搜索或筛选数据)。

    r 每条记录都需要执行大量处理。对使用DataReader返回的每一行进行扩展处理会延长服务于DataReader的连接的必要时间,这影响了性能。

    r 使用XML操作对数据进行操作,例如可扩展样式表语言转换(XSLT转换)或XPath查询。

     

    对于下列情况,要在应用程序中使用DataReader:

    r 不需要缓存数据。

    r 要处理的结果集太大,内存中放不下。

    r 一旦需要以仅向前、只读方式快速访问数据。

        注填充DataSet时,DataAdapter使用DataReader。因此,使用DataAdapter取代DataSet提升的性能表现为节省了DataSet占用内存和填充DataSet需要的循环。一般来说,此性能提升只是象征性的,因此,设计决策应以所需功能为基础。


        经常听到有人问这个问题:“在ASP.NET Web应用程序中我应该用DataReader类还是DataSet类呢?”在很多文章以及新闻组的贴子中我经常看到这样的误解,即认为DataReader(SqlDataReader或OleDbDataReader的缩写)比DataSet好。有时候我也会看到相反的说法。事实上,Microsoft创建了这两个数据存取类是因为它们都是我们所需要的。每个类都有其优点和不足,你可以根据应用环境来选择用哪一个。

        本文就两者的选择问题做了很清楚的讲述,可以让你在运用ASP.NET时,在选择DataReader类或DataSet类的方面得到一些指南。在基于客户端的Windows Form应用程序环境下,这些规则可能会改变。我在做这些讲述时,假设你已经用过DataReader和DataSet类了,并对它们很熟悉。

    运用DataReader类 
        下面就是运用DataReader类的理想条件:你读取的数据必须是新的,所以在每次需要数据的时候,你都必须从数据库读取。创建一个DataReader类不会消耗很多内存,不过随着负荷的增加,DataSet上的性能也会很快地提高(参考资源中Visual Studio Magazine中的文章)。 
        你对每行数据的需求很简单。该情况的最好的例子就是简单地将DataReader绑定到一个Web控件,如DataGrid或DropDownList。 
        你只需要从数据库中以只向前的(forward-only) 、只读的形式来存取XML数据。在这种情况下,你可以用SQLCommand对象的ExcecuteXmlReader()方法来得到一个XmlReader类(相当于XML版的DataReader)。这就需要一个运用FOR XML子句的SQL Server查询,或者一个包含有效XML的ntext字段。 
    你计划对数据库进行几个重复的调用,来读取一小块信息。在这种情况下,我们前面提到过的性能数据会有更大的提高。 
        的确,使DataSet类更强大的许多功能只适用于基于客户端的Windows Form应用程序,比如在多个表之间建立关系的功能。在很多情况下,DataSet类都比DataReader类更有优势,而且在有些情况下,你根本就不能用DataReader类。


    运用DataSet类 
        在下面的情况,你应该考虑运用DataSet类: 你构建了一个Web service,它运用的数据是你作为返回值读取的数据。因为DataReader类必须保持到数据库的连接,所以它们不能被序列化到XML中,也不能被发送给一个Web service的调用者。 
        你需要排序或筛选数据。在运用一个DataView对象(呈现为DataTable类的DefaultView属性,它包含一个DataSet类)来排序或筛选数据前,我们先试着用SQL查询(如WHERE和ORDER BY语句)来实现这些功能,并运用更轻量级、更快的DataReader类。然而,有时侯用这种方法是不行的,或者当你需要多次地对数据进行排序或筛选时就不能用DataReader。 
        针对同一请求,你需要多次遍历数据。你只能在DataReader中循环一次。如果你想将多个ServerControl类绑定到同一个数据集,那么选择DataSet就更好。DataReader类不能被绑定到多个ServerControl类,因为它是只向前读取的。在这种情况下,如果要使用DataReader,必须从数据库读取两次数据。 
        你需要存储数据,而后续的页面请求可能会用到的这些数据。如果数据只被请求它的专门的人使用,你可以将DataSet类保存在一个Session变量中。如果数据可以被任何人访问,那么你可以将它保存在一个Application变量中,或保存在Cache中(我建议使用后一种方法,因为它支持时间期限和回调(callback))。因为DataReader类必须一直打开对数据库的连接,而且它一次只能保存一行数据,所以它们不能在跨页面请求中被保存。 
        你需要对一个结果集的每个元素实现特殊的、耗时的功能。例如,如果你从一个数据库读取一列邮政编码,并想通过调用一个Web service来得到每个地区的详细的天气状况信息,那么选择DataSet就会更好。这是因为,当你在用DataReader类时,在关闭DataReader类前,与数据库的连接不会被释放回连接池。在数千页面请求之间潜在的一个很小的延时都会造成Web应用程序的很高的访问量,从而就会消耗完可用的连接。相反,DataSet可以在前端读取所有的数据,并可以马上关闭与数据库的连接,将它返回到连接池,因此其它的页面请求就可以用这个连接了。 
        你需要在一个两维范例中加载并处理XML数据。DataSet类对于XML很有用,因为你可以将DataView用于XML,对根本的数据进行排序和筛选,就同处理一个数据库结果集一样。然而,需要注意的是在System.Xml名字空间中有很多类,你可以将它们用于更复杂的XML操作。 
        你的数据源不是一个数据库。虽然OleDbDataReader可以用于任何OLEDB数据提供者(可能指向一个数据库,也可能不指向一个数据库),但DataSet对象可以从一个XML文件直接加载数据,并动态地解释它的schema。DataSet类也可以将XML数据写回一个数据流或一个文件。


        从上面的讲述我们就可以看到,DataSet类比DataReader类有更多的功能,这就可以让你在更多的情况下运用它们。但这并不意味着你总是在用DataSet类。你需要在ASP.NET中完成的相当大一部分的任务都属于DataReader的范畴。

        尽管如此,毫无疑问,从重要程度或复杂程度的角度来说,DataSet类在很多ASP.NET Web应用程序中都起着很重要的作用。你可以通过明智的缓存来最小化数据库往返,从而降低DataSet类的“性能损害”。DataReader和DataSet都是一个成功的ASP.NET Web应用程序的重要的部件。重要的是,我们需要了解何时、在哪里可以最好的使用它们。

    来源:http://www.cnblogs.com/puke/archive/2007/07/24/829290.html

  • .NET的基本问题:ASPX和ASPX.CS的关系

    2010-03-17 22:47:49

    aspx是前台,表示设计页面,aspx.cs是后台,是代码功能实现,分开来设计是为了代码清晰,功能模块化。

    aspx和对应的.aspx.cs是一个页面一个代码,页面基本上只负责显示格式之类的,而所有的服务器端动作都是在aspx.cs中定义的。也就是说他们其实是一个东西的两面,aspx中所有服务器端控件都可以在对应的aspx.cs中使用,反之亦然,当然也可以定义对应的动作,如果是在IDE中开发的话,不需要你进行任何额外的工作。而在编译之后,aspx.cs变成了bin目录下的dll,而aspx文件没什么变化,发布的时候只需要把aspx和dll带上就可以了,cs文件作为原代码不需要发布出去。

  • 521/3123>

    用户菜单

    我的存档

    数据统计

    RSS订阅

    Open Toolbar