分享

SQL中Case的使用方法(上篇)

 悟静 2012-03-04
Case具有两种格式。简单Case函数和Case搜索函数。
--简单Case函数
CASE sex
         WHEN '1' THEN '男'
         WHEN '2' THEN '女'
ELSE '其他' END
--Case搜索函数
CASE WHEN sex = '1' THEN '男'
         WHEN sex = '2' THEN '女'
ELSE '其他' END

这两种方式,可以实现相同的功能。简单Case函数的写法相对比较简洁,但是和Case搜索函数相比,功能方面会有些限制,比如写判断式。
还有一个需要注意的问题,Case函数只返回第一个符合条件的值,剩下的Case部分将会被自动忽略。
--比如说,下面这段SQL,你永远无法得到“第二类”这个结果
CASE WHEN col_1 IN ( 'a', 'b') THEN '第一类'
         WHEN col_1 IN ('a')       THEN '第二类'
ELSE'其他' END

下面我们来看一下,使用Case函数都能做些什么事情。

一,已知数据按照另外一种方式进行分组,分析。

有如下数据:(为了看得更清楚,我并没有使用国家代码,而是直接用国家名作为Primary Key)
国家(country) 人口(population)
中国 600
美国 100
加拿大 100
英国 200
法国 300
日本 250
德国 200
墨西哥 50
印度 250

根据这个国家人口数据,统计亚洲和北美洲的人口数量。应该得到下面这个结果。
人口
亚洲 1100
北美洲 250
其他 700

想要解决这个问题,你会怎么做?生成一个带有洲Code的View,是一个解决方法,但是这样很难动态的改变统计的方式。
如果使用Case函数,SQL代码如下:
SELECT  SUM(population),
        CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END
FROM    Table_A
GROUP BY CASE country
                WHEN '中国'     THEN '亚洲'
                WHEN '印度'     THEN '亚洲'
                WHEN '日本'     THEN '亚洲'
                WHEN '美国'     THEN '北美洲'
                WHEN '加拿大'  THEN '北美洲'
                WHEN '墨西哥'  THEN '北美洲'
        ELSE '其他' END;

同样的,我们也可以用这个方法来判断工资的等级,并统计每一等级的人数。SQL代码如下;
SELECT
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END salary_class,
        COUNT(*)
FROM    Table_A
GROUP BY
        CASE WHEN salary <= 500 THEN '1'
             WHEN salary > 500 AND salary <= 600  THEN '2'
             WHEN salary > 600 AND salary <= 800  THEN '3'
             WHEN salary > 800 AND salary <= 1000 THEN '4'
        ELSE NULL END;

二,用一个SQL语句完成不同条件的分组。

有如下数据
国家(country) 性别(sex) 人口(population)
中国 1 340
中国 2 260
美国 1 45
美国 2 55
加拿大 1 51
加拿大 2 49
英国 1 40
英国 2 60

按照国家和性别进行分组,得出结果如下
国家
中国 340 260
美国 45 55
加拿大 51 49
英国 40 60

普通情况下,用UNION也可以实现用一条语句进行查询。但是那样增加消耗(两个Select部分),而且SQL语句会比较长。
下面是一个是用Case函数来完成这个功能的例子
SELECT country,
       SUM( CASE WHEN sex = '1' THEN 
                      population ELSE 0 END),  --男性人口
       SUM( CASE WHEN sex = '2' THEN 
                      population ELSE 0 END)   --女性人口
FROM  Table_A
GROUP BY country;

这样我们使用Select,完成对二维表的输出形式,充分显示了Case函数的强大。

三,在Check中使用Case函数。

在Check中使用Case函数在很多情况下都是非常不错的解决方法。可能有很多人根本就不用Check,那么我建议你在看过下面的例子之后也尝试一下在SQL中使用Check。
下面我们来举个例子
公司A,这个公司有个规定,女职员的工资必须高于1000块。如果用Check和Case来表现的话,如下所示
CONSTRAINT check_salary CHECK
           ( CASE WHEN sex = '2'
                  THEN CASE WHEN salary > 1000
                        THEN 1 ELSE 0 END
                  ELSE 1 END = 1 )

如果单纯使用Check,如下所示
CONSTRAINT check_salary CHECK
           ( sex = '2' AND salary > 1000 )

女职员的条件倒是符合了,男职员就无法输入了。
posted @ 2010-04-28 10:41 洞庭小虾 Views(16) Comments(0) Edit

返回为某个会话和作用域中指定的表或视图生成的最新的标识值。

