精华内容
下载资源
问答
  • 转载... ... 1)onPullDownRefresh:下拉刷新 监听用户下拉刷新事件。 需要在app.json的window选项中或页面配置中开启enablePullDownRefresh。 可以通过wx.startPullDownRefresh触发下拉刷新,调用...

    转载https://www.cgtblog.com/wx/3297.html
    http://www.4317.org/news/?3373.html
    1)onPullDownRefresh:下拉刷新

    监听用户下拉刷新事件。

    需要在app.json的window选项中或页面配置中开启enablePullDownRefresh。并且可设置backgroundTextStyle 为dark,则刷新时出现的是
    在这里插入图片描述
    可以通过wx.startPullDownRefresh触发下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致。
    当处理完数据刷新后,wx.stopPullDownRefresh可以停止当前页面的下拉刷新。

        "backgroundTextStyle": "dark",
        "enablePullDownRefresh": true
    

    2)onReachBottom:上拉触底

    监听用户上拉触底事件。

    可以在app.json的window选项中或页面配置中设置触发距离onReachBottomDistance。

    在触发距离内滑动期间,本事件只会被触发一次。

    3)onPageScroll:页面滚动

    监听用户滑动页面事件。

    参数为Object,包含以下字段:
    在这里插入图片描述
    4)onShareAppMessage:用户转发
    注意:只有定义了此事件处理函数,右上角菜单才会显示“转发”按钮

    监听用户点击页面内转发按钮( 组件 open-type=“share”)或右上角菜单“转发”按钮的行为,并自定义转发内容。
    自定义转发字段:
    示例代码

    在开发者工具中预览效果

    Page({
      onShareAppMessage: function (res) {
        if (res.from === 'button') {
          // 来自页面内转发按钮
          console.log(res.target)
        }
        return {
          title: '自定义转发标题',
          path: '/page/user?id=123'
        }
      }
    })
    

    onTabItemTap(Object)
    基础库 1.9.0 开始支持,低版本需做兼容处理。

    点击 tab 时触发
    在这里插入图片描述

    页面相关事件处理函数:

    1. onPullDownRefresh与onReachBottom

    onPullDownRefresh下拉刷新事件需要在app.json中window配置项中开启下拉刷新的配置项enablePullDownRefresh。

    onReachBottom上拉触底事件可以在app.json或当前页面的json文件中window配置项中设置onReachBottomDistance的值。

    ①开启下拉刷新,并设置页面上拉触底时距离页面底部的距离

    开启下拉刷新:
    在这里插入图片描述
    设置页面上拉触底时距离页面底部的距离(可以设置的稍大点,理解一下参数的意义):
    在这里插入图片描述
    ②由于需要触发上拉触底事件,因此将tst.wxml页面放一些内容,使页面可以上下拉动。
    在这里插入图片描述
    ③在onPullDownRefresh与onReachBottom事件中,分别输出文字,作为提示
    在这里插入图片描述
    ④下拉刷新事件触发
    在这里插入图片描述
    ⑤上拉触底事件触发
    在这里插入图片描述
    注意:

    1. onReachBottomDistance配置项默认为50。

    2. onReachBottom事件函数在触发距离内滑动期间,本事件只会被触发一次,只有超出范围后再滑动才触发。

    3. onPageScroll页面滚动事件函数

    onPageScroll页面滚动事件,返回页面在垂直方向已滚动的距离。

    ①在onPageScroll事件中,输出滚动的距离(tst.js文件)

    在这里插入图片描述
    ②编译,滚动页面
    在这里插入图片描述
    3. onShareAppMessage用户转发事件
    ①在onShareAppMessage事件中,输出内容并返回标题及路径(tst.js文件)
    在这里插入图片描述
    ②编译,分享触发onShareAppMessage事件
    在这里插入图片描述

    展开全文
  • 应用C#和SQLCLR编写SQL Server用户定义函数 发布日期:2009-05-24作者:郑佐 摘要:文档阐述使用C#和SQLCLR为SQL Server编写用户定义函数,并演示用户定义函数在T-SQL中的应用。文档中实现的Base64编码解码函数和...
    应用C#和SQLCLR编写SQL Server用户定义函数
     
    发布日期:2009-05-24
    作者:郑佐
     
    摘要: 文档阐述使用C#和SQLCLR为SQL Server编写用户定义函数,并演示用户定义函数在T-SQL中的应用。文档中实现的 Base64 编码解码函数和正则表达式函数属于标量值函数,字符串分割函数属于表值函数,而平方平均数函数属于聚合函数。
    环境 要求:SQL Server 2005/2008,Visual Studio 2005/2008,C# 2.0。
     
    本页内容
     
    概述
    微软在推出SQL Server 2005后,实现了对.NET CLR的集成,使得.NET代码可在SQL Server服务器进程中执行。开发人员通过C#和SQLCLR可轻松创建存储过程、用户定义函数、触发器和用户定义类型等功能,改变了以前只能通过T-SQL语言来实现这些功能的局面。作为SQLCLR的典型应用,本文将通过C#编写Base64编码解码函数、正则表达式函数、字符串分割函数以及 平方平均数函数 来演示如何为SQL Server编写 标量值函数、表值函数和聚合函数。
     
    启用SQLCLR
    在讲解具体函数之前,我们先来了解一下如何启用SQLCLR,并通过Visual Studio 2005/2008创建数据库项目,最后部署.NET程序集到SQL Server的过程。
    默认情况下,SQL Server的SQLCLR是禁用的,要使用SQLCLR需要通过sp_configure系统存储过程设置服务器配置选项来启用,下面显示了默认情况下的设置。

    sp_configure 'clr enabled' ;
    name                                minimum     maximum     config_value run_value
    ----------------------------------- ----------- ----------- ------------ -----------
    clr enabled                         0           1           0            0

    下面用T-SQL来启用SQLCLR,并查看修改后的设置信息。

    sp_configure 'clr enabled' , 1;
    GO
    RECONFIGURE ;
    GO
    sp_configure 'clr enabled' ;
    name                                minimum     maximum     config_value run_value
    ----------------------------------- ----------- ----------- ------------ -----------
    clr enabled                         0           1           1            1

    Visual Studio 提供了一个项目模板来建立用于数据库开发的项目,在新建项目中选择Visual C#,然后选择数据库项目,在对话框中设置项目名称为SqlServer.SqlClr.Functions,为项目添加一个C#类文件并命名类名称为UserDefinedFunctions,并添加一个静态公共的HelloSqlClr函数,补充代码结果如下所示。

    using System;
    using System.Data;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
     
    public class UserDefinedFunctions
    {
        [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_HelloSqlClr" )]
        public static SqlString HelloSqlClr(SqlString input)
        {
            return input;
        }
    }

    UserDefinedFunctions 类引用了System.Data.SqlTypes命名空间。System.Data.SqlTypes 命名空间包含了SQL Server 中本地数据类型对应的类型,比如上面的SqlString类型对应于SQL Server的char、nchar、text、ntext、nvarchar、varchar数据类型。这些类提供一种比.NET Framework公共语言运行库(CLR)提供的数据类型更快更安全的替代方案。使用此命名空间中的类有助于防止类型转换错误时出现精度损失的情况。
    UserDefinedFunctions 类还引用了Microsoft.SqlServer.Server命名空间,该命名空间包含将 Microsoft .NET Framework公共语言运行库(CLR)集成到Microsoft SQL Server和SQL Server 数据库引擎进程执行环境时所要用到的类、接口和枚举。上面的代码我们为 HelloSqlClr 指定了SqlFunction特性,并设置Name属性,这使得通过Visual Studio轻松实现托管用户定义函数在SQL Server中的部署。
    如果采用非自动化方式部署需要通过C#编译器编译源代码,并通过T-SQL语言进行程序集安装,最后进行函数注册等步骤。
    下面通过CSC进行C#代码的编译,输出 SqlServer.SqlClr.Functions.dll 程序集。

    csc /target:library /out:SqlServer.SqlClr.Functions.dll UserDefinedFunctions.cs

    通过SQL Server Management Studio执行T-SQL加载SqlServer.SqlClr.Functions.dll程序集到SQL Server中。

    CREATE ASSEMBLY [SqlServer.SqlClr.Functions]
    FROM 'D:/SqlServer SqlClr Solution/SqlServer.SqlClr.Functions/SqlServer.SqlClr.Functions.dll'
    WITH PERMISSION_SET = SAFE

    当程序集安装到SQL Server中后,可以通过以下T-SQL来查看程序集。

    SELECT * FROM sys . assemblies

    下面的T-SQL注册程序集中包含的 HelloSqlClr 函数。

    CREATE FUNCTION [dbo] . [Clr_HelloSqlClr] ( @input [nvarchar] ( 128))
    RETURNS [nvarchar] ( 128) WITH EXECUTE AS CALLER
    AS
    EXTERNAL NAME [SqlServer.SqlClr.Functions] . [UserDefinedFunctions] . [HelloSqlClr]

    以上工作完成后,就可以通过T-SQL来调用用户定义函数了。

    SELECT dbo . Clr_HelloSqlClr ( 'Hello sqlclr' );
    ---------------------------
    Hello sqlclr

     
    本节简单介绍了通过C#实现用户定义函数并部署应用的一般流程,接下去的章节来具体实现几个常用的功能函数,其中 Base64 编码解码函数和正则表达式函数属于标量值函数,字符串分割函数属于表值函数,而平方平均数函数属于聚合函数。
     
    Base64 编码解码函数
    SQL Server 虽然能够通过FOR XML语法间接实现对数据的Base64编码,但到目前为止实际上并没有提供可直接调用Base64编码解码的函数,这不免让人感到意外,不过通过SQLCLR可轻松解决这一问题。
    下面通过C#为UserDefinedFunctions类增加了Base64编码和解码函数。Convert类的ToBase64String和FromBase64String方法很好地发挥了作用,轻松实现了Base64编码和解码操作。
    Base64 编码函数。

    [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_Base64Encode" )]
    public static SqlString Base64Encode(SqlString input)
    {
        if (input.IsNull)
        {
            return new SqlString (null );
        }
        byte [] array = System.Text.Encoding .UTF8.GetBytes(input.Value);
        string result = System.Convert .ToBase64String(array);
        return new SqlString (result);
    }

    Base64 解码函数。

    [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_Base64Decode" )]
    public static SqlString Base64Decode(SqlString input)
    {
        if (input.IsNull)
        {
            return new SqlString (null );
        }
        byte [] array = System.Convert .FromBase64String(input.Value);
        string result = Encoding .UTF8.GetString(array);
        return new SqlString (result);
    }

     
    对SqlServer.SqlClr.Functions项目进行编译,并部署SqlServer.SqlClr.Functions.dll到SQL Server,在SQL Server对象资源管理器对应数据库的标量值函数目录下可以发现增加了Clr_Base64Encode和Clr_Base64Decode函数,通过右键修改菜单查看Clr_Base64Encode函数对应的T-SQL代码。

    ALTER FUNCTION [dbo] . [Clr_Base64Encode] ( @input [nvarchar] ( 4000))
    RETURNS [nvarchar] ( 4000) WITH EXECUTE AS CALLER
    AS
    EXTERNAL NAME [SqlServer.SqlClr.Functions] . [UserDefinedFunctions] . [Base64Encode]

    使用T-SQL进行应用测试。

    SELECT dbo . Clr_Base64Encode ( 'StarCraft|WarCraft|Diablo' ) AS ITEM ;
    SELECT dbo . Clr_Base64Decode ( 'U3RhckNyYWZ0fFdhckNyYWZ0fERpYWJsbw==' ) AS ITEM ;
    ITEM
    -------------------------------------------------------
    U3RhckNyYWZ0fFdhckNyYWZ0fERpYWJsbw==
    ITEM
    -------------------------------------------------------
    StarCraft|WarCraft|Diablo

     
    正则表达式函数
    正则表达式为字符串处理提供了强大的功能,可惜的是目前SQL Server还没有提供对正则表达式的支持。虽然Oracle早期版本中也缺乏对SQL正则表达式支持,不过在Oracle 10g中内建了符合POSIX 标准的正则表达式,增加了REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR和EGEXP_REPLACE四个新函数。本节我们将通过C#和SQLCLR来实现类似的正则表达式函数。
     
    在.NET中使用正则表达式需要用到System.Text.RegularExpressions命名空间中的类型,核心类为Regex,那么我们继续来完善UserDefinedFunctions类,添加正则表达式匹配函数、正则表达式匹配索引函数、正则表达式匹配项函数和正则表达式替换函数这四个函数。
    正则表达式匹配函数。RegexLike函数功能为对字符串进行模式匹配查询,如果匹配成功返回true,失败返回false。函数接收三个参数,分别对应输入字符串,匹配模式,和正则表达式选项,在函数内部通过Regex.IsMatch方法返回匹配结果。

    [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_RegexLike" )]
    public static SqlBoolean RegexLike(SqlString input, SqlString pattern, SqlInt32 options)
    {
        if (input.IsNull || pattern.IsNull)
        {
            return new SqlBoolean (false );
        }
        bool result = Regex .IsMatch(input.Value, pattern.Value, (RegexOptions )options.Value);
        return new SqlBoolean (result);
    }

     
    正则表达式匹配索引函数。RegexMatchIndex函数功能为对字符串进行模式匹配查找,如果存在匹配,返回第一个匹配项的第一个字符的索引,如果不存在返回-1。

    [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_RegexMatchIndex" )]
    public static SqlInt32 RegexMatchIndex(SqlString input, SqlString pattern, SqlInt32 options)
    {
        if (input.IsNull || pattern.IsNull)
        {
            return new SqlInt32 (-1);
        }
        Match match = Regex .Match(input.Value, pattern.Value, (RegexOptions )options.Value);
        if (match.Success)
        {
            return new SqlInt32 (match.Captures[0].Index);
        }
        return new SqlInt32 (-1);
    }

     
    正则表达式匹配项函数。RegexMatchValue函数功能为对字符串进行模式匹配查找,如果存在匹配,返回第一个匹配项的内容,如果不存在,返回空字符串。

    [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_RegexMatchValue" )]
    public static SqlString RegexMatchValue(SqlString input, SqlString pattern, SqlInt32 options)
    {
        if (input.IsNull || pattern.IsNull)
        {
            return SqlString .Null;
        }
        Match match = Regex .Match(input.Value, pattern.Value, (RegexOptions )options.Value);
        if (match.Success)
        {
            return new SqlString (match.Captures[0].Value);
        }
        return SqlString .Null;
    }

     
    正则表达式替换函数。RegexReplace函数功能为对字符串进行模式查找替换,相比前面的函数,增加了一个替换内容参数,内部通过Regex.Replace方法对查找到的匹配使用新的字符串进行替换。

    [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_RegexReplace" )]
    public static SqlString RegexReplace(SqlString input, SqlString pattern, SqlString replacement, SqlInt32 options)
    {
        if (input.IsNull || pattern.IsNull || replacement.IsNull)
        {
            return input;
        }
        string s = Regex .Replace(input.Value, pattern.Value, replacement.Value, (RegexOptions )options.Value);
        return new SqlString (s);
    }

     
    四个正则表达式函数都提供了一个SqlInt32类型的options参数,该参数功能对应.NET中的RegexOptions枚举,RegexOptions带有FlagAttribute特性,也就是说多个不同的枚举值可以组合在一起,因此如果要正确设置Options,需要对RegexOptions进行一些了解,下面是通过NUnit确认的RegexOptions枚举项对应的值,并对枚举组合进行单元测试。

    [Test ]
    public void RegexOptionsTest()
    {
        Assert .AreEqual((int )RegexOptions .None,0);
        Assert .AreEqual((int )RegexOptions .IgnoreCase,1);
        Assert .AreEqual((int )RegexOptions .Multiline,2);
        Assert .AreEqual((int )RegexOptions .ExplicitCapture,4);
        Assert .AreEqual((int )RegexOptions .Compiled,8);
        Assert .AreEqual((int )RegexOptions .Singleline,16);
        Assert .AreEqual((int )RegexOptions .IgnorePatternWhitespace,32);
        Assert .AreEqual((int )RegexOptions .RightToLeft,64);
        Assert .AreEqual((int )RegexOptions .ECMAScript, 256);
        Assert .AreEqual((int )RegexOptions .CultureInvariant,512);
        Assert .AreEqual((int )(RegexOptions .IgnoreCase | RegexOptions .Multiline), 3);
    }

     
    再次对SqlServer.SqlClr.Functions项目进行编译和部署,在SQL Server对象资源管理器对应数据库的标量值函数目录下可以发现增加了Clr_RegexLike、Clr_RegexMatchIndex、Clr_RegexMatchValue和Clr_RegexReplace四个函数。
    为测试正则表达式函数,准备一张GameInfo表并写入一些测试数据。

    CREATE TABLE [dbo] . [GameInfo] (
        [Id] [int] NOT NULL,
        [Name] [nvarchar] ( 32) NOT NULL
    ) ON [PRIMARY]
    GO
     
    INSERT INTO [dbo] . [GameInfo] ( Id , Name ) VALUES ( 1, 'StarCraft' );
    INSERT INTO [dbo] . [GameInfo] ( Id , Name ) VALUES ( 2, 'WarCraft' );
    INSERT INTO [dbo] . [GameInfo] ( Id , Name ) VALUES ( 1, 'Diablo' );

    下面的T-SQL对四个正则表达式函数进行了测试。

    SELECT * FROM dbo . GameInfo WHERE dbo . Clr_RegexLike ( Name , 'Craft$' , 0) = 1;
    Id          Name
    ----------- --------------------------------
    1           StarCraft
    2           WarCraft
     
    SELECT Name , dbo . Clr_RegexMatchIndex ( Name , 'Craft$' , 0) AS MIndex FROM dbo . GameInfo ;
    Name                             MIndex
    -------------------------------- -----------
    StarCraft                        4
    WarCraft                         3
    Diablo                           -1
     
    SELECT Name , dbo . Clr_RegexMatchValue ( Name , 'craft$' , 1) AS MValue FROM dbo . GameInfo ;
    Name                             MValue
    -------------------------------- ------------------------------
    StarCraft                        Craft
    WarCraft                         Craft
    Diablo                           NULL
     
    SELECT Name , dbo . Clr_RegexReplace ( Name , '^StarCraft$' , 'StarCraftII' , 0) AS Name2 FROM dbo . GameInfo ;
    Name                             Name2
    -------------------------------- -------------------------------
    StarCraft                        StarCraftII
    WarCraft                         WarCraft
    Diablo                           Diablo

     
    字符串分割函数
    字符串分割是字符串处理的一项基本功能,在.NET中通过String.Split方法可以轻松实现按特定字符组或字符串组进行的分割,并返回分割后的子字符串数组,当然Regex.Split方法提供了更为强大的分割功能,支持由正则表达式匹配项定义的分割字符串将输入的字符串拆分为一个子字符串数组。相对于.NET提供对字符串处理的强大支持,SQL Server就显得相对乏力,下面就来实现SQLCLR版本的Split函数。
    由于字符串分割后返回的是数组,在SQL Server中体现为多条记录,因而不同于前面的Base64编码解码和正则表达式等标量值函数,Split函数属于表值函数(TVF)。要实现表值函数除了为SqlFuctionAttribute特性设置Name属性外,还需要指定FillRowMethodName和TableDefinition两个属性,FillRowMethodName属性指定行填充方法的名称,而TableDefinition属性定义返回的记录集的表结构,下面显示了完整实现代码。

    [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_Split" , FillRowMethodName = "SplitFillRow" , TableDefinition = "item nvarchar(256)" )]
    public static IEnumerable Split(SqlString input, SqlString separators)
    {
        string [] array;
        if (input.IsNull)
        {
            array = new string [] { null };
        }
        else if (separators.IsNull)
        {
            array = new string [] { input.Value };
        }      
        else
        {
            string [] separatorsArray = separators.Value.Split(new char [] { ',' }, StringSplitOptions .RemoveEmptyEntries);
            array = input.Value.Split(separatorsArray, StringSplitOptions .None);
        }       
        return array;
    }
     
    private static void SplitFillRow(Object obj, ref SqlString item)
    {
        if (obj != null )
        {
            item = (string )obj;
        }
    }

    不难发现表值函数需要返回IEnumerable接口,行填充函数可以指定任意名称,上面的代码还指定数据表只包含一个item列。
    通过Visual Studio对SqlServer.SqlClr.Functions项目进行编译和部署,在SQL Server对象资源管理器对应数据库的表值函数目录下发现增加了Clr_Split函数,通过修改右键菜单查看部署生成的T-SQL代码。

    ALTER FUNCTION [dbo] . [Clr_Split] ( @input [nvarchar] ( 4000), @separators [nvarchar] ( 4000))
    RETURNS  TABLE (
        [item] [nvarchar] ( 256) NULL
    ) WITH EXECUTE AS CALLER
    AS
    EXTERNAL NAME [SqlServer.SqlClr.Functions] . [UserDefinedFunctions] . [Split]

    部署工具对于item列生成nvarchar(4000)数据类型,可以在T-SQL中修改数据长度大小。下面通过两条T-SQL语句对Clr_Split函数进行测试,输出同一结果。

    SELECT * FROM dbo . Clr_Split ( 'StarCraft|WarCraft|Diablo' , '|' );
    SELECT * FROM dbo . Clr_Split ( 'StarCraft|WarCraft//Diablo' , '|,//' );
    item
    -----------------------------
    StarCraft
    WarCraft
    Diablo

     
    下面的C#代码实现了Split函数的另外一个版本,返回的记录集包含两列,除了分割值还增加了分割序号。

    [Microsoft.SqlServer.Server.SqlFunction (Name = "Clr_SplitWithOrder" , FillRowMethodName = "SplitWithOrderFillRow" , TableDefinition = "orderId int, item nvarchar(4000)" )]
    public static IEnumerable SplitWithOrder(SqlString input, SqlString separators)
    {
        Dictionary <int , string > dictionary = new Dictionary <int , string >();
        if (input.IsNull)
        {
            dictionary.Add(1, null );
        }
        else if (separators.IsNull)
        {
            dictionary.Add(1, input.Value);
        }
        else
        {
            string [] separatorsArray = separators.Value.Split(new char [] { ',' }, StringSplitOptions .RemoveEmptyEntries);
            string [] array = input.Value.Split(separatorsArray, StringSplitOptions .None);
            for (int i = 0; i < array.Length; i++)
            {
                dictionary.Add(i + 1, array[i]);
            }
        }       
        return dictionary;
    }
     
    private static void SplitWithOrderFillRow(Object obj, ref SqlInt32 orderid, ref SqlString item)
    {
        if (obj != null )
        {
            KeyValuePair <int , string > kvp = (KeyValuePair <int , string >)obj;
            orderid = kvp.Key;
            item = kvp.Value;
        }
    }

    通过T-SQL对SplitWithOrder函数进行测试。

    SELECT * FROM dbo . Clr_SplitWithOrder ( 'StarCraft|WarCraft//Diablo' , '|,//' ) ORDER BY orderId DESC ;
    orderId     item
    ----------- ----------------------------------------
    3           Diablo
    2           WarCraft
    1           StarCraft

     
    平方平均数函数
    聚合函数的功能是对一组值进行计算并返回单个值。在SQL Server 2005之前,数据库引擎只支持内置聚合函数,例如常见的SUM、MAX、AVG和COUNT等函数,这些聚合函数对一组输入标量值执行操作,并且从该组值生成单个聚合值。在SQL Server 2005版本推出后,SQL Server同.NET CLR集成,使得开发人员能够通过.NET托管代码创建自定义聚合函数,并且使这些函数可应用于T-SQL编程。
    本节,我们通过实现平方平均数函数来讲解如何使用.NET实现聚合函数。在Visual Studio中通过解决方案管理器右键点击SqlServer.SqlClr.Functions项目打开“添加”子菜单选择“聚合”菜单项,项目中会新增加包含聚合函数模板的Aggregate1.cs文件,接下去只需要在模板里面添加代码实现功能逻辑即可。

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    using Microsoft.SqlServer.Server;
     
    [Serializable ]
    [Microsoft.SqlServer.Server.SqlUserDefinedAggregate (Format .Native)]
    public struct Aggregate1
    {  
    public void Init()
        {
        }
        public void Accumulate(SqlString Value)
        {
        }
        public void Merge(Aggregate1 Group)
        {
        }
        public SqlString Terminate()
        {
            return new SqlString ("" );
        }   
        private int var1;
    }

     
    聚合函数模板包含一个Aggregate1结构,该结构除了声明可序列化外还指定了SqlUserDefinedAggregate特性来指示结构类型应如何注册为用户定义的聚合。SqlUserDefinedAggregate的Format属性通过Microsoft.SqlServer.Server.Format枚举来指定聚合的序列化格式,如果在聚合函数中只使用值类型成员,那么可以设置Format属性为Format.Native,如果设置为Format.UserDefined,开发人员需要自己实现Microsoft.SqlServer.Server.IBinarySerialize接口以支持序列化。另外SqlUserDefinedAggregate特性类还包含 IsInvariantToNulls 和IsInvariantToDuplicates等其他属性,关于这些属性功能具体可以参考MSDN。
    Aggregate1 包含4个方法,这是查询处理器计算聚合所用的方法,如果编程人员对BizTalk组件开发比较熟悉,你会发现聚合函数编程类似于BizTalk中的自定义Functoid组件编程。MSDN文档对4个方法进行了具体解释。
    Init 方法。

    public void Init();

    查询处理器使用此方法初始化聚合的计算。对于查询处理器正在聚合的每个组调用此方法一次。查询处理器可以选择重用聚合类的同一实例来计算多个组的聚合。Init 方法应在上一次使用此实例后根据需要执行清除,并允许重新启动新的聚合计算。
    Accumulate 方法。

    public void Accumulate(input_type Value);

    查询处理器使用此方法累计聚合值。对于正在聚合的组中的每个值调用此方法一次。查询处理器仅在为聚合类的指定实例调用Init方法之后才调用此方法。此方法的实现应更新实例的状态以反映正在传递的参数值的累计。input_type参数是托管的 SQL Server 数据类型,该数据类型与CREATE AGGREGATE 语句中input_sqltype 所指定的本机SQL Server数据类型等效。
    Merge 方法。

    public void Merge(Aggregate1 Group);

    此方法可以将此聚合的另一实例与当前实例合并。查询处理器使用此方法合并聚合的多个部分计算。
    Terminate 方法。

    public return_type Terminate();

    此方法完成聚合计算并返回聚合的结果。return_type返回值类型应是托管的SQL Server数据类型,该数据类型是CREATE AGGREGATE语句中指定的return_sqltype 的托管等效类型。
     
    通过以上的介绍,实现平方平均数聚合函数就变得比较简单,修改结构名称为QuadraticMean,并设置两个内部变量, totalValue 变量用来存储输入数据的平方和,而count变量用来存储输入数据的个数,最后通过System.Math.Sqrt方法计算返回平方平均数,下面是实现代码。

    [Serializable ]
    [Microsoft.SqlServer.Server.SqlUserDefinedAggregate (Format .Native,IsInvariantToNulls = true , IsInvariantToDuplicates = false )]
    public struct QuadraticMean
    {
        private double totalValue;
        private int count;
     
        public void Init()
        {
            totalValue = 0.0;
            count = 0;
        }
     
        public void Accumulate(SqlDouble input)
        {
            if (input.IsNull)
            {
                return ;
            }
            totalValue += input.Value * input.Value;
            count++;
        }
     
        public void Merge(QuadraticMean Group)
        {
            totalValue += Group.totalValue;
            count = Group.count;
        }
     
        public SqlDouble Terminate()
        {
            double result = Math .Sqrt(totalValue / count);
            return new SqlDouble (result);
        }
    }

     
    通过Visaul Studio编译和部署项目,在SQL Server对象资源管理器对应数据库的聚合函数目录下发现增加了QuadraticMean函数,查看生成的T-SQL代码。

    CREATE AGGREGATE [dbo] . [QuadraticMean]
    ( @input [float] )
    RETURNS [float]
    EXTERNAL NAME [SqlServer.SqlClr.Functions] . [QuadraticMean]

    结合AVG函数对QuadraticMean函数进行测试。

    SELECT avg ( Id ), dbo . QuadraticMean ( Id ) FROM dbo . GameInfo ;
    ----------- ----------------------
    2           2.16024689946929

     
    总结
    SQL Server 同.NET CLR的紧密集成使得.NET开发人员能够快速实现SQL Server扩展功能编程,一般使用SQLCLR来实现专门执行计算的操作功能,使用T-SQL来实现基于集合的操作功能。该文档全面讲解了如何通过C#和SQLCLR为SQL Server实现标量值、表值和聚合3类用户定义函数,并演示用户定义函数在T-SQL中的实际应用。 Base64 编码解码函数、正则表达式函数、字符串分割函数和平方平均数函数均属于基础函数,可被方便应用到实际业务系统中。

     

    展开全文
  • Android学习——编写菜单

    千次阅读 2009-05-27 12:20:00
    在Android系统中提供了两种形式的菜单:l The Icon Menu这种菜单就是在...l The Expanded Menu展开式菜单,这种菜单不能单独激活,必须是在子菜单中,或者控件的ContextMenu中显示,控件的ContextMenu是在点击

        Android系统中提供了两种形式的菜单:

    l  The Icon Menu

    这种菜单就是在Activity界面展示时我们按下菜单键产生,效果图为:

    这种菜单只能设置图标,快捷方式,不能添加控件。

    l   The Expanded Menu

    展开式菜单,这种菜单不能单独激活,必须是在子菜单中,或者控件的ContextMenu中显示,控件的ContextMenu是在点击控件3秒钟后激活显示,这种菜单上可以增加单选、多选等控件,效果图如下:

     

    菜单的创建方法,是在ActivityView中,都有onCreateOptionsMenu这样的虚函数,可以直接继承,然后在该函数里menu.add()来创建,如下面的代码中加粗的。

        public boolean onCreateOptionsMenu(Menu menu) {

        super.onCreateOptionsMenu(menu);

        // Group ID

        int groupId = 0;

        // The order position of the item

        int menuItemOrder = Menu.NONE;

        // Create the menu item and keep a reference to it.

        MenuItem addMenu = menu.add(groupId, ADD_NEW_TODO,

        menuItemOrder, R.string.addMenu);

       

        MenuItem delMenu = menu.add(groupId, REMOVE_TODO,

                menuItemOrder, R.string.delMenu);

       

        addMenu.setIcon(R.drawable.add);

        delMenu.setIcon(R.drawable.del);

       

        return true;

        }

    菜单创建完后我们可以在onPrepareOptionsMenu(Menu menu)这个继承函数里面根据实际情况来修改菜单的属性,或动态创建。

    同样public void onCreateContextMenu(ContextMenu menu,View v,ContextMenu.ContextMenuInfo menuInfo)这个函数主要用于创建ContextMenu,创建方法一至。

     

       有了创建菜单的方法,我们就想到,这菜单有哪些属性可供我们修改:

    l  setTitle(str):通过这个方法,我们可以设置菜单的显示文字,当然这文字可以是资源编号

    l  setIcon(R.drawable.xxx):设置显示图标,设置值为图标的资源编号

    l  setShortcut(‘0’,’a’):设置菜单快捷健,’0’是数字健盘,’a’是字母健盘上的健

    l  setCheckable(true):这项设置主要是针对radio菜单,checkBox菜单,使用如:

    // Create a new check box item.

    menu.add(0, CHECKBOX_ITEM, Menu.NONE, CheckBox).setCheckable(true);

    // Create a radio button group.

    menu.add(RB_GROUP, RADIOBUTTON_1, Menu.NONE, Radiobutton 1);

    menu.add(RB_GROUP, RADIOBUTTON_2, Menu.NONE, Radiobutton 2);

    menu.add(RB_GROUP, RADIOBUTTON_3, Menu.NONE,

    Radiobutton 3).setChecked(true);

    menu.setGroupCheckable(RB_GROUP, true, true);

     

    好,这些方法也基本够我们用的了,最后我们看一下怎样接受这个菜单的点击事件:

    方法一:

      利用菜单自带的监听器功能,直接监听,就象处理控件事件一样,如:

     menuItem.setOnMenuItemClickListener(new OnMenuItemClickListener() {

    public boolean onMenuItemClick(MenuItem _menuItem) {

    [ ... execute click handling, return true if handled ... ]

    return true;

    }

    });

    方法二:

       ActivityView都直接提供了一个菜单点击统一处理函数,如下:

    public boolean onOptionsItemSelected(MenuItem item) {

    super.onOptionsItemSelected(item);

    // Find which menu item has been selected

    switch (item.getItemId()) {

    // Check for each known menu item

    case (MENU_ITEM):

    [ ... Perform menu handler actions ... ]

    return true;

    }

    // Return false if you have not handled the menu item.

    return false;

    }

    这里通过switch(item.getItemId())来分别处理各个菜单项功能。

     

    了解了这些功能后,就可以试试在我们的程序中加个菜单了。

     

    展开全文
  • ENVI编写函数进行波段运算

    千次阅读 2014-01-16 23:26:24
    波段运算函数编写非常简单,接受输入波段,处理数据,并返回结果。以下面的方式 定义: Function bm_func,b1,[b2,…,bn, parameters and keywords] processing steps return,result end以编写(b1+b2)/ (b1-b2)...

    编写函数有更好的灵活性。

    波段运算函数的编写非常简单,接受输入波段,处理数据,并返回结果。以下面的方式
    定义:

    Function bm_func,b1,[b2,…,bn, parameters and keywords]
    processing steps
    return,result
    end
    以编写(b1+b2)/ (b1-b2)功能为例,编写波段运算函数步骤如下:
    编写函数并保存。

    默认保存在以下路径,也可以进行修改。

    C:\Documents and Settings\Administrator\IDLWorkspace71

    ;函数定义为两个输入波段b1和b2以及一个check关键字
    Function bm_ratio,b1,b2,check=check
    ;计算差值
    den=FLOAT(b1)-b2
    ;如果设置了check关键字,检查被0除问题
    IF(KEYWORD_SET(check)) THEN ptr=WHERE(den EQ 0.,count)$
    ELSE count=0
    IF(count GT 0) THEN den [ptr]=1.0
    ;继续计算比率结果
    result=(FLOAT(b1)+b2)/den
    IF(count GT 0) THEN result[ptr]=0.0
    ;返回结果
    RETURN,result
    END
    编译函数
    编译函数的方法有两种,一是直接编译 pro,一是拷贝函数或保存的 sav 文件到相应的目录下重启 ENVI+IDL。 

    1)  在 ENVI 的主菜单下,选择[File]→[Compile IDL Module],选择函数进行编译;
    2)  把 bm_ratio.pro 或 sav 文件放入 ENVI 安装目录下的..\ envi46\save_add 下,重新启动
    ENVI+IDL 即可。
    3)  执行函数
    在 ENVI 主菜单下,选择[Basic Tools]→[Band Math],在弹出的 BandMath 界面中,在[Enter 
    an Expresion]里面输入函数调用,点击[OK]执行。

    注意:在点击OK执行之前需要先加载影像,否则没有可用波段供选择。

    (5)执行两个波段的比值,不检查是否被0除,在表达式文本框中输入:
    Bm_ratio(b1,b2) 
    (6)执行两个波段的比值,并检查是否被0除,输入下面的式子:
    Bm_ratio(b1,b2,/check) 



    展开全文
  • MATLAB GUI菜单编写

    万次阅读 2018-09-21 10:17:31
    3.写菜单1的回调函数:   菜单2的回调函数: 当写完以后,运行会发现选择菜单2是出现了BUG,菜单2什么东西都没有,原因是出在2个面板成为了 父子关系,解决这个问题就很简单了。 在 项目名_Op...
  • 接下来添加响应函数:对着要添加响应函数菜单右键->添加事件处理程序 来到下面这个界面:(如果还没有添加响应函数的话,底下的添加编辑按钮是可以点击的,我的是已经添加过的,所以变灰) ...
  • 方法/步骤 新建一个基于对话框的MFC工程。 ...在资源视图中,右键单击-->添加 资源-->Menu--新建,并命名ID为IDR_MENU1 ...在具体的菜单项中,右键单击,选择添加事件处理程序 添加编辑后
  • 简要记录在MATLAB的 gui编写中常用的函数知识。 MATLABgui 和mfc有点像,但是比mfc的消息传输机制简单些,MATLAB都是一个控件一个响应。 一个控件可以有call back函数,是最常用的:点击按钮时,按钮下的Callback就...
  • 第二个是你打开这个菜单时,处理这个菜单的状态,比如选中、变灰等等。 比如WINDOWS自带的记事本程序,它的"格式"菜单下有个"自动换行",那么在编写记事本这个程序时,对文本进行自动换行或不自动...
  • 右键菜单编写方法 主要有两种方式: 一、使用GUI工具箱,Tool - Toolbar Editor 进行编辑 二、利用代码编辑,以下主要记录此种方法: 生成fig界面, 生成右键菜单栏,右键菜单栏必须以fig为父对象 fig = ...
  • 创建对话框类和添加控件变量在上一讲中已经讲过,这一讲的主要内容是如何为控件添加消息处理函数。  MFC为对话框和控件等定义了诸多消息,我们对它们操作时会触发消息,这些消息最终由消息处理函数处理。比如...
  • VC6标准WIN32程序,Windows消息处理机制: 1.在注册窗口类时,指定了消息处理函数WndProc()。 2.WinMain()里有消息循环:  while (GetMessage(&msg, NULL, 0, 0))  {  if (!TranslateAccelerator(msg.hwnd...
  • (2)当点击“退出”菜单项时,能结束应用程序。 package rj.com; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class MyFrame exten...
  • vc++ 弹出式菜单的创建和响应函数

    千次阅读 2010-06-08 09:49:00
    vc++制作的弹出式菜单和相应(含源代码) 弹出式菜单其实也是一种菜单,只不过每一个菜单子项是弹出式的。
  • jsTree右键菜单事件

    千次阅读 2018-08-10 15:20:48
    jsTree右键菜单事件 主要步骤详解: 1.导入js文件和css文件 /*导入css文件*/ &amp;lt;link rel=&quot;stylesheet&quot; href=&quot;css/style.min.css&quot;&amp;gt;&amp;lt;/...
  • (20)事件触发的顺序 假如文档中有多个脚本(例如自动执行的脚本),那么他们执行是有一定的顺序的(在HTML文档之中): ①先执行内的标签。因此,这里的js脚本通常是嵌入代码、指向JS文件,可以在这里定义其后...
  • 使用匿名函数(Anonymous Function)和内嵌函数(Nested Function)处理多变量传递问题(Matlab 7.0以上) 问题:有一个多变量函数f(abcx),现需要分别在a=a0b=b0c=c0和a=a1b=b1c=c1的条件下对f(abcx)进行某一操作。 此类...
  • 用c语言编写一个简化的银行自动存款系统;适合刚接触C语言,尝试编写100多行代码的初学者作为参考。该代码编写围绕着银行ATM机器的4个业务;分别是查询、取款、存款、修改密码;其中需要两个文件;一个为DrawMoney....
  • qt5.9.4中菜单栏的编写和设置

    千次阅读 2018-03-31 20:33:17
    首先启动Qt creator(在这里就不讲解Qt安装的过程了,网上有很多很好的教程),如图所示:然后新建一个项目,菜单栏 文件-&gt;New file or Project,如图所示:如图所示,项目选中Application,并在右侧选择Qt ...
  • 最近用到adminLTE模版框架,这是一个好东东,只是在使用中发现点击左侧菜单后,会自动收起,因本人侧重后端django的编写,对前端的js不是很在行,所以就想到<li class='active'>可以让一个菜单保持点击状态 ,...
  • 如何编写ToolBar的ButtonClick事件

    千次阅读 2007-04-25 21:13:00
    1,在编写ToolBar的ButtonClick事件时,可能会产生疑问,因为在vs 2003中ToolBar上button的没有自己的click事件。下面是事件响应函数的框架protected void toolBar1_ButtonClick ( Object sender, ...
  • Java--AWT事件处理机制

    千次阅读 2016-05-27 20:50:00
    1.事件处理机制:GUI程序和用户操作的交互功能; 2.理解3个重要的概念: 事件:用户对组件的一个操作,称之为一个事件; 事件源:发生事件的组件就是事件源; 事件处理器:负责处理事件的方法; 3.事件处理的...
  • 菜单的工作原理及编写应用今天赶了2场酒,累死了,但还是坚持看完了第6课,写了点笔记,大家鼓励鼓励嘛,不要看看就走了1、菜单如果选择了pop-up属性,是不能响应命令的 菜单idm_test--框假类cmainframe--消息command--...
  • 在Visual C++6.0编程环境下,编写MFC界面程序,实现的效果是:点击菜单栏中的“通风”按钮,在图形区域的图形有移动效果。
  • 示例代码下载在MSDN论坛,大量的开发人员经常问道这样一个问题:如何编写.NET代码开发Windows Shell扩展?在.NET 4问世之前,使用.NET...本文介绍如何使用.NET 4编写Windows Shell上下文菜单扩展。相关示例代码奉上。
  • PyQt5 点击会触发两次槽函数

    千次阅读 2020-03-29 23:12:45
    编写 PyQt5 GUI 程序时,定义了一个槽函数,在实际触发过程中会两次触发该槽函数,例子: import sys from PyQt5.QtCore import pyqtSlot from PyQt5.QtWidgets import QApplication, QMainWindow from mainwindow...
  • *如果数据窗口的DoubleClicked事件编写了脚本,那么在数据窗口的C1icked事件中的脚本应该尽量短,否则双击事件中的脚本永远不可能得到执行。一般来说,Cliked中脚本的执行时间和两次击鼠标之间的间隔时间之和,不...
  • 我们这一篇来用JavaScript脚本实现下拉菜单的显示和隐藏。...2)编写显示子菜单showsub()函数:使用getElementsByTagName获取二级菜单项;通过style.display设置二级菜单显示。 3)编写隐藏子菜单hidesub()
  • java实验之GUI标准组件及事件处理

    千次阅读 2018-09-17 21:07:06
    理解和掌握 Java 的事件处理机制。   二、实验环境:   一台配置有java环境,装有eclipse的电脑。   三、实验内容: (写出主要的内容)   实验要求 1. 了解Java图像用户界面的开发,掌握基本组件的使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 63,203
精华内容 25,281
关键字:

编写菜单的单击事件处理函数