主题链接图标 Transact-SQL 语法约定

IDENT_CURRENT( 'table_name' )
table_name

其标识值被返回的表的名称。table_name 的数据类型为 varchar,无默认值。

numeric(38,0)

出现错误时或调用方没有权限查看对象时,将返回 NULL。

在 SQL Server 2005 中,用户只能查看自己拥有或已被授予权限的安全对象的元数据。这意味着,如果用户对对象没有任何权限,则元数据生成的内置函数(如 IDENT_CURRENT)可能返回 NULL。有关详细信息,请参阅元数据可见性配置元数据可见性故障排除

IDENT_CURRENT 类似于 SQL Server 2000 标识函数 SCOPE_IDENTITY 和 @@IDENTITY。这三个函数都返回最后生成的标识值。但是,上述每个函数中定义的“最后”的作用域和会话有所不同。

  • IDENT_CURRENT 返回为某个会话和用域中的指定表生成的最新标识值。
  • @@IDENTITY 返回为跨所有作用域的当前会话中的某个表生成的最新标识值。
  • SCOPE_IDENTITY 返回为当前会话和当前作用域中的某个表生成的最新标识值。

如果对空表或没有标识列的表调用 IDENT_CURRENT 函数,则该函数返回 NULL。

如果语句和事务失败,它们会更改表的当前标识,从而使标识列中的值出现不连贯现象。即使未提交试图向表中插入值的事务,也永远无法回滚标识值。例如,如果因 IGNORE_DUP_KEY 冲突而导致 INSERT 语句失败,表的当前标识值仍然会增加。

请谨慎使用 IDENT_CURRENT 来预报下一个生成的标识值。由于有其他会话执行的插入,因此实际生成的值可能不同于 IDENT_CURRENT 加上 IDENTITY_SEED。

A. 返回为指定表生成的最后一个标识值

以下示例返回为 AdventureWorks 数据库中的 Person.Address 表生成的最后一个标识值。

USE AdventureWorks;
GO
SELECT IDENT_CURRENT ('Person.Address') AS Current_Identity;
GO

B. 比较 IDENT_CURRENT、@@IDENTITY 和 SCOPE_IDENTITY 返回的标识值

以下示例将显示由 IDENT_CURRENT@@IDENTITYSCOPE_IDENTITY 返回的不同标识值。

USE AdventureWorks;
GO
IF OBJECT_ID(N't6', N'U') IS NOT NULL 
    DROP TABLE t6;
GO
IF OBJECT_ID(N't7', N'U') IS NOT NULL 
    DROP TABLE t7;
GO
CREATE TABLE t6(id int IDENTITY);
CREATE TABLE t7(id int IDENTITY(100,1));
GO
CREATE TRIGGER t6ins ON t6 FOR INSERT 
AS
BEGIN
   INSERT t7 DEFAULT VALUES
END;
GO
--End of trigger definition

SELECT id FROM t6;
--id is empty.

SELECT id FROM t7;
--ID is empty.

--Do the following in Session 1
INSERT t6 DEFAULT VALUES;
SELECT @@IDENTITY;
/*Returns the value 100. This was inserted by the trigger.*/

SELECT SCOPE_IDENTITY();
/* Returns the value 1. This was inserted by the 
INSERT statement two statements before this query.*/

SELECT IDENT_CURRENT('t7');
/* Returns value inserted into t7, that is in the trigger.*/

SELECT IDENT_CURRENT('t6');
/* Returns value inserted into t6. This was the INSERT statement four statements before this query.*/

-- Do the following in Session 2.
SELECT @@IDENTITY;
/* Returns NULL because there has been no INSERT action 
up to this point in this session.*/

SELECT SCOPE_IDENTITY();
/* Returns NULL because there has been no INSERT action 
up to this point in this scope in this session.*/

SELECT IDENT_CURRENT('t7');
/* Returns the last value inserted into t7.*/
posted @ 2010-04-28 10:38 洞庭小虾 Views(387) Comments(0) Edit
    命令行下具体用法如下:  mysqldump -u用戶名 -p密码 -d 數據库名 表名 脚本名;

    1、导出數據库為dbname的表结构(其中用戶名為root,密码為dbpasswd,生成的脚本名為db.sql)
    mysqldump -uroot -pdbpasswd -d dbname >db.sql;

    2、导出數據库為dbname某张表(test)结构
    mysqldump -uroot -pdbpasswd -d dbname test>db.sql;

    3、导出數據库為dbname所有表结构及表數據(不加-d)
    mysqldump -uroot -pdbpasswd  dbname >db.sql;

    4、导出數據库為dbname某张表(test)结构及表數據(不加-d)
    mysqldump -uroot -pdbpasswd dbname test>db.sql;
posted @ 2010-04-28 10:35 洞庭小虾 Views(3400) Comments(0) Edit

1.先说一下ScriptManager控件吧,用过Ajax的都知道他是什么了就不用我多说了吧呵呵!!!
ClientScriptManager csm = this.ClientScript;
csm.RegisterStartupScript(this.GetType(), "sufei", "你好");
这两句可以在当前控件的下面输出一个你好,呵呵,我建议大家以后都有这种方式做,不要再用Response.Write()
它只能用在方法里,"你好"的地方 也可以写成Script代码,不用加头但是呢要在后面加一个对数true
看这个吧 
csm.RegisterStartupScript(this.GetType(), "sufei", "alert('苏飞你好啊fdfd')", true);
csm.RegisterStartupScript(this.GetType(), "sufei", " document.write ('你好可以弹出的啊!!!')", true);

 

下面是Aspx源里的代码,大家复制就可以了

 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ScriptManager.aspx.cs" Inherits="ClientScriptManager_ScriptManager" %>

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

<html xmlns="http://www./1999/xhtml">
<head runat="server">
    <title>苏飞—ScriptManager</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    <!-- AllowCustomErrorsRedirect="false"表示在发生错误时不按Web。Config里家配制的转到相应的错误界面当然True就是是了,也是默认的-->
        <asp:ScriptManager ID="ScriptManager1" runat="server" AllowCustomErrorsRedirect="false">
        </asp:ScriptManager>
        <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode ="Conditional">
        <ContentTemplate>
        <%=DateTime .Now %>
          <asp:Button ID="Button1" runat="server" Text="第一个时间" onclick="Button1_Click"  />
        </ContentTemplate>
        </asp:UpdatePanel>
        <hr />
        <%--在这里是不会弹出对话框的,因为只有UpdatePanel刷新时才会取得值--%>
          <asp:UpdatePanel ID="UpdatePanel2" runat="server" UpdateMode ="Conditional" >
        <ContentTemplate>
        <%=DateTime .Now %>
           <asp:Button ID="Button2" runat="server" Text="第二个时间"
                onclick="Button2_Click"  />
        </ContentTemplate>
        </asp:UpdatePanel>
        <hr/>
        <asp:Button ID="Button3" runat="server" Text="刷新所有" onclick="Button3_Click" />
    </div>
    </form>
</body>
</html>

 

CS下的代码


using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class ClientScriptManager_ScriptManager : System.Web.UI.Page
{
    /// <summary>
    /// 苏飞 2009 03 11
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    //第一个UpdatePanel
    protected void Button1_Click(object sender, EventArgs e)
    {
        //要注册代码的控件是UpdatePanel1
        ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "sufei1", "alert(111)", true);
        //要注册代码的控件是UpdatePanel2
        ScriptManager.RegisterStartupScript(this.UpdatePanel2, this.GetType(), "sufei2", "alert(222)", true);
        //要注册代码的控件是Page下面的代码 不管UpdatePanel会不会刷新都会输出
        //ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "sufei3", "alert(111)", true);
    }

    //第二个UpdatePanel
    protected void Button2_Click(object sender, EventArgs e)
    {
        //要注册代码的控件是UpdatePanel1
        ScriptManager.RegisterStartupScript(this.UpdatePanel1, this.GetType(), "sufei3", "alert(111)", true);
        //要注册代码的控件是UpdatePanel2
        ScriptManager.RegisterStartupScript(this.UpdatePanel2, this.GetType(), "sufei4", "alert(222)", true);
        //throw new Exception("呵呵");
    }
    protected void Button3_Click(object sender, EventArgs e)
    {
        throw new Exception("呵呵");
    }
}

其实怎么说呢,看到这里ClientScriptManager和ScriptManager基本上没有什么区别

但看只是前者是一个控件

ClientScriptManager给出一点代码大家看一下有什么不同吧

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;

public partial class RequiredFieldValidator_Default : System.Web.UI.Page
{
    /// <summary>
    /// 苏飞 2009 03 11
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>

    /*禁止使用Response.Write()方法,因为它会破坏页面的标准(会出现在页面的上方)
     * 破坏了Asp.Net的模型,所有建议大家都不要使用
     * 我们有强大的Page,Control模型就没有必要再用Response.Write()这样的方法,
     * 如果你是一个好的程序员一个负责的程序员您就不要用这个方法
     * 用下面我写的方法来完成 ClientScriptManager csm = this.ClientScript;只能在方法里不能写在类的上方
     * //Response.Write("<script>alert('"+TextBox1 .Text .ToString ().Trim ()+"')</script>");
     */
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //得到一个ClientScriptManager对象
            ClientScriptManager csm = this.ClientScript;
            csm.RegisterOnSubmitStatement(this.GetType(), "sufei1", "return window.confirm('你真的要提交界面吗');");
        }
    }

    //添加数组
    protected void Button1_Click(object sender, EventArgs e)
    {
        //得到一个ClientScriptManager对象
        ClientScriptManager csm = this.ClientScript;
        //这个方法可以在前台注册一个var aa =  new Array(4ghg,2,3);数组
        csm.RegisterArrayDeclaration("aa", "4ghg,2,3");
    }

    //输出一个提示信息
    protected void Button2_Click(object sender, EventArgs e)
    {
        //得到一个ClientScriptManager对象
        ClientScriptManager csm = this.ClientScript;
        // 输出一个提示信息啊后一个参数的意思是是否自动添加JS头
        csm.RegisterClientScriptBlock(this.GetType(), "提示信息", "alert('苏飞你好啊')", true);
        //出现的位置不同上面的是在页面上方显示,而这个是在当前控件的下面显示
        csm.RegisterStartupScript(this.GetType(), "sufei", "alert('苏飞你好啊fdfd')", true);
        csm.RegisterStartupScript(this.GetType(), "sufei", " document.write ('fdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfdfd')", true);
    }

    //导入一个文件
    protected void Button3_Click(object sender, EventArgs e)
    {
        //得到一个ClientScriptManager对象
        ClientScriptManager csm = this.ClientScript;
        csm.RegisterClientScriptInclude("sufei", "../App_Themes/personnel_Css/forum.css");
    }

    //为一个控件添加一个属性
    protected void Button4_Click(object sender, EventArgs e)
    {
        //得到一个ClientScriptManager对象
        ClientScriptManager csm = this.ClientScript;
        csm.RegisterExpandoAttribute(this.Button4.ClientID, "sufei", "苏飞");
        //同时注册一个隐藏的值
        //csm.RegisterHiddenField("kdfjkdfjkdfjlsjfl", "fdklfjldfldkf");

    }
}

posted @ 2010-04-28 10:34 洞庭小虾 Views(468) Comments(0) Edit

服务端:

using System.Net;

using System.Net.Sockets;

using System.Text;

using System.Threading;

        

         Thread mythread ;

         Socket socket;

// 清理所有正在使用的资源。

         protected override void Dispose( bool disposing )

         {

              try

             {               

            socket.Close();//释放资源

            mythread.Abort ( ) ;//中止线程

             }

             catch{ }

 

              if( disposing )

              {

                   if (components != null)

                   {

                       components.Dispose();

                   }

              }

              base.Dispose( disposing );

         }       

         public static IPAddress GetServerIP()

         {

              IPHostEntry ieh=Dns.GetHostByName(Dns.GetHostName());

              return ieh.AddressList[0];

         }

         private void BeginListen()

         {

              IPAddress ServerIp=GetServerIP();

              IPEndPoint iep=new IPEndPoint(ServerIp,8000);

              socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

             

              byte[] byteMessage=new byte[100]; 

              this.label1.Text=iep.ToString();

              socket.Bind(iep); 

//            do

              while(true)

              {

                   try

                   {

                       socket.Listen(5);

                       Socket newSocket=socket.Accept();

                       newSocket.Receive(byteMessage);

 

                       string sTime = DateTime.Now.ToShortTimeString ( ) ;

                       string msg=sTime+":"+"Message from:";

                       msg+=newSocket.RemoteEndPoint.ToString()+Encoding.Default.GetString(byteMessage);

                       this.listBox1.Items.Add(msg);

                      

                   }

                   catch(SocketException ex)

                   {

                       this.label1.Text+=ex.ToString();

                   }

              }

//            while(byteMessage!=null);

         }

         //开始监听

         private void button1_Click(object sender, System.EventArgs e)

         {

              try

              {

                   mythread = new Thread(new ThreadStart(BeginListen));

                   mythread.Start();

 

              }

              catch(System.Exception er)

              {

                   MessageBox.Show(er.Message,"完成",MessageBoxButtons.OK,MessageBoxIcon.Stop);

              }           

         }

 

 

客户端:

 

using System.Net;

using System.Net.Sockets;

using System.Text;

 

         private void button1_Click(object sender, System.EventArgs e)

         {

              BeginSend();      

         }

         private void BeginSend()

         {            

              string ip=this.txtip.Text;

              string port=this.txtport.Text;

 

              IPAddress serverIp=IPAddress.Parse(ip);           

              int serverPort=Convert.ToInt32(port);

              IPEndPoint iep=new IPEndPoint(serverIp,serverPort); 

              byte[] byteMessage; 

//            do

//            {

                   Socket socket=new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);

                   socket.Connect(iep);

             

                   byteMessage=Encoding.ASCII.GetBytes(textBox1.Text);

                   socket.Send(byteMessage);

                   socket.Shutdown(SocketShutdown.Both);

                   socket.Close();

//            }

//            while(byteMessage!=null);

         }

 

posted @ 2010-04-28 10:33 洞庭小虾 Views(24) Comments(0) Edit
posted @ 2010-04-28 10:30 洞庭小虾 Views(20) Comments(0) Edit

如下,经测试得到的执行步骤:

第01步、内容页的 Page_PreInit
第02步、母版页的 Page_Init
第03步、内容页的 Page_Init
第04步、内容页的 Page_InitComplete
第05步、内容页的 Page_PreLoad
第06步、内容页的 Page_Load
第07步、母版页的 Page_Load
第08步、母版页或内容页的 按钮点击等回发事件(Master或Content的Button事件不会同时触发)
第09步、内容页的 Page_LoadComplete
第10步、内容页的 Page_PreRender
第11步、母版页的 Page_PreRender
第12步、内容页的 Page_PreRenderComplete
第13步、内容页的 Page_SaveStateComplete
第14步、母版页的 Page_Unload
第15步、内容页的 Page_Unload

另外,转载一篇:asp.net页面事件执行顺序 (http://www.cnblogs.com/oletan/archive/2008/11/04/1326587.html#1549248

注:为便于理解,你可以这么认为,OnPreInit方法等效于Page_PreInit方法,OnLoad方法等效于Page_Load方法

实际上呢,重写的OnPreInit 方法,其内部调用了上面的Page_PreInit方法,如此类推,重写的OnLoad方法,就是调用了上面的Page_Load方法。

如果在重写的OnLoad方法里,不写base.OnLoad(e)语句,那么Page_Load方法不会执行。

view plaincopy to clipboardprint?
using System;  
using System.Data;  
using System.Configuration;  
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;  
 
public partial class _Default : Page   

    #region OnPreInit 第一步  
    protected override void OnPreInit(EventArgs e)  
    {  
        //检查 IsPostBack 属性来确定是不是第一次处理该页。  
 
        //创建或重新创建动态控件。  
 
        //动态设置主控页。  
 
        //动态设置 Theme 属性。  
 
        //读取或设置配置文件属性值。  
 
        //注意    
        //如果请求是回发请求,则控件的值尚未从视图状态还原。如果在此阶段设置控件属性,则其值可能会在下一事件中被重写。  
   
 
        base.OnPreInit(e);  
    } 
    #endregion 
 
    #region OnInit 第二步  
    protected override void OnInit(EventArgs e)  
    {  
        //在所有控件都已初始化且已应用所有外观设置后引发。使用该事件来读取或初始化控件属性。  
        base.OnInit(e);  
    } 
    #endregion 
 
    #region OnInitComplete 第三步  
    protected override void OnInitComplete(EventArgs e)  
    {  
        //由 Page 对象引发。使用该事件来处理要求先完成所有初始化工作的任务。  
 
        base.OnInitComplete(e);  
    } 
    #endregion 
 
    #region PreLoad 第四步  
    protected override void OnPreLoad(EventArgs e)  
    {  
        //如果需要在 Load 事件之前对页或控件执行处理,请使用该事件。   
 
        //在 Page 引发该事件后,它会为自身和所有控件加载视图状态,然后会处理 Request 实例包括的任何回发数据。  
 
        base.OnPreLoad(e);  
    } 
    #endregion  
 
    #region OnLoad 第五步  
    protected override void OnLoad(EventArgs e)  
    {  
        //Page 在 Page 上调用 OnLoad 事件方法,然后以递归方式对每个子控件执行相同操作,如此循环往复,直到加载完本页和所有控件为止。  
        //使用 OnLoad 事件方法来设置控件中的属性并建立数据库连接。  
 
        base.OnLoad(e);  
    } 
    #endregion 
 
    #region 控件事件 第六步  
    protected void Button1_Click(object sender, EventArgs e)  
    {  
        //用这些事件来处理特定控件事件,如 Button 控件的 Click 事件或 TextBox 控件的 TextChanged 事件。  
 
        //注意    
        //在回发请求中,如果页包含验证程序控件,请在执行任何处理之前检查 Page 和各个验证控件的 IsValid 属性。  
   
 
    } 
    #endregion 
 
    #region OnLoadComplete 第七步  
    protected override void OnLoadComplete(EventArgs e)  
    {  
        //对需要加载页上的所有其他控件的任务使用该事件。  
 
        base.OnLoadComplete(e);  
    } 
    #endregion 
 
    #region OnPreRender 第八步  
    protected override void OnPreRender(EventArgs e)  
    {  
        //在该事件发生前:  
 
        //Page 对象会针对每个控件和页调用 EnsureChildControls。   
 
        //设置了 DataSourceID 属性的每个数据绑定控件会调用 DataBind 方法。有关更多信息,请参见下面的数据绑定控件的数据绑定事件。  
 
        //页上的每个控件都会发生 PreRender 事件。使用该事件对页或其控件的内容进行最后更改。  
 
        base.OnPreRender(e);  
    } 
    #endregion  
 
    #region SaveStateComplete 第九步  
    protected override void OnSaveStateComplete(EventArgs e)  
    {  
        //在该事件发生前,已针对页和所有控件保存了 ViewState。将忽略此时对页或控件进行的任何更改。  
 
        //使用该事件执行满足以下条件的任务:要求已经保存了视图状态,但未对控件进行任何更改。  
 
        base.OnSaveStateComplete(e);  
    } 
    #endregion 
 
    #region Render 第十步  
    //Render  
    //这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。  
 
    //如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。有关更多信息,请参见开发自定义 ASP.NET 服务器控件。  
 
    //用户控件(.ascx 文件)自动合并呈现,因此不需要在代码中显式呈现该控件。 
 
    #endregion 
 
    #region OnUnload 第十一步         
    protected override void OnUnload(EventArgs e)  
    {  
        //该事件首先针对每个控件发生,继而针对该页发生。在控件中,使用该事件对特定控件执行最后清理,如关闭控件特定数据库连接。  
 
        //对于页自身,使用该事件来执行最后清理工作,如:关闭打开的文件和数据库连接,或完成日志记录或其他请求特定任务。  
 
        //注意    
        //在卸载阶段,页及其控件已被呈现,因此无法对响应流做进一步更改。如果尝试调用方法(如 Response.Write 方法),则该页将引发异常。  
   
 
        base.OnUnload(e);  
    } 
    #endregion  

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/youbl/archive/2009/08/28/4492747.aspx

posted @ 2010-04-28 10:28 洞庭小虾 Views(201) Comments(0) Edit

DROP PROCEDURE IF EXISTS pr_pager;
CREATE PROCEDURE pr_pager(

    IN    p_table_name        VARCHAR(1024),      
    IN    p_fields            VARCHAR(1024),      
    IN    p_page_size            INT,              
    IN    p_page_now            INT,              
    IN    p_order_string        VARCHAR(128),      
    IN    p_where_string        VARCHAR(1024),     
    OUT    p_out_rows            INT    
   
)
    NOT DETERMINISTIC
    SQL SECURITY DEFINER
    COMMENT '分页存储过程'
   
BEGIN

    /*定义变量*/
    DECLARE m_begin_row INT DEFAULT 0;
    DECLARE m_limit_string CHAR(64);

    /*构造语句*/   
    SET m_begin_row = (p_page_now - 1) * p_page_size;
    SET m_limit_string = CONCAT(' LIMIT ', m_begin_row, ', ', p_page_size);
   
    SET @COUNT_STRING = CONCAT('SELECT COUNT(*) INTO @ROWS_TOTAL FROM ', p_table_name, ' ', p_where_string);
    SET @MAIN_STRING = CONCAT('SELECT ', p_fields, ' FROM ', p_table_name, ' ', p_where_string, ' ', p_order_string, m_limit_string);

    /*预处理*/
    PREPARE count_stmt FROM @COUNT_STRING;
    EXECUTE count_stmt;
    DEALLOCATE PREPARE count_stmt;
    SET p_out_rows = @ROWS_TOTAL;

    PREPARE main_stmt FROM @MAIN_STRING;
    EXECUTE main_stmt;
    DEALLOCATE PREPARE main_stmt;
   
END

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